def delete(self, acc_name, srv_id): def callback(resp): if not http_success(resp.code): raise HTTPError(resp.code) self.finish() req = OpenStackRequest(acc_name, 'DELETE', '/servers/' + srv_id) make_request_async(req, callback)
def get(self, acc_name): def callback(resp): if not http_success(resp.code): raise HTTPError(resp.code) self.write({'output': json.loads(resp.body)}) self.finish() req = OpenStackRequest(acc_name, 'GET', '/flavors') make_request_async(req, callback)
def _do_server_kill(self): self._process['server_kill'] = 1 def callback(resp): if not http_success(resp.code): self._error(500) return self._process['server_kill'] = 2 logger.debug("Killed the server succesfully") self._continue() url = '/servers/%s' % self._server_id req = OpenStackRequest(self._acc_name, 'DELETE', url) make_request_async(req, callback)
def get(self, acc_name, srv_id): def callback(resp): if not http_success(resp.code): raise HTTPError(resp.code) try: j = json.loads(resp.body) log = j['output'] except: log = '' self.write({'output': log}) self.finish() body = {'os-getConsoleOutput': {}} req = OpenStackRequest(acc_name, 'POST', '/servers/'+srv_id+'/action', body=body) make_request_async(req, callback)
def get(self, acc_name, srv_id): def callback(resp): if not http_success(resp.code): raise HTTPError(resp.code) try: j = json.loads(resp.body) addr = j['server']['addresses'] ip_address = addr[addr.keys()[0]][0]['addr'] except: ip_address = '' self.write({'output': {'ip_address': ip_address}}) self.finish() req = OpenStackRequest(acc_name, 'GET', '/servers/' + srv_id) make_request_async(req, callback)
def _timeout(self): """ This method is called when the launch process exceeds the specified time threshold. It stops the launch and terminates the instance. """ logger.error("Timeout of the launch process <%s> reached. Stopping the process." % self._launch_id) self._cancel_launch = True def callback(resp): logger.debug("Terminated the instance.") if self._server_id != None: req = OpenStackRequest(self._acc_name, "DELETE", "/servers/" + self._server_id) make_request_async(req, callback)
def _do_snapshot_create(self): self._process['snapshot_create'] = 1 self._snapshot_name = '%s (Generated by Nexel on %s)' % (self._mach_name, datetime.datetime.now().isoformat()) body = {'createImage': {'name': self._snapshot_name}} def callback(resp): try: assert resp.code == 202 except: self._error(500) return logger.debug("Created the snapshot succesfully") self._process['snapshot_create'] = 2 self._continue() url = '/servers/%s/action' % self._server_id req = OpenStackRequest(self._acc_name, 'POST', url, body=body) make_request_async(req, callback)
def _do_server_ready_op(self): def callback(resp): try: j = json.loads(resp.body) if j['meta']['nexel-ready'].lower() == 'true': self._server_ready = True self._process['server_ready'] = 2 except: pass if self._process['server_ready'] == 2: #self._continue() self.io_loop().add_timeout(BUILD_DELAY, self._continue) return self.io_loop().add_timeout(BUILD_DELAY, self._do_server_ready_op) req = OpenStackRequest(self._acc_name, 'GET', '/servers/'+self._server_id+'/metadata/nexel-ready') make_request_async(req, callback)
def get(self, acc_name): def callback(resp): if not http_success(resp.code): raise HTTPError(resp.code) try: j = json.loads(resp.body) limits = j['limits']['absolute'] self.write({'output': { 'servers': [limits['totalInstancesUsed'], limits['maxTotalInstances']], 'cores': [limits['totalCoresUsed'], limits['maxTotalCores']], 'ram': [limits['totalRAMUsed'], limits['maxTotalRAMSize']]}}) except: raise HTTPError(500) self.finish() req = OpenStackRequest(acc_name, 'GET', '/limits') make_request_async(req, callback)
def _do_snapshot_ready_op(self): def callback(resp): try: assert resp.code == 200 j = json.loads(resp.body) assert len(j['images']) <= 1 if len(j['images']) == 1: self._os_snapshot_id = j['images'][0]['id'] self._process['snapshot_ready'] = 2 except: self._error(500) return if self._process['snapshot_ready'] == 2: #self._continue() self.io_loop().add_timeout(SNAPSHOT_DELAY, self._continue) return self.io_loop().add_timeout(SNAPSHOT_DELAY, self._do_snapshot_ready_op) url = '/images?%s' % urllib.urlencode({'name': self._snapshot_name, 'status': 'ACTIVE'}) req = OpenStackRequest(self._acc_name, 'GET', url) make_request_async(req, callback)
def get(self, acc_name): def callback(resp): if not http_success(resp.code): raise HTTPError(resp.code) try: j = json.loads(resp.body) out = [] for srv in j['servers']: addr = srv['addresses'] try: ip_address = addr[addr.keys()[0]][0]['addr'] except: ip_address = '' # TODO: meta-data to detect a Nexel instance or snapshot in process out.append({'id': srv['id'], 'name': srv['name'], 'created': srv['created'], 'ip_address': ip_address}) self.write({'output': out}) except: raise HTTPError(500) self.finish() req = OpenStackRequest(acc_name, 'GET', '/servers/detail') make_request_async(req, callback)
def _do_server_add(self): self._process['server_add'] = 1 dataserver = Accounts()[self._acc_name]['machines'][self._mach_name]['boot']['datamount'] # construct cloud-init script from build script cloud_init = self._settings['script'] cloud_init += '\n\n' # write to meta-data: nexel-ready=True #cloud_init += 'echo "#!/usr/bin/env python\n' cloud_init += 'echo "import urllib2 # adapt for python 3+\n' #TODO cloud_init += 'import json\n' cloud_init += '\n' cloud_init += 'tenant_id = \'%s\'\n' % self._auth['tenant_id'] cloud_init += 'username = \'%s\'\n' % self._auth['username'] cloud_init += 'password = \'%s\'\n' % self._auth['password'] cloud_init += 'auth_url = \'%s\'\n' % Settings()['os_auth_url'] cloud_init += 'nova_url = \'%s\'\n' % Settings()['os_nova_url'] cloud_init += '\n' cloud_init += 'headers = {\'Content-Type\': \'application/json\'}\n' cloud_init += 'body = {\'auth\' :{\'passwordCredentials\': {\'username\': username, \'password\': password}, \'tenantId\': tenant_id}}\n' cloud_init += 'url = auth_url+\'/tokens\'\n' cloud_init += 'req = urllib2.Request(url, headers=headers, data=json.dumps(body))\n' cloud_init += 'resp = urllib2.urlopen(req)\n' cloud_init += 'j = json.loads(resp.read())\n' cloud_init += 'token = j[\'access\'][\'token\'][\'id\']\n' cloud_init += '\n' cloud_init += 'url = \'http://169.254.169.254/openstack/2012-08-10/meta_data.json\'\n' cloud_init += 'req = urllib2.Request(url)\n' cloud_init += 'resp = urllib2.urlopen(req)\n' cloud_init += 'j = json.loads(resp.read())\n' cloud_init += 'server_id = j[\'uuid\']\n' cloud_init += '\n' cloud_init += 'headers[\'X-Auth-Token\'] = token\n' cloud_init += 'body = {\'metadata\': {\'nexel-ready\': \'True\'}}\n' cloud_init += 'url = nova_url+\'/\'+tenant_id+\'/servers/\'+server_id+\'/metadata\'\n' cloud_init += 'req = urllib2.Request(url, headers=headers, data=json.dumps(body))\n' cloud_init += 'resp = urllib2.urlopen(req)\n' cloud_init += '" > ~/nexel-ready.py\n' cloud_init += 'python ~/nexel-ready.py\n' cloud_init += 'rm -rf ~/nexel-ready.py\n' template = Template(cloud_init) cloud_init_vars = { 'reposDomain' : Datamounts()[dataserver]['server']['domain'], 'keyPrivate' : self._key_priv } # boot the server, get srv_id # mach = self._settings body = {'server': {'name': self._mach_name, 'imageRef': self._settings['image_id'], 'flavorRef': self._settings['flavor_id'], #'security_groups': [{'name': 'ssh'}], #'key_name': 'Web-Keypair', 'user_data': base64.b64encode(template.render(cloud_init_vars)), 'metadata': {'nexel-type': 'snapshot', 'nexel-ready': 'False'}}} def callback(resp): try: logger.debug(resp.body) if resp.code == 413: logger.error('error quota exceeded 413') self._error(413) return j = json.loads(resp.body) server_id = j['server']['id'] assert(server_id != '') except: logger.exception(e) self._error(500) return logger.debug("Added the server succesfully") self._server_id = server_id self._process['server_add'] = 2 self._continue() req = OpenStackRequest(self._acc_name, 'POST', '/servers', body=body) make_request_async(req, callback)
self._error(413) return j = json.loads(resp.body) server_id = j["server"]["id"] assert server_id != "" except Exception, e: logger.exception(e) self._error(500) return self._server_id = server_id self._process["server_add"] = 2 logger.debug("(2) ...launch of the instance successful (%s)" % self._server_id) self._continue() req = OpenStackRequest(self._acc_name, "POST", "/servers", body=body) make_request_async(req, callback) def _do_server_ip_op(self): """Retrieves the instance's IP address""" def callback(resp): """ Callback method for the asynchronous retrieval of the IP address resp : the response of the Nectar cloud """ try: j = json.loads(resp.body) addr = j["server"]["addresses"] self._ip_address = addr[addr.keys()[0]][0]["addr"] self._process["server_ip"] = 2 except Exception, e: