def run(self): self.app.register_backend(self.srv_type, self.service_backend) if self.reg_srv: self.register_service() # setup shutdown handler for de-registration of service for sig in [signal.SIGTERM, signal.SIGINT, signal.SIGHUP, signal.SIGQUIT]: signal.signal(sig, self.shutdown_handler) up = urlparse(self.stg["service_endpoint"]) dep_port = CONFIG.get("general", "port") if dep_port != "": LOG.warn( "DEPRECATED: parameter general: port in service manager config. " "Service port number (" + str(up.port) + ") is taken from the service manifest" ) if self.DEBUG: from wsgiref.simple_server import make_server httpd = make_server("", int(up.port), self.app) httpd.serve_forever() else: container = wsgi.WSGIContainer(self.app) http_server = httpserver.HTTPServer(container) http_server.listen(int(up.port)) ioloop.IOLoop.instance().start() LOG.info("Service Manager running on interfaces, running on port: " + int(up.port))
def __is_complete(self, url): # XXX copy/paste code - merge the two places! heads = { 'Content-type': 'text/occi', 'Accept': 'application/occi+json', 'X-Auth-Token': self.extras['token'], 'X-Tenant-Name': self.extras['tenant_name'], } LOG.info('Checking app state at: ' + url) LOG.info('Sending headers: ' + heads.__repr__()) r = http_retriable_request('GET', url, headers=heads, authenticate=True) attrs = json.loads(r.content) if len(attrs['attributes']) > 0: attr_hash = attrs['attributes'] app_state = '' try: app_state = attr_hash['occi.app.state'] except KeyError: pass LOG.info('Current service state: ' + str(app_state)) if app_state == 'active': LOG.info('App is ready') return True else: LOG.info('App is not ready. Current state state: ' + app_state) return False
def run(self): self.start_time = time.time() infoDict = { 'sm_name': self.entity.kind.term, 'phase': 'init', 'phase_event': 'start', 'response_time': 0, } LOG.debug(json.dumps(infoDict)) self.entity.attributes['mcn.service.state'] = 'initialise' # Do init work here self.entity.extras = {} self.entity.extras['loc'] = 'foobar' self.entity.extras['tenant_name'] = self.extras['tenant_name'] elapsed_time = time.time() - self.start_time infoDict = { 'sm_name': self.entity.kind.term, 'phase': 'init', 'phase_event': 'done', 'response_time': elapsed_time, } LOG.debug(json.dumps(infoDict)) return self.entity, self.extras
def run(self): # 1. dispose the active SO, essentially kills the STG/ITG # 2. dispose the resources used to run the SO # example request to the SO # curl -v -X DELETE http://localhost:8051/orchestrator/default \ # -H 'X-Auth-Token: '$KID \ # -H 'X-Tenant-Name: '$TENANT url = HTTP + self.host + '/orchestrator/default' heads = { 'X-Auth-Token': self.extras['token'], 'X-Tenant-Name': self.extras['tenant_name'] } occi_attrs = self.extras['srv_prms'].service_parameters(self.state) if len(occi_attrs) > 0: LOG.info( 'Adding service-specific parameters to call... X-OCCI-Attribute:' + occi_attrs) heads['X-OCCI-Attribute'] = occi_attrs LOG.info('Disposing service orchestrator with: ' + url) LOG.info('Sending headers: ' + heads.__repr__()) http_retriable_request('DELETE', url, headers=heads) url = self.nburl + self.entity.identifier.replace( '/' + self.entity.kind.term + '/', '/app/') heads = { 'Content-Type': 'text/occi', 'X-Auth-Token': self.extras['token'], 'X-Tenant-Name': self.extras['tenant_name'] } LOG.info('Disposing service orchestrator container via CC... ' + url) LOG.info('Sending headers: ' + heads.__repr__()) http_retriable_request('DELETE', url, headers=heads, authenticate=True) return self.entity, self.extras
def __ensure_ssh_key(self): url = self.nburl + '/public_key/' heads = {'Accept': 'text/occi'} resp = http_retriable_request('GET', url, headers=heads, authenticate=True) locs = resp.headers.get('x-occi-location', '') # Split on spaces, test if there is at least one key registered if len(locs.split()) < 1: LOG.debug('No SM SSH registered. Registering default SM SSH key.') occi_key_name, occi_key_content = self.__extract_public_key() create_key_headers = { 'Content-Type': 'text/occi', 'Category': 'public_key; scheme="http://schemas.ogf.org/occi/security/credentials#"', 'X-OCCI-Attribute': 'occi.key.name="' + occi_key_name + '", occi.key.content="' + occi_key_content + '"' } http_retriable_request('POST', url, headers=create_key_headers, authenticate=True) else: LOG.debug('Valid SM SSH is registered with OpenShift.')
def deploy_complete(self, url): # XXX fugly - code copied from Resolver heads = { 'Content-type': 'text/occi', 'Accept': 'application/occi+json', 'X-Auth-Token': self.extras['token'], 'X-Tenant-Name': self.extras['tenant_name'], } LOG.info('checking service state at: ' + url) LOG.info('sending headers: ' + heads.__repr__()) r = http_retriable_request('GET', url, headers=heads) attrs = json.loads(r.content) if len(attrs['attributes']) > 0: attr_hash = attrs['attributes'] stack_state = '' try: stack_state = attr_hash['occi.mcn.stack.state'] except KeyError: pass LOG.info('Current service state: ' + str(stack_state)) if stack_state == 'CREATE_COMPLETE' or stack_state == 'UPDATE_COMPLETE': LOG.info('Stack is ready') return True elif stack_state == 'CREATE_FAILED': raise RuntimeError('Heat stack creation failed.') else: LOG.info('Stack is not ready. Current state state: ' + stack_state) return False
def __create_app(self): # name must be A-Za-z0-9 and <=32 chars app_name = self.entity.kind.term[0:4] + 'srvinst' + ''.join(random.choice('0123456789ABCDEF') for i in range(16)) heads = { 'Content-Type': 'text/occi', 'Category': 'app; scheme="http://schemas.ogf.org/occi/platform#", ' 'python-2.7; scheme="http://schemas.openshift.com/template/app#", ' 'small; scheme="http://schemas.openshift.com/template/app#"', 'X-OCCI-Attribute': 'occi.app.name=' + app_name } url = self.nburl + '/app/' LOG.debug('Requesting container to execute SO Bundle: ' + url) LOG.info('Sending headers: ' + heads.__repr__()) r = http_retriable_request('POST', url, headers=heads, authenticate=True) loc = r.headers.get('Location', '') if loc == '': raise AttributeError("No OCCI Location attribute found in request") app_uri_path = urlparse(loc).path LOG.debug('SO container created: ' + app_uri_path) LOG.debug('Updating OCCI entity.identifier from: ' + self.entity.identifier + ' to: ' + app_uri_path.replace('/app/', self.entity.kind.location)) self.entity.identifier = app_uri_path.replace('/app/', self.entity.kind.location) LOG.debug('Setting occi.core.id to: ' + app_uri_path.replace('/app/', '')) self.entity.attributes['occi.core.id'] = app_uri_path.replace('/app/', '') # get git uri. this is where our bundle is pushed to return self.__git_uri(app_uri_path)
def run(self): self.app.register_backend(self.srv_type, self.service_backend) if self.reg_srv: self.register_service() # setup shutdown handler for de-registration of service for sig in [signal.SIGTERM, signal.SIGINT, signal.SIGHUP, signal.SIGQUIT]: signal.signal(sig, self.shutdown_handler) up = urlparse(self.stg['service_endpoint']) dep_port = CONFIG.get('general', 'port') if dep_port != '': LOG.warn('DEPRECATED: parameter general: port in service manager config. ' 'Service port number (' + str(up.port) + ') is taken from the service manifest') if self.DEBUG: from wsgiref.simple_server import make_server httpd = make_server('', int(up.port), self.app) httpd.serve_forever() else: container = wsgi.WSGIContainer(self.app) http_server = httpserver.HTTPServer(container) http_server.listen(int(up.port)) ioloop.IOLoop.instance().start() LOG.info('Service Manager running on interfaces, running on port: ' + int(up.port))
def run(self): # 1. dispose the active SO, essentially kills the STG/ITG # 2. dispose the resources used to run the SO # example request to the SO # curl -v -X DELETE http://localhost:8051/orchestrator/default \ # -H 'X-Auth-Token: '$KID \ # -H 'X-Tenant-Name: '$TENANT url = HTTP + self.host + '/orchestrator/default' heads = {'X-Auth-Token': self.extras['token'], 'X-Tenant-Name': self.extras['tenant_name']} occi_attrs = self.extras['srv_prms'].service_parameters(self.state) if len(occi_attrs) > 0: LOG.info('Adding service-specific parameters to call... X-OCCI-Attribute:' + occi_attrs) heads['X-OCCI-Attribute'] = occi_attrs LOG.info('Disposing service orchestrator with: ' + url) LOG.info('Sending headers: ' + heads.__repr__()) http_retriable_request('DELETE', url, headers=heads) url = self.nburl + self.entity.identifier.replace('/' + self.entity.kind.term + '/', '/app/') heads = {'Content-Type': 'text/occi', 'X-Auth-Token': self.extras['token'], 'X-Tenant-Name': self.extras['tenant_name']} LOG.info('Disposing service orchestrator container via CC... ' + url) LOG.info('Sending headers: ' + heads.__repr__()) http_retriable_request('DELETE', url, headers=heads, authenticate=True) return self.entity, self.extras
def run(self): # Deployment is done without any control by the client... # otherwise we won't be able to hand back a working service! LOG.debug('Deploying the SO bundle...') url = HTTP + self.host + '/orchestrator/default' params = {'action': 'deploy'} heads = { 'Category': 'deploy; scheme="http://schemas.mobile-cloud-networking.eu/occi/service#"', 'Content-Type': 'text/occi', 'X-Auth-Token': self.extras['token'], 'X-Tenant-Name': self.extras['tenant_name'] } occi_attrs = self.extras['srv_prms'].service_parameters(self.state) if len(occi_attrs) > 0: LOG.info( 'Adding service-specific parameters to call... X-OCCI-Attribute:' + occi_attrs) heads['X-OCCI-Attribute'] = occi_attrs LOG.debug('Deploying SO with: ' + url) LOG.info('Sending headers: ' + heads.__repr__()) http_retriable_request('POST', url, headers=heads, params=params) self.entity.attributes['mcn.service.state'] = 'deploy' LOG.debug('SO Deployed ') return self.entity, self.extras
def run(self): # take parameters from EEU and send them down to the SO instance # Trigger update on SO + service instance: # # $ curl -v -X POST http://localhost:8051/orchestrator/default \ # -H 'Content-Type: text/occi' \ # -H 'X-Auth-Token: '$KID \ # -H 'X-Tenant-Name: '$TENANT \ # -H 'X-OCCI-Attribute: occi.epc.attr_1="foo"' self.start_time = time.time() infoDict = { 'so_id': self.entity.attributes['occi.core.id'], 'sm_name': self.entity.kind.term, 'so_phase': 'update', 'phase_event': 'start', 'response_time': 0, 'tenant': self.extras['tenant_name'] } tmpJSON = json.dumps(infoDict) LOG.debug(tmpJSON) url = HTTP + self.host + '/orchestrator/default' heads = { 'Content-Type': 'text/occi', 'X-Auth-Token': self.extras['token'], 'X-Tenant-Name': self.extras['tenant_name'] } occi_attrs = self.extras['srv_prms'].service_parameters(self.state) if len(occi_attrs) > 0: LOG.info( 'Adding service-specific parameters to call... X-OCCI-Attribute:' + occi_attrs) heads['X-OCCI-Attribute'] = occi_attrs if len(self.new.attributes) > 0: LOG.info('Adding updated parameters... X-OCCI-Attribute: ' + self.new.attributes.__repr__()) for k, v in self.new.attributes.items(): occi_attrs = occi_attrs + ', ' + k + '=' + v self.entity.attributes[k] = v heads['X-OCCI-Attribute'] = occi_attrs LOG.debug('Updating (Provisioning) SO with: ' + url) LOG.info('Sending headers: ' + heads.__repr__()) http_retriable_request('POST', url, headers=heads) self.entity.attributes['mcn.service.state'] = 'update' #start thread here thread = Thread(target=deploy_complete, args=(url, self.start_time, self.extras, self.entity)) thread.start() return self.entity, self.extras
def run(self): super(AsychExe, self).run() LOG.debug('Starting AsychExe thread') for task in self.tasks: entity, extras = task.run() if self.registry: LOG.debug('Updating entity in registry') self.registry.add_resource(key=entity.identifier, resource=entity, extras=extras)
def deregister_service(self): if self.srv_ep: LOG.debug( 'De-registering the service with the keystone service...') keystone = client.Client(token=self.token, tenant_name=self.tenant_name, auth_url=self.design_uri) keystone.services.delete(self.srv_ep.id) # deletes endpoint too
def run(self): # this can only run until the deployment has complete! # this will block until run() returns #LOG.debug('PROVISION SO START') self.start_time = time.time() infoDict = { 'so_id': self.entity.attributes['occi.core.id'], 'sm_name': self.entity.kind.term, 'so_phase': 'provision', 'phase_event': 'start', 'response_time': 0, 'tenant': self.extras['tenant_name'] } tmpJSON = json.dumps(infoDict) LOG.debug(tmpJSON) url = HTTP + self.host + '/orchestrator/default' # with stuff like this, we need to have a callback mechanism... this will block otherwise while not self.deploy_complete(url): time.sleep(13) params = {'action': 'provision'} heads = { 'Category': 'provision; scheme="http://schemas.mobile-cloud-networking.eu/occi/service#"', 'Content-Type': 'text/occi', 'X-Auth-Token': self.extras['token'], 'X-Tenant-Name': self.extras['tenant_name'] } occi_attrs = self.extras['srv_prms'].service_parameters(self.state) if len(occi_attrs) > 0: LOG.info( 'Adding service-specific parameters to call... X-OCCI-Attribute: ' + occi_attrs) heads['X-OCCI-Attribute'] = occi_attrs LOG.debug('Provisioning SO with: ' + url) LOG.info('Sending headers: ' + heads.__repr__()) http_retriable_request('POST', url, headers=heads, params=params) elapsed_time = time.time() - self.start_time infoDict = { 'so_id': self.entity.attributes['occi.core.id'], 'sm_name': self.entity.kind.term, 'so_phase': 'provision', 'phase_event': 'done', 'response_time': elapsed_time, 'tenant': self.extras['tenant_name'] } tmpJSON = json.dumps(infoDict) LOG.debug(tmpJSON) #LOG.debug('PROVISION SO DONE, elapsed: %f' % elapsed_time) self.entity.attributes['mcn.service.state'] = 'provision' return self.entity, self.extras
def deregister_service(self): if not self.reg_srv: return if self.srv_ep: LOG.debug('De-registering the service with the keystone service...') keystone = client.Client(token=self.token, tenant_name=self.tenant_name, auth_url=self.design_uri) keystone.services.delete(self.srv_ep.id) # deletes endpoint too if not self.DEBUG: ioloop.IOLoop.instance().stop() else: sys.exit(0)
def run(self): # take parameters from EEU and send them down to the SO instance # Trigger update on SO + service instance: # # $ curl -v -X POST http://localhost:8051/orchestrator/default \ # -H 'Content-Type: text/occi' \ # -H 'X-Auth-Token: '$KID \ # -H 'X-Tenant-Name: '$TENANT \ # -H 'X-OCCI-Attribute: occi.epc.attr_1="foo"' self.start_time = time.time() infoDict = { 'so_id': self.entity.attributes['occi.core.id'], 'sm_name': self.entity.kind.term, 'so_phase': 'update', 'phase_event': 'start', 'response_time': 0, 'tenant': self.extras['tenant_name'] } tmpJSON = json.dumps(infoDict) LOG.debug(tmpJSON) url = HTTP + self.host + '/orchestrator/default' heads = { 'Content-Type': 'text/occi', 'X-Auth-Token': self.extras['token'], 'X-Tenant-Name': self.extras['tenant_name']} occi_attrs = self.extras['srv_prms'].service_parameters(self.state) if len(occi_attrs) > 0: LOG.info('Adding service-specific parameters to call... X-OCCI-Attribute:' + occi_attrs) heads['X-OCCI-Attribute'] = occi_attrs if len(self.new.attributes) > 0: LOG.info('Adding updated parameters... X-OCCI-Attribute: ' + self.new.attributes.__repr__()) for k, v in self.new.attributes.items(): occi_attrs = occi_attrs + ', ' + k + '=' + v self.entity.attributes[k] = v heads['X-OCCI-Attribute'] = occi_attrs LOG.debug('Updating (Provisioning) SO with: ' + url) LOG.info('Sending headers: ' + heads.__repr__()) http_retriable_request('POST', url, headers=heads) self.entity.attributes['mcn.service.state'] = 'update' #start thread here thread = Thread(target = deploy_complete, args = (url, self.start_time, self.extras, self.entity )) thread.start() return self.entity, self.extras
def run(self): self.entity.attributes['mcn.service.state'] = 'initialise' LOG.debug('Ensuring SM SSH Key...') self.__ensure_ssh_key() # create an app for the new SO instance LOG.debug('Creating SO container...') if not self.entity.extras: self.entity.extras = {} self.entity.extras['repo_uri'] = self.__create_app() return self.entity, self.extras
def run(self): # get the code of the bundle and push it to the git facilities # offered by OpenShift LOG.debug('Deploying SO Bundle to: ' + self.repo_uri) self.__deploy_app() LOG.debug('Activating the SO...') self.__init_so() self.entity.attributes['mcn.service.state'] = 'activate' return self.entity, self.extras
def run(self): # this can only run until the deployment has complete! # this will block until run() returns #LOG.debug('PROVISION SO START') self.start_time = time.time() infoDict = { 'so_id': self.entity.attributes['occi.core.id'], 'sm_name': self.entity.kind.term, 'so_phase': 'provision', 'phase_event': 'start', 'response_time': 0, 'tenant': self.extras['tenant_name'] } tmpJSON = json.dumps(infoDict) LOG.debug(tmpJSON) url = HTTP + self.host + '/orchestrator/default' # with stuff like this, we need to have a callback mechanism... this will block otherwise while not self.deploy_complete(url): time.sleep(13) params = {'action': 'provision'} heads = { 'Category': 'provision; scheme="http://schemas.mobile-cloud-networking.eu/occi/service#"', 'Content-Type': 'text/occi', 'X-Auth-Token': self.extras['token'], 'X-Tenant-Name': self.extras['tenant_name']} occi_attrs = self.extras['srv_prms'].service_parameters(self.state) if len(occi_attrs) > 0: LOG.info('Adding service-specific parameters to call... X-OCCI-Attribute: ' + occi_attrs) heads['X-OCCI-Attribute'] = occi_attrs LOG.debug('Provisioning SO with: ' + url) LOG.info('Sending headers: ' + heads.__repr__()) http_retriable_request('POST', url, headers=heads, params=params) elapsed_time = time.time() - self.start_time infoDict = { 'so_id': self.entity.attributes['occi.core.id'], 'sm_name': self.entity.kind.term, 'so_phase': 'provision', 'phase_event': 'done', 'response_time': elapsed_time, 'tenant': self.extras['tenant_name'] } tmpJSON = json.dumps(infoDict) LOG.debug(tmpJSON) #LOG.debug('PROVISION SO DONE, elapsed: %f' % elapsed_time) self.entity.attributes['mcn.service.state'] = 'provision' return self.entity, self.extras
def run(self): # take parameters from EEU and send them down to the SO instance # Trigger update on SO + service instance: # # $ curl -v -X POST http://localhost:8051/orchestrator/default \ # -H 'Content-Type: text/occi' \ # -H 'X-Auth-Token: '$KID \ # -H 'X-Tenant-Name: '$TENANT \ # -H 'X-OCCI-Attribute: occi.epc.attr_1="foo"' url = HTTP + self.host + '/orchestrator/default' heads = { 'Content-Type': 'text/occi', 'X-Auth-Token': self.extras['token'], 'X-Tenant-Name': self.extras['tenant_name']} occi_attrs = self.extras['srv_prms'].service_parameters(self.state) if len(occi_attrs) > 0: LOG.info('Adding service-specific parameters to call... X-OCCI-Attribute:' + occi_attrs) heads['X-OCCI-Attribute'] = occi_attrs if len(self.new.attributes) > 0: LOG.info('Adding updated parameters... X-OCCI-Attribute: ' + self.new.attributes.__repr__()) for k, v in self.new.attributes.items(): occi_attrs = occi_attrs + ', ' + k + '=' + v self.entity.attributes[k] = v heads['X-OCCI-Attribute'] = occi_attrs LOG.debug('Updating (Provisioning) SO with: ' + url) LOG.info('Sending headers: ' + heads.__repr__()) http_retriable_request('POST', url, headers=heads) self.entity.attributes['mcn.service.state'] = 'update' return self.entity, self.extras
def __init_so(self): url = HTTP + self.host + '/orchestrator/default' heads = { 'Category': 'orchestrator; scheme="http://schemas.mobile-cloud-networking.eu/occi/service#"', 'Content-Type': 'text/occi', 'X-Auth-Token': self.extras['token'], 'X-Tenant-Name': self.extras['tenant_name'], 'X-OCCI-Attribute': 'occi.mcn.app.url="' + HTTP + self.host + '/orchestrator/default"' } occi_attrs = self.extras['srv_prms'].service_parameters(self.state) if len(occi_attrs) > 0: LOG.info('Adding service-specific parameters to call... X-OCCI-Attribute: ' + occi_attrs) heads['X-OCCI-Attribute'] = occi_attrs LOG.debug('Initialising SO with: ' + url) LOG.info('Sending headers: ' + heads.__repr__()) http_retriable_request('PUT', url, headers=heads) elapsed_time = time.time() - self.start_time infoDict = { 'so_id': self.entity.attributes['occi.core.id'], 'sm_name': self.entity.kind.term, 'so_phase': 'activate', 'phase_event': 'done', 'response_time': elapsed_time, 'tenant': self.extras['tenant_name'] } tmpJSON = json.dumps(infoDict) LOG.debug(tmpJSON)
def run(self): # TODO: bad practise global stateNumber global stateDescription global soStackId global stackName LOG.debug("running deploy") self.start_time = time.time() infoDict = { 'sm_name': self.entity.kind.term, 'phase': 'deploy', 'phase_event': 'start', 'response_time': 0, } LOG.debug(json.dumps(infoDict)) self.entity.attributes['mcn.service.state'] = 'deploy' # status update self.__status(1,"started deployment of VM on OpenStack for SO") # Do deploy work here self.__deploy_so_vm() # status update self.__status(2,"SO's VM deployment initiated; waiting to finish & start SO") # after the deployment, we have to wait until the VM is setup and the # SO is listening for connections # TODO: this is going to result in a problem if the SO couldn't be deployed successfully! there should be a timeout with the iteration and a treatment of each outcome iteration = 0 while not self.__so_complete(): iteration += 1 # wait some seconds with each iteration - 5 was chosen just # randomly in order to not make the communication too frequent but # still get the result quite fast. It also depends on the OpenStack # installation where the SO is to be deployed. (If the deployment # speed is low, there is no need to test it too frequently and vice # versa) time.sleep(5) # the second count might not be very accurate, but it gives an estimate LOG.debug("it took me "+str(time.time() - self.start_time)+" seconds to deploy the SO") # status update self.__status(3,"SO running; sending deploy command to it") # send the deploy command to the freshly instantiated SO self.__deploy_to_so() elapsed_time = time.time() - self.start_time infoDict = { 'sm_name': self.entity.kind.term, 'phase': 'deploy', 'phase_event': 'done', 'response_time': elapsed_time, } LOG.debug(json.dumps(infoDict)) return self.entity, self.extras
def __init_so(self): url = HTTP + self.host + '/orchestrator/default' heads = { 'Category': 'orchestrator; scheme="http://schemas.mobile-cloud-networking.eu/occi/service#"', 'Content-Type': 'text/occi', 'X-Auth-Token': self.extras['token'], 'X-Tenant-Name': self.extras['tenant_name'], } occi_attrs = self.extras['srv_prms'].service_parameters(self.state) if len(occi_attrs) > 0: LOG.info( 'Adding service-specific parameters to call... X-OCCI-Attribute: ' + occi_attrs) heads['X-OCCI-Attribute'] = occi_attrs LOG.debug('Initialising SO with: ' + url) LOG.info('Sending headers: ' + heads.__repr__()) http_retriable_request('PUT', url, headers=heads) elapsed_time = time.time() - self.start_time infoDict = { 'so_id': self.entity.attributes['occi.core.id'], 'sm_name': self.entity.kind.term, 'so_phase': 'activate', 'phase_event': 'done', 'response_time': elapsed_time, 'tenant': self.extras['tenant_name'] } tmpJSON = json.dumps(infoDict) LOG.debug(tmpJSON)
def run(self): self.app.register_backend(self.srv_type, self.service_backend) if self.reg_srv: self.register_service() # setup shutdown handler for de-registration of service for sig in [signal.SIGTERM, signal.SIGINT, signal.SIGHUP, signal.SIGQUIT]: signal.signal(sig, self.shutdown_handler) up = urlparse(self.stg['service_endpoint']) dep_port = CONFIG.get('general', 'port') if dep_port != '': LOG.warn('DEPRECATED: parameter general: port in service manager config. ' 'Service port number (' + str(up.port) + ') is taken from the service manifest') if self.DEBUG: LOG.debug('Using WSGI reference implementation') httpd = make_server('', int(up.port), self.app) httpd.serve_forever() else: LOG.debug('Using tornado implementation') container = wsgi.WSGIContainer(self.app) http_server = httpserver.HTTPServer(container) http_server.listen(int(up.port)) ioloop.IOLoop.instance().start() LOG.info('Service Manager running on interfaces, running on port: ' + str(up.port))
def register_service(self): self.srv_ep = util.services.get_service_endpoint(identifier=self.srv_type.term, token=self.token, endpoint=self.design_uri, tenant_name=self.tenant_name, url_type='public') if self.srv_ep is None or self.srv_ep == '': LOG.debug('RRRegistering the service with the keystone service...') keystone = client.Client(token=self.token, tenant_name=self.tenant_name, auth_url=self.design_uri) # taken from the kind definition self.srv_ep = keystone.services.create(self.srv_type.scheme+self.srv_type.term, self.srv_type.scheme+self.srv_type.term, self.srv_type.title) internal_url = admin_url = public_url = self.service_endpoint self.ep = keystone.endpoints.create(self.region, self.srv_ep.id, public_url, admin_url, internal_url) LOG.info(self.service_endpoint) LOG.info('Service is now registered with keystone: ' + 'Region: ' + self.ep.region + ' Public URL:' + self.ep.publicurl + ' Service ID: ' + self.srv_ep.id + ' Endpoint ID: ' + self.ep.id) else: LOG.info('Service is already registered with keystone. Service endpoint is: ' + self.srv_ep)
def run(self): # this is wrong but required... if self.entity.extras['ops_version'] == 'v3': url = self.entity.attributes['occi.so.url'] while not self.__is_complete(url): time.sleep(3) LOG.debug('ACTIVATE SO START') self.start_time = time.time() infoDict = { 'so_id': self.entity.attributes['occi.core.id'], 'sm_name': self.entity.kind.term, 'so_phase': 'activate', 'phase_event': 'start', 'response_time': 0, 'tenant': self.extras['tenant_name'] } tmpJSON = json.dumps(infoDict) LOG.debug(tmpJSON) if self.entity.extras['ops_version'] == 'v2': # get the code of the bundle and push it to the git facilities # offered by OpenShift LOG.debug('Deploying SO Bundle to: ' + self.repo_uri) self.__deploy_app() LOG.debug('Activating the SO...') self.__init_so() self.entity.attributes['mcn.service.state'] = 'activate' return self.entity, self.extras
def __add_openshift_files(self, bundle_loc, tmp_dir): # put OpenShift stuff in place # build and pre_start_python comes from 'support' directory in bundle LOG.debug('Adding OpenShift support files from: ' + bundle_loc + '/support') # 1. Write build LOG.debug('Writing build to: ' + os.path.join(tmp_dir, '.openshift', 'action_hooks', 'build')) shutil.copyfile( bundle_loc + '/support/build', os.path.join(tmp_dir, '.openshift', 'action_hooks', 'build')) # 1. Write pre_start_python LOG.debug('Writing pre_start_python to: ' + os.path.join( tmp_dir, '.openshift', 'action_hooks', 'pre_start_python')) pre_start_template = Template(filename=bundle_loc + '/support/pre_start_python') design_uri = CONFIG.get('service_manager', 'design_uri', '') content = pre_start_template.render(design_uri=design_uri) LOG.debug('Writing pre_start_python content as: ' + content) pre_start_file = open( os.path.join(tmp_dir, '.openshift', 'action_hooks', 'pre_start_python'), "w") pre_start_file.write(content) pre_start_file.close() os.system(' '.join([ 'chmod', '+x', os.path.join(tmp_dir, '.openshift', 'action_hooks', '*') ]))
def __init__(self, app, srv_type=None): # openstack objects tracking the keystone service and endpoint self.srv_ep = None self.ep = None self.DEBUG = True self.app = app self.service_backend = ServiceBackend(app) LOG.info('Using configuration file: ' + CONFIG_PATH) self.token, self.tenant_name = self.get_service_credentials() self.design_uri = CONFIG.get('service_manager', 'design_uri', '') if self.design_uri == '': LOG.fatal('No design_uri parameter supplied in sm.cfg') raise Exception('No design_uri parameter supplied in sm.cfg') self.stg = None stg_path = CONFIG.get('service_manager', 'manifest', '') if stg_path == '': raise RuntimeError('No STG specified in the configuration file.') with open(stg_path) as stg_content: self.stg = json.load(stg_content) stg_content.close() if not srv_type: srv_type = self.create_service_type() self.srv_type = srv_type self.reg_srv = CONFIG.getboolean('service_manager_admin', 'register_service') if self.reg_srv: self.region = CONFIG.get('service_manager_admin', 'region', '') if self.region == '': LOG.info( 'No region parameter specified in sm.cfg, defaulting to an OpenStack default: RegionOne' ) self.region = 'RegionOne' self.service_endpoint = CONFIG.get('service_manager_admin', 'service_endpoint') if self.service_endpoint != '': LOG.warn( 'DEPRECATED: service_endpoint parameter supplied in sm.cfg! Endpoint is now specified in ' 'service manifest as service_endpoint') LOG.info('Using ' + self.stg['service_endpoint'] + ' as the service_endpoint value ' 'from service manifest') up = urlparse(self.stg['service_endpoint']) self.service_endpoint = up.scheme + '://' + up.hostname + ':' + str( up.port)
def run(self): LOG.debug("running retrieve") self.start_time = time.time() infoDict = { 'sm_name': self.entity.kind.term, 'phase': 'retrieve', 'phase_event': 'start', 'response_time': 0, } LOG.debug(json.dumps(infoDict)) self.entity.attributes['mcn.service.state'] = 'retrieve' argument = { 'design_uri': CONFIG.get('service_manager', 'design_uri', ''), 'username': self.entity.attributes['icclab.disco.deployer.username'], 'tenant_name': self.extras['tenant_name'], 'password': self.entity.attributes['icclab.disco.deployer.password'], 'stack_name': 'disco_' + str(uuid.uuid1()), 'region': self.entity.attributes['icclab.disco.deployer.region'], 'token': self.extras['token'] } deployer = OpenstackDeployer(argument) framework_directory = CONFIG.get('disco','framework_directory','') disco_config = {"deployer": deployer, "framework_directory": framework_directory, "root_component": "heat", "root_component_state": "end"} discoinst = OpenstackDisco(disco_config, self.entity.attributes) if 'stackid' in self.entity.attributes and \ self.entity.attributes['stackid'] is not "": stackinfo = discoinst.retrieve(self.entity.attributes['stackid']) try: for output in stackinfo: if output['output_value'] == None: output['output_value'] = "" self.entity.attributes[output['output_key']] = output['output_value'] current_stack = deployer.hc.stacks.get( self.entity.attributes['stackid']) self.entity.attributes['stack_status'] = copy.deepcopy( current_stack.stack_status) except: self.entity.attributes['external_ip'] = 'none' else: self.entity.attributes['disco_status'] = 'nothing here right now' # this has to be done because Hurtle doesn't convert a multiline string into a valid JSON if "ssh_private_key" in self.entity.attributes: self.entity.attributes["ssh_private_key"] = self.entity.attributes["ssh_private_key"].replace("\n","\\n") return self.entity, self.extras
def run(self): if not self.entity.extras: self.entity.extras = {} ops_version = self.__detect_ops_version() self.entity.extras['ops_version'] = ops_version self.entity.attributes['mcn.service.state'] = 'initialise' # create an app for the new SO instance LOG.debug('Creating SO container...') self.__create_app() # adding tenant to entity.extras for future checks later when retrieving resource self.entity.extras['tenant_name'] = self.extras['tenant_name'] return self.entity, self.extras
def __init__(self, app, srv_type=None): # openstack objects tracking the keystone service and endpoint self.srv_ep = None self.ep = None self.DEBUG = True self.app = app self.service_backend = ServiceBackend(app) LOG.info("Using configuration file: " + CONFIG_PATH) self.token, self.tenant_name = self.get_service_credentials() self.design_uri = CONFIG.get("service_manager", "design_uri", "") if self.design_uri == "": LOG.fatal("No design_uri parameter supplied in sm.cfg") raise Exception("No design_uri parameter supplied in sm.cfg") self.stg = None stg_path = CONFIG.get("service_manager", "manifest", "") if stg_path == "": raise RuntimeError("No STG specified in the configuration file.") with open(stg_path) as stg_content: self.stg = json.load(stg_content) stg_content.close() if not srv_type: srv_type = self.create_service_type() self.srv_type = srv_type self.reg_srv = CONFIG.getboolean("service_manager_admin", "register_service") if self.reg_srv: self.region = CONFIG.get("service_manager_admin", "region", "") if self.region == "": LOG.info("No region parameter specified in sm.cfg, defaulting to an OpenStack default: RegionOne") self.region = "RegionOne" self.service_endpoint = CONFIG.get("service_manager_admin", "service_endpoint") if self.service_endpoint != "": LOG.warn( "DEPRECATED: service_endpoint parameter supplied in sm.cfg! Endpoint is now specified in " "service manifest as service_endpoint" ) LOG.info( "Using " + self.stg["service_endpoint"] + " as the service_endpoint value " "from service manifest" ) up = urlparse(self.stg["service_endpoint"]) self.service_endpoint = up.scheme + "://" + up.hostname + ":" + str(up.port)
def get_category(self, svc_kind): keystone = client.Client(token=self.token, tenant_name=self.tenant_name, auth_url=self.design_uri) try: svc = keystone.services.find(type=svc_kind.keys()[0]) svc_ep = keystone.endpoints.find(service_id=svc.id) except Exception as e: LOG.error('Cannot find the service endpoint of: ' + svc_kind.__repr__()) raise e u = urlparse(svc_ep.publicurl) # sort out the OCCI QI path if u.path == '/': svc_ep.publicurl += '-/' elif u.path == '': svc_ep.publicurl += '/-/' else: LOG.warn('Service endpoint URL does not look like it will work: ' + svc_ep.publicurl.__repr__()) svc_ep.publicurl = u.scheme + '://' + u.netloc + '/-/' LOG.warn('Trying with the scheme and net location: ' + svc_ep.publicurl.__repr__()) heads = { 'X-Auth-Token': self.token, 'X-Tenant-Name': self.tenant_name, 'Accept': 'application/occi+json' } try: r = requests.get(svc_ep.publicurl, headers=heads) r.raise_for_status() except requests.HTTPError as err: LOG.error('HTTP Error: should do something more here!' + err.message) raise err registry = json.loads(r.content) category = None for cat in registry: if 'related' in cat: category = cat return Kind(scheme=category['scheme'], term=category['term'], related=category['related'], title=category['title'], attributes=category['attributes'], location=category['location'])
def __ensure_ssh_key(self): url = self.nburl + '/public_key/' heads = {'Accept': 'text/occi'} resp = http_retriable_request('GET', url, headers=heads, authenticate=True) locs = resp.headers.get('x-occi-location', '') # Split on spaces, test if there is at least one key registered if len(locs.split()) < 1: LOG.debug('No SM SSH registered. Registering default SM SSH key.') occi_key_name, occi_key_content = self.__extract_public_key() create_key_headers = {'Content-Type': 'text/occi', 'Category': 'public_key; scheme="http://schemas.ogf.org/occi/security/credentials#"', 'X-OCCI-Attribute': 'occi.key.name="' + occi_key_name + '", occi.key.content="' + occi_key_content + '"' } http_retriable_request('POST', url, headers=create_key_headers, authenticate=True) else: LOG.debug('Valid SM SSH is registered with OpenShift.')
def __create_app(self): # name must be A-Za-z0-9 and <=32 chars app_name = self.entity.kind.term[0:4] + 'srvinst' + ''.join( random.choice('0123456789ABCDEF') for i in range(16)) heads = { 'Content-Type': 'text/occi', 'Category': 'app; scheme="http://schemas.ogf.org/occi/platform#", ' 'python-2.7; scheme="http://schemas.openshift.com/template/app#", ' 'small; scheme="http://schemas.openshift.com/template/app#"', 'X-OCCI-Attribute': 'occi.app.name=' + app_name } url = self.nburl + '/app/' LOG.debug('Requesting container to execute SO Bundle: ' + url) LOG.info('Sending headers: ' + heads.__repr__()) r = http_retriable_request('POST', url, headers=heads, authenticate=True) loc = r.headers.get('Location', '') if loc == '': raise AttributeError("No OCCI Location attribute found in request") app_uri_path = urlparse(loc).path LOG.debug('SO container created: ' + app_uri_path) LOG.debug('Updating OCCI entity.identifier from: ' + self.entity.identifier + ' to: ' + app_uri_path.replace('/app/', self.entity.kind.location)) self.entity.identifier = app_uri_path.replace( '/app/', self.entity.kind.location) LOG.debug('Setting occi.core.id to: ' + app_uri_path.replace('/app/', '')) self.entity.attributes['occi.core.id'] = app_uri_path.replace( '/app/', '') # get git uri. this is where our bundle is pushed to return self.__git_uri(app_uri_path)
def __init__(self, app, srv_type=None): # openstack objects tracking the keystone service and endpoint self.srv_ep = None self.ep = None self.DEBUG = True self.app = app self.service_backend = ServiceBackend(app) LOG.info('Using configuration file: ' + CONFIG_PATH) self.token, self.tenant_name = self.get_service_credentials() self.design_uri = CONFIG.get('service_manager', 'design_uri', '') if self.design_uri == '': LOG.fatal('No design_uri parameter supplied in sm.cfg') raise Exception('No design_uri parameter supplied in sm.cfg') self.stg = None stg_path = CONFIG.get('service_manager', 'manifest', '') if stg_path == '': raise RuntimeError('No STG specified in the configuration file.') with open(stg_path) as stg_content: self.stg = json.load(stg_content) stg_content.close() if not srv_type: srv_type = self.create_service_type() self.srv_type = srv_type self.reg_srv = CONFIG.getboolean('service_manager_admin', 'register_service') if self.reg_srv: self.region = CONFIG.get('service_manager_admin', 'region', '') if self.region == '': LOG.info('No region parameter specified in sm.cfg, defaulting to an OpenStack default: RegionOne') self.region = 'RegionOne' self.service_endpoint = CONFIG.get('service_manager_admin', 'service_endpoint') if self.service_endpoint != '': LOG.warn('DEPRECATED: service_endpoint parameter supplied in sm.cfg! Endpoint is now specified in ' 'service manifest as service_endpoint') LOG.info('Using ' + self.stg['service_endpoint'] + ' as the service_endpoint value ' 'from service manifest') up = urlparse(self.stg['service_endpoint']) self.service_endpoint = up.scheme + '://' + up.hostname + ':' + str(up.port)
def __call__(self, environ, response): token = environ.get('HTTP_X_AUTH_TOKEN', '') # design_uri is needed for the case that no token was given design_uri = CONFIG.get('service_manager', 'design_uri', '') if design_uri == '': LOG.fatal('No design_uri parameter supplied in sm.cfg') raise Exception('No design_uri parameter supplied in sm.cfg') tenantname = environ.get('HTTP_X_TENANT_NAME', '') region = environ.get('HTTP_X_REGION_NAME','') username = environ.get('HTTP_X_USER_NAME','') password = environ.get('HTTP_X_PASSWORD','') # for checking the authenticity auth = KeyStoneAuthService(design_uri) # get the token from username, tenant and region combination from HTTP # headers if token is '': try: # get all the required variables - as the tenant name has a # special role, it's queried separately kc = client.Client(auth_url=design_uri, username=username, password=password, tenant_name=tenantname ) environ['HTTP_X_AUTH_TOKEN'] = kc.auth_token token = kc.auth_token except: raise Exception('Either no design uri, username, ' 'password, or tenant name respectively ' 'provided or the login didn\'t succeed') else: if not auth.verify(token=token, tenant_name=tenantname): LOG.error('Token has probably expired') raise HTTPError(401, 'Token is not valid. You likely need an updated token.') # the arguments at the back will become the extras variable within the individual SM classes return self._call_occi(environ, response, username=username, design_uri=design_uri, password=password, token=token, tenant_name=tenantname, registry=self.registry, region=region)
def __extract_public_key(self): ssh_key_file = CONFIG.get('service_manager', 'ssh_key_location', '') if ssh_key_file == '': raise Exception('No ssh_key_location parameter supplied in sm.cfg') LOG.debug('Using SSH key file: ' + ssh_key_file) with open(ssh_key_file, 'r') as content_file: content = content_file.read() content = content.split() if content[0] == 'ssh-dsa': raise Exception("The supplied key is not a RSA ssh key. Location: " + ssh_key_file) key_content = content[1] key_name = 'servicemanager' if len(content) == 3: key_name = content[2] return key_name, key_content
def __git_uri(self, app_uri_path): url = self.nburl + app_uri_path headers = {'Accept': 'text/occi'} LOG.debug('Requesting container\'s URL ' + url) LOG.info('Sending headers: ' + headers.__repr__()) r = http_retriable_request('GET', url, headers=headers, authenticate=True) attrs = r.headers.get('X-OCCI-Attribute', '') if attrs == '': raise AttributeError("No occi attributes found in request") repo_uri = '' for attr in attrs.split(', '): if attr.find('occi.app.repo') != -1: repo_uri = attr.split('=')[1][ 1:-1] # scrubs trailing wrapped quotes break elif attr.find('occi.app.url') != -1: repo_uri = attr.split('=')[1][ 1:-1] # scrubs trailing wrapped quotes break if repo_uri == '': raise AttributeError( "No occi.app.repo or occi.app.url attribute found in request") LOG.debug('SO container URL: ' + repo_uri) return repo_uri
def __deploy_app(self): """ Deploy the local SO bundle assumption here - a git repo is returned - the bundle is not managed by git """ # create temp dir...and clone the remote repo provided by OpS tmp_dir = tempfile.mkdtemp() LOG.debug('Cloning git repository: ' + self.repo_uri + ' to: ' + tmp_dir) cmd = ' '.join(['git', 'clone', self.repo_uri, tmp_dir]) os.system(cmd) # Get the SO bundle bundle_loc = CONFIG.get('service_manager', 'bundle_location', '') if bundle_loc == '': raise Exception('No bundle_location parameter supplied in sm.cfg') LOG.debug('Bundle to add to repo: ' + bundle_loc) dir_util.copy_tree(bundle_loc, tmp_dir) self.__add_openshift_files(bundle_loc, tmp_dir) # add & push to OpenShift os.system(' '.join(['cd', tmp_dir, '&&', 'git', 'add', '-A'])) os.system(' '.join(['cd', tmp_dir, '&&', 'git', 'commit', '-m', '"deployment of SO for tenant ' + self.extras['tenant_name'] + '"', '-a'])) LOG.debug('Pushing new code to remote repository...') os.system(' '.join(['cd', tmp_dir, '&&', 'git', 'push'])) shutil.rmtree(tmp_dir)
def service_parameters(self, state='', content_type='text/occi'): # takes the internal parameters defined for the lifecycle phase... # and combines them with the client supplied parameters if content_type == 'text/occi': params = [] # get the state specific internal parameters try: params = self.service_params[state] except KeyError as err: LOG.warn( 'The requested states parameters are not available: "' + state + '"') # get the client supplied parameters if any try: for p in self.service_params['client_params']: params.append(p) except KeyError as err: LOG.info('No client params') header = '' for param in params: if param['type'] == 'string': value = '"' + param['value'] + '"' else: value = str(param['value']) header = header + param['name'] + '=' + value + ', ' return header[0:-2] else: LOG.error('Content type not supported: ' + content_type)
def __git_uri(self, app_uri_path): url = self.nburl + app_uri_path headers = {'Accept': 'text/occi'} LOG.debug('Requesting container\'s URL ' + url) LOG.info('Sending headers: ' + headers.__repr__()) r = http_retriable_request('GET', url, headers=headers, authenticate=True) attrs = r.headers.get('X-OCCI-Attribute', '') if attrs == '': raise AttributeError("No occi attributes found in request") repo_uri = '' for attr in attrs.split(', '): if attr.find('occi.app.repo') != -1: repo_uri = attr.split('=')[1][1:-1] # scrubs trailing wrapped quotes break elif attr.find('occi.app.url') != -1: repo_uri = attr.split('=')[1][1:-1] # scrubs trailing wrapped quotes break if repo_uri == '': raise AttributeError("No occi.app.repo or occi.app.url attribute found in request") LOG.debug('SO container URL: ' + repo_uri) return repo_uri
def register_service(self): self.srv_ep = util.services.get_service_endpoint(identifier=self.srv_type.term, token=self.token, endpoint=self.design_uri, tenant_name=self.tenant_name, url_type='public') if self.srv_ep is None or self.srv_ep == '': LOG.debug('Registering the service with the keystone service...') keystone = client.Client(token=self.token, tenant_name=self.tenant_name, auth_url=self.design_uri) # taken from the kind definition self.srv_ep = keystone.services.create( self.srv_type.scheme+self.srv_type.term, self.srv_type.scheme+self.srv_type.term, self.srv_type.title) internal_url = admin_url = public_url = self.service_endpoint self.ep = keystone.endpoints.create(self.region, self.srv_ep.id, public_url, admin_url, internal_url) LOG.info('Service is now registered with keystone: ' + 'Region: ' + self.ep.region + ' Public URL:' + self.ep.publicurl + ' Service ID: ' + self.srv_ep.id + ' Endpoint ID: ' + self.ep.id) else: LOG.info('Service is already registered with keystone. Service endpoint is: ' + self.srv_ep)
def service_parameters(self, state='', content_type='text/occi'): # takes the internal parameters defined for the lifecycle phase... # and combines them with the client supplied parameters if content_type == 'text/occi': params = [] # get the state specific internal parameters try: params = self.service_params[state] except KeyError: # as err: LOG.warn('The requested states parameters are not available: "' + state + '"') # get the client supplied parameters if any try: for param in self.service_params['client_params']: params.append(param) except KeyError: # as err: LOG.info('No client params') header = '' for param in params: if param['type'] == 'string': value = '"' + param['value'] + '"' else: value = str(param['value']) header = header + param['name'] + '=' + value + ', ' return header[0:-2] else: LOG.error('Content type not supported: ' + content_type)
def __call__(self, environ, response): token = environ.get('HTTP_X_AUTH_TOKEN', '') if token == '': LOG.error('No X-Auth-Token header supplied.') raise HTTPError(400, 'No X-Auth-Token header supplied.') tenant = environ.get('HTTP_X_TENANT_NAME', '') if tenant == '': LOG.error('No X-Tenant-Name header supplied.') raise HTTPError(400, 'No X-Tenant-Name header supplied.') design_uri = CONFIG.get('service_manager', 'design_uri', '') if design_uri == '': LOG.fatal('No design_uri parameter supplied in sm.cfg') raise Exception('No design_uri parameter supplied in sm.cfg') auth = KeyStoneAuthService(design_uri) if not auth.verify(token=token, tenant_name=tenant): raise HTTPError( 401, 'Token is not valid. You likely need an updated token.') return self._call_occi(environ, response, token=token, tenant_name=tenant, registry=self.registry)
def __deploy_app(self): """ Deploy the local SO bundle assumption here - a git repo is returned - the bundle is not managed by git """ # create temp dir...and clone the remote repo provided by OpS dir = tempfile.mkdtemp() LOG.debug('Cloning git repository: ' + self.repo_uri + ' to: ' + dir) cmd = ' '.join(['git', 'clone', self.repo_uri, dir]) os.system(cmd) # Get the SO bundle bundle_loc = CONFIG.get('service_manager', 'bundle_location', '') if bundle_loc == '': raise Exception('No bundle_location parameter supplied in sm.cfg') LOG.debug('Bundle to add to repo: ' + bundle_loc) dir_util.copy_tree(bundle_loc, dir) self.__add_openshift_files(bundle_loc, dir) # add & push to OpenShift os.system(' '.join(['cd', dir, '&&', 'git', 'add', '-A'])) os.system(' '.join(['cd', dir, '&&', 'git', 'commit', '-m', '"deployment of SO for tenant ' + \ self.extras['tenant_name'] + '"', '-a'])) LOG.debug('Pushing new code to remote repository...') os.system(' '.join(['cd', dir, '&&', 'git', 'push'])) shutil.rmtree(dir)
def run(self): # this can only run until the deployment has complete! # this will block until run() returns url = HTTP + self.host + '/orchestrator/default' # with stuff like this, we need to have a callback mechanism... this will block otherwise while not self.deploy_complete(url): time.sleep(13) params = {'action': 'provision'} heads = { 'Category': 'provision; scheme="http://schemas.mobile-cloud-networking.eu/occi/service#"', 'Content-Type': 'text/occi', 'X-Auth-Token': self.extras['token'], 'X-Tenant-Name': self.extras['tenant_name']} occi_attrs = self.extras['srv_prms'].service_parameters(self.state) if len(occi_attrs) > 0: LOG.info('Adding service-specific parameters to call... X-OCCI-Attribute: ' + occi_attrs) heads['X-OCCI-Attribute'] = occi_attrs LOG.debug('Provisioning SO with: ' + url) LOG.info('Sending headers: ' + heads.__repr__()) http_retriable_request('POST', url, headers=heads, params=params) self.entity.attributes['mcn.service.state'] = 'provision' return self.entity, self.extras
def run(self): LOG.debug("running retrieve") self.start_time = time.time() infoDict = { 'sm_name': self.entity.kind.term, 'phase': 'retrieve', 'phase_event': 'start', 'response_time': 0, } LOG.debug(json.dumps(infoDict)) self.entity.attributes['mcn.service.state'] = 'retrieve' # Do retrieve work here self.entity.attributes['so_state_nr'] = str(stateNumber[self.sofloatingip]) self.entity.attributes['so_state_desc'] = stateDescription[self.sofloatingip] elapsed_time = time.time() - self.start_time infoDict = { 'sm_name': self.entity.kind.term, 'phase': 'retrieve', 'phase_event': 'done', 'response_time': elapsed_time, } LOG.debug(json.dumps(infoDict)) return self.entity, self.extras
def __detect_ops_version(self): # make a call to the cloud controller and based on the app kind, heuristically select version version = 'v2' heads = { 'Content-Type': 'text/occi', 'Accept': 'text/occi' } url = self.nburl + '/-/' LOG.debug('Requesting CC Query Interface: ' + url) LOG.info('Sending headers: ' + heads.__repr__()) r = http_retriable_request('GET', url, headers=heads, authenticate=True) if r.headers['category'].find('occi.app.image') > -1 and r.headers['category'].find('occi.app.env') > -1: LOG.info('Found occi.app.image and occi.app.env - this is OpenShift V3') version = 'v3' else: LOG.info('This is OpenShift V2') return version
def __init__(self, entity, extras): Task.__init__(self, entity, extras, state='initialise') self.nburl = CONFIG.get('cloud_controller', 'nb_api', '') if self.nburl[-1] == '/': self.nburl = self.nburl[0:-1] LOG.info('CloudController Northbound API: ' + self.nburl) if len(entity.attributes) > 0: LOG.info('Client supplied parameters: ' + entity.attributes.__repr__()) # XXX check that these parameters are valid according to the kind specification self.extras['srv_prms'].add_client_params(entity.attributes) else: LOG.warn('No client supplied parameters.')