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
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
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()