def __sanitizeCmd(self, cmd):
     """
     @Name : __sanitizeCmd
     @Desc : Removes None values, Validates all required params are present
     @Input: cmd: Cmd object eg: createPhysicalNetwork
     @Output: Returns command name, asynchronous or not,request payload
              FAILED for failed cases
     """
     try:
         cmd_name = ''
         payload = {}
         required = []
         isAsync = "false"
         for attribute in dir(cmd):
             if not attribute.startswith('__'):
                 if attribute == "isAsync":
                     isAsync = getattr(cmd, attribute)
                 elif attribute == "required":
                     required = getattr(cmd, attribute)
                 else:
                     payload[attribute] = getattr(cmd, attribute)
         cmd_name = cmd.__class__.__name__.replace("Cmd", "")
         for required_param in required:
             if payload[required_param] is None:
                 self.logger.debug(
                     "CmdName: %s Parameter : %s is Required" %
                     (cmd_name, required_param))
                 self.__lastError = InvalidParameterException(
                     "Invalid Parameters")
                 return FAILED
         for param, value in payload.items():
             if value is None:
                 payload.pop(param)
             elif param == 'typeInfo':
                 payload.pop(param)
             elif isinstance(value, list):
                 if len(value) == 0:
                     payload.pop(param)
                 else:
                     if not isinstance(value[0], dict):
                         payload[param] = ",".join(value)
                     else:
                         payload.pop(param)
                         i = 0
                         for val in value:
                             for k, v in val.iteritems():
                                 payload["%s[%d].%s" % (param, i, k)] = v
                             i += 1
         return cmd_name.strip(), isAsync, payload
     except Exception as e:
         self.__lastError = e
         self.logger.\
             exception("__sanitizeCmd: CmdName : "
                       "%s : Exception:%s" % (cmd_name,
                                              GetDetailExceptionInfo(e)))
         return FAILED
示例#2
0
    def marvinRequest(self, cmd, response_type=None, method='GET', data=''):
        """
        @Name : marvinRequest
        @Desc: Handles Marvin Requests
        @Input  cmd: marvin's command from cloudstackAPI
                response_type: response type of the command in cmd
                method: HTTP GET/POST, defaults to GET
        @Output: Response received from CS
                 Exception in case of Error\Exception
        """
        try:
            '''
            1. Verify the Inputs Provided
            '''
            if (cmd is None or cmd == ''):
                self.logger.exception("marvinRequest : Invalid Command Input")
                raise InvalidParameterException("Invalid Parameter")
            '''
            2. Sanitize the Command
            '''
            sanitize_cmd_out = self.__sanitizeCmd(cmd)

            if sanitize_cmd_out == FAILED:
                raise self.__lastError

            cmd_name, is_async, payload = sanitize_cmd_out
            '''
            3. Send Command to CS
            '''
            cmd_response = self.__sendCmdToCS(cmd_name,
                                              self.auth,
                                              payload=payload,
                                              method=method)
            if cmd_response == FAILED:
                raise self.__lastError
            '''
            4. Check if the Command Response received above is valid or Not.
               If not return Invalid Response
            '''
            ret = self.__parseAndGetResponse(cmd_response, response_type,
                                             is_async)
            if ret == FAILED:
                raise self.__lastError
            return ret
        except CloudstackAPIException as e:
            """ CloudstackAPIException might be intentional. We don't log them on a debug level. """
            self.logger.debug("marvinRequest : CmdName: %s Exception: %s" %
                              (self.pretty_printer.pformat(cmd), e))
            raise e
        except Exception as e:
            self.logger.exception("marvinRequest : CmdName: %s Exception: %s" %
                                  (self.pretty_printer.pformat(cmd), e))
            raise e
示例#3
0
 def configureProviders(self, phynetwrk, providers):
     """
     We will enable the virtualrouter elements for all zones. Other
     providers like NetScalers, SRX, etc are explicitly added/configured
     """
     try:
         for provider in providers:
             pnetprov = listNetworkServiceProviders.\
                 listNetworkServiceProvidersCmd()
             pnetprov.physicalnetworkid = phynetwrk.id
             pnetprov.state = "Disabled"
             pnetprov.name = provider.name
             pnetprovres = self.__apiClient.listNetworkServiceProviders(
                 pnetprov)
             if pnetprovres and len(pnetprovres) > 0:
                 if provider.name == 'VirtualRouter'\
                    or provider.name == 'VpcVirtualRouter':
                     vrprov = listVirtualRouterElements.\
                         listVirtualRouterElementsCmd()
                     vrprov.nspid = pnetprovres[0].id
                     vrprovresponse = self.__apiClient.\
                         listVirtualRouterElements(vrprov)
                     vrprovid = vrprovresponse[0].id
                     vrconfig = \
                         configureVirtualRouterElement.\
                         configureVirtualRouterElementCmd()
                     vrconfig.enabled = "true"
                     vrconfig.id = vrprovid
                     self.__apiClient.\
                         configureVirtualRouterElement(vrconfig)
                     self.enableProvider(pnetprovres[0].id)
                 elif provider.name == 'InternalLbVm':
                     internallbprov = listInternalLoadBalancerElements.\
                         listInternalLoadBalancerElementsCmd()
                     internallbprov.nspid = pnetprovres[0].id
                     internallbresponse = self.__apiClient.\
                         listInternalLoadBalancerElements(internallbprov)
                     internallbid = internallbresponse[0].id
                     internallbconfig = \
                         configureInternalLoadBalancerElement.\
                         configureInternalLoadBalancerElementCmd()
                     internallbconfig.enabled = "true"
                     internallbconfig.id = internallbid
                     self.__apiClient.\
                         configureInternalLoadBalancerElement(
                             internallbconfig)
                     self.enableProvider(pnetprovres[0].id)
                 elif provider.name == 'SecurityGroupProvider':
                     self.enableProvider(pnetprovres[0].id)
             elif provider.name in ['Netscaler', 'JuniperSRX', 'F5BigIp']:
                 netprov = addNetworkServiceProvider.\
                     addNetworkServiceProviderCmd()
                 netprov.name = provider.name
                 netprov.physicalnetworkid = phynetwrk.id
                 result = self.__apiClient.addNetworkServiceProvider(
                     netprov)
                 if result.id:
                     self.__tcRunLogger.\
                         debug("==== AddNetworkServiceProvider "
                               "Successful=====")
                     self.__addToCleanUp("NetworkServiceProvider",
                                         result.id)
                 for device in provider.devices:
                     if provider.name == 'Netscaler':
                         dev = addNetscalerLoadBalancer.\
                             addNetscalerLoadBalancerCmd()
                         dev.username = device.username
                         dev.password = device.password
                         dev.networkdevicetype = device.networkdevicetype
                         dev.url = configGenerator.getDeviceUrl(device)
                         dev.physicalnetworkid = phynetwrk.id
                         ret = self.__apiClient.addNetscalerLoadBalancer(
                             dev)
                         if ret.id:
                             self.__tcRunLogger.\
                                 debug("==== AddNetScalerLB "
                                       "Successful=====")
                             self.__addToCleanUp("NetscalerLoadBalancer",
                                                 ret.id)
                     elif provider.name == 'JuniperSRX':
                         dev = addSrxFirewall.addSrxFirewallCmd()
                         dev.username = device.username
                         dev.password = device.password
                         dev.networkdevicetype = device.networkdevicetype
                         dev.url = configGenerator.getDeviceUrl(device)
                         dev.physicalnetworkid = phynetwrk.id
                         ret = self.__apiClient.addSrxFirewall(dev)
                         if ret.id:
                             self.__tcRunLogger.\
                                 debug("==== AddSrx "
                                       "Successful=====")
                             self.__addToCleanUp("SrxFirewall", ret.id)
                     elif provider.name == 'F5BigIp':
                         dev = addF5LoadBalancer.addF5LoadBalancerCmd()
                         dev.username = device.username
                         dev.password = device.password
                         dev.networkdevicetype = device.networkdevicetype
                         dev.url = configGenerator.getDeviceUrl(device)
                         dev.physicalnetworkid = phynetwrk.id
                         ret = self.__apiClient.addF5LoadBalancer(dev)
                         if ret.id:
                             self.__tcRunLogger.\
                                 debug("==== AddF5 "
                                       "Successful=====")
                             self.__addToCleanUp("F5LoadBalancer", ret.id)
                     else:
                         raise InvalidParameterException(
                             "Device %s doesn't match "
                             "any know provider "
                             "type" % device)
                 self.enableProvider(result.id)
     except Exception as e:
         print "Exception Occurred: %s" % GetDetailExceptionInfo(e)
         self.__tcRunLogger.\
             exception("====List Network "
                       "Service Providers Failed=====")
         self.__cleanAndExit()