BUG#: 8774
authorthilo.boehm <thilo.boehm>
Mon, 7 Jun 2010 11:59:41 +0000 (11:59 +0000)
committerthilo.boehm <thilo.boehm>
Mon, 7 Jun 2010 11:59:41 +0000 (11:59 +0000)
TITLE: Message PGS16800 during provider deregistration.

DESCRIPTION: Disable ProviderManager load at Enable/DisableModuleRequestMessage in BasicProviderManagerRouter.

src/Pegasus/ProviderManagerService/BasicProviderManagerRouter.cpp
src/Pegasus/ProviderManagerService/BasicProviderManagerRouter.h

index 2dd56c5dc568c90f078c3c3197b148dc27b66d63..9433aaead39924cd71ab366a6f8c829b426752df 100644 (file)
@@ -202,6 +202,7 @@ Message* BasicProviderManagerRouter::processMessage(Message * message)
 
     Message* response = 0;
     Boolean remoteNameSpaceRequest=false;
+    Boolean loadProviderManager=true;
 
     //
     // Retrieve the ProviderManager routing information
@@ -233,6 +234,8 @@ Message* BasicProviderManagerRouter::processMessage(Message * message)
         CIMEnableModuleRequestMessage* emReq =
             dynamic_cast<CIMEnableModuleRequestMessage*>(request);
         providerModule = emReq->providerModule;
+        // Do not try to load the provider manager module if not already loaded.
+        loadProviderManager=false;
     }
     else if (request->getType() == CIM_DISABLE_MODULE_REQUEST_MESSAGE)
     {
@@ -240,6 +243,8 @@ Message* BasicProviderManagerRouter::processMessage(Message * message)
         CIMDisableModuleRequestMessage* dmReq =
             dynamic_cast<CIMDisableModuleRequestMessage*>(request);
         providerModule = dmReq->providerModule;
+        // Do not try to load the provider manager module if not already loaded.
+        loadProviderManager=false;
     }
     else if ((request->getType() == CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE) ||
              (request->getType() ==
@@ -306,11 +311,6 @@ Message* BasicProviderManagerRouter::processMessage(Message * message)
         CIMValue itValue = providerModule.getProperty(
             providerModule.findProperty("InterfaceType")).getValue();
         itValue.get(interfaceType);
-        // Get ProviderModule name.
-        String providerModuleName;
-        CIMValue nameValue = providerModule.getProperty(
-            providerModule.findProperty(PEGASUS_PROPERTYNAME_NAME)).getValue();
-        nameValue.get(providerModuleName);
         // Get providerManager path
         String provMgrPath;
         if (request->operationContext.contains(ProviderIdContainer::NAME))
@@ -321,19 +321,28 @@ Message* BasicProviderManagerRouter::processMessage(Message * message)
         }
 
         ProviderManager* pm = 0;
-        Boolean gotError = false;
         try
         {
             // Look up the appropriate ProviderManager by InterfaceType
 
-            pm = _getProviderManager(interfaceType, providerModuleName,
-                provMgrPath);
+            pm = _getProviderManager(
+                    interfaceType,
+                    provMgrPath,
+                    loadProviderManager);
         }
         catch (const CIMException& e)
         {
-            // This is not an error incase of CIMEnableModuleRequestMessage or
-            // CIMDisableModuleRequestMessage. This means there is no provider
-            // to enable or disable.
+            CIMResponseMessage *cimResponse = request->buildResponse();
+            cimResponse->cimException = e;
+            response = cimResponse;
+        }
+
+        // Incase of CIMEnableModuleRequestMessage or 
+        // CIMDisableModuleRequestMessage, there must be not necessarily 
+        // a running provider manager. This is not an error.
+        // This means there is no provider to enable or disable.
+        if (0 == pm)
+        {
             if (request->getType() == CIM_ENABLE_MODULE_REQUEST_MESSAGE)
             {
                 CIMEnableModuleResponseMessage* emResponse =
@@ -351,30 +360,36 @@ Message* BasicProviderManagerRouter::processMessage(Message * message)
                 dmResponse->operationalStatus.append(
                     CIM_MSE_OPSTATUS_VALUE_STOPPED);
                 response = dmResponse;
+            } 
+            else
+            {                
+                CIMResponseMessage* resp = request->buildResponse();
+                resp->cimException = 
+                    PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
+                        "There is no Provider Manager for interfaceType '" +
+                        interfaceType + ". The request message type is '" +
+                        String(MessageTypeToString(request->getType())) + "'");
+
+                PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL1,"%s",
+                    (const char*)resp->cimException.getMessage().getCString()));
+
+                response = resp;
+            }
+        } 
+        else
+        {
+            if ( remoteNameSpaceRequest && !pm->supportsRemoteNameSpaces())
+            {
+                CIMResponseMessage* resp = request->buildResponse();
+                resp->cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
+                 "Remote Namespace operations not supported for interface type "
+                        + interfaceType);
+                response = resp;
             }
             else
             {
-                CIMResponseMessage *cimResponse = request->buildResponse();
-                cimResponse->cimException = e;
-                response = cimResponse;
+                response = pm->processMessage(request);
             }
-            gotError = true;
-        }
-
-        if (!gotError && remoteNameSpaceRequest &&
-            !pm->supportsRemoteNameSpaces())
-        {
-            CIMResponseMessage* resp = request->buildResponse();
-            resp->cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
-                "Remote Namespace operations not supported for interface type "
-                    + interfaceType);
-            response = resp;
-            gotError = true;
-        }
-
-        if (!gotError)
-        {
-            response = pm->processMessage(request);
         }
     }
 
@@ -385,8 +400,8 @@ Message* BasicProviderManagerRouter::processMessage(Message * message)
 // ATTN: May need to add interfaceVersion parameter to further constrain lookup
 ProviderManager* BasicProviderManagerRouter::_getProviderManager(
     const String& interfaceType,
-    const String& providerModuleName,
-    const String& providerManagerPath)
+    const String& providerManagerPath,
+    Boolean loadProviderManager)
 {
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
         "BasicProviderManagerRouter::_getProviderManager");
@@ -400,11 +415,27 @@ ProviderManager* BasicProviderManagerRouter::_getProviderManager(
         ProviderManager* pm = _lookupProviderManager(interfaceType);
         if (pm)
         {
+            PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4,
+                "Provider Manager for interfaceType '%s' already loaded.",
+                (const char*)interfaceType.getCString()));
             PEG_METHOD_EXIT();
             return pm;
         }
     }
 
+    //
+    // If requested, do not load the ProviderManger.
+    // 
+    if (!loadProviderManager)
+    {
+        PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4,
+            "Requested not to load the Provider Manager "
+                "for interfaceType '%s'.",
+            (const char*)interfaceType.getCString()));
+        PEG_METHOD_EXIT();
+        return 0;
+    }
+
     //
     // Load the ProviderManager for this InterfaceType and add it to the table
     //
@@ -414,6 +445,9 @@ ProviderManager* BasicProviderManagerRouter::_getProviderManager(
         ProviderManager* pm = _lookupProviderManager(interfaceType);
         if (pm)
         {
+            PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4,
+                "Provider Manager for interfaceType '%s' already loaded.",
+                (const char*)interfaceType.getCString()));
             PEG_METHOD_EXIT();
             return pm;
         }
@@ -439,6 +473,12 @@ ProviderManager* BasicProviderManagerRouter::_getProviderManager(
         }
 #endif
 
+        PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4,
+            "Crating new Provider Manager for interfaceType '%s', "
+                "providerManagerPath '%s'.",
+            (const char*)interfaceType.getCString(),
+            (const char*)providerManagerPath.getCString()));
+
         ProviderManagerContainer* pmc = new ProviderManagerContainer(
             providerManagerPath,
             interfaceType,
index ac3ce60680ed0a43e0f71914ad45795b10a21448..86e05bbf65df21445eb6ba50b2408de90f6993ba 100644 (file)
@@ -76,9 +76,10 @@ private:
 
    // providerModuleName is used to report the error when ProviderManager
    // can not be found for the interfaceType.
-    ProviderManager* _getProviderManager(const String& interfaceType,
-        const String& providerModuleName,
-        const String& providerManagerPath);
+    ProviderManager* _getProviderManager(
+        const String& interfaceType,
+        const String& providerManagerPath,
+        Boolean loadProviderManager);
     ProviderManager* _lookupProviderManager(const String& interfaceType);
 
     Array<ProviderManagerContainer*> _providerManagerTable;