def terminate_node(node_id, creds, params, provider_id): region = params.get('region', 'us-east-1') conn = create_ec2_connection( region, creds['access_key'], creds['secret_key']) if provider_id: conn.terminate_instances([provider_id]) i = conn.get_all_instances([provider_id])[0].instances[0] while(True): time.sleep(2) i.update() if i.state == "terminated": break # pull the node from the database node = Node.objects.get(uuid=node_id) chef_id = node.id node.provider_id = None node.fqdn = None node.metadata = {} node.save() # purge the node & client records from chef server client = ChefAPI(settings.CHEF_SERVER_URL, settings.CHEF_CLIENT_NAME, settings.CHEF_CLIENT_KEY) client.delete_node(chef_id) client.delete_client(chef_id)
def update_gitosis(databag_item_value): # update the data bag client = ChefAPI(settings.CHEF_SERVER_URL, settings.CHEF_CLIENT_NAME, settings.CHEF_CLIENT_KEY) client.update_databag_item('deis-build', 'gitosis', databag_item_value) # call a chef update subprocess.check_call( ['sudo', 'chef-client', '--override-runlist', 'recipe[deis::gitosis]'])
def update_formation(formation_id, databag_item_value): # update the data bag client = ChefAPI(settings.CHEF_SERVER_URL, settings.CHEF_CLIENT_NAME, settings.CHEF_CLIENT_KEY) # TODO: move this logic into the chef API resp, code = client.update_databag_item( 'deis-formations', formation_id, databag_item_value) if code == 200: return resp, code elif code == 404: resp, code = client.create_databag_item( 'deis-formations', formation_id, databag_item_value) if code != 201: msg = 'Failed to create data bag: {code} => {resp}' raise RuntimeError(msg.format(**locals())) else: msg = 'Failed to update data bag: {code} => {resp}' raise RuntimeError(msg.format(**locals()))
class ChefAPITest(unittest.TestCase): """Tests the client interface to Chef Server API.""" def setUp(self): self.client = ChefAPI( settings.TEST_CHEF_SERVER_URL, settings.TEST_CHEF_CLIENT_NAME, settings.TEST_CHEF_CLIENT_KEY) def test_databag(self): databag_name = 'testing' ditem_name = 'item1' ditem_value = {'something': 1, 'else': 2} # delete the databag to make sure we are creating a new one resp, status = self.client.delete_databag(databag_name) resp, status = self.client.create_databag(databag_name) self.assertEqual(status, 201) self.assertTrue(resp) resp = self.client.create_databag_item( databag_name, ditem_name, ditem_value) self.assertEqual(status, 201) self.assertTrue(resp) resp, status = self.client.get_databag(databag_name) self.assertEqual(status, 200) resp, status = self.client.get_databag_item(databag_name, ditem_name) self.assertEqual(status, 200) ditem_value = json.loads(resp) ditem_value['newvalue'] = 'databag' resp, status = self.client.update_databag_item( databag_name, ditem_name, ditem_value) self.assertEqual(status, 200) resp, status = self.client.get_databag_item(databag_name, ditem_name) self.assertEqual(status, 200) self.assertTrue('newvalue' in json.loads(resp))
class ChefAPITest(unittest.TestCase): """Tests the client interface to Chef Server API.""" def setUp(self): self.client = ChefAPI(settings.TEST_CHEF_SERVER_URL, settings.TEST_CHEF_CLIENT_NAME, settings.TEST_CHEF_CLIENT_KEY) def test_databag(self): databag_name = 'testing' ditem_name = 'item1' ditem_value = {'something': 1, 'else': 2} # delete the databag to make sure we are creating a new one resp, status = self.client.delete_databag(databag_name) resp, status = self.client.create_databag(databag_name) self.assertEqual(status, 201) self.assertTrue(resp) resp = self.client.create_databag_item(databag_name, ditem_name, ditem_value) self.assertEqual(status, 201) self.assertTrue(resp) resp, status = self.client.get_databag(databag_name) self.assertEqual(status, 200) resp, status = self.client.get_databag_item(databag_name, ditem_name) self.assertEqual(status, 200) ditem_value = json.loads(resp) ditem_value['newvalue'] = 'databag' resp, status = self.client.update_databag_item(databag_name, ditem_name, ditem_value) self.assertEqual(status, 200) resp, status = self.client.get_databag_item(databag_name, ditem_name) self.assertEqual(status, 200) self.assertTrue('newvalue' in json.loads(resp))
def terminate_node(node_id, creds, params, provider_id): region = params.get('region', 'us-east-1') conn = create_ec2_connection(creds, region) if provider_id: conn.terminate_instances([provider_id]) i = conn.get_all_instances([provider_id])[0].instances[0] while (True): time.sleep(2) i.update() if i.state == "terminated": break # delete the node from the database node = Node.objects.get(uuid=node_id) chef_id = node.id node.delete() # purge the node & client records from chef server client = ChefAPI(settings.CHEF_SERVER_URL, settings.CHEF_CLIENT_NAME, settings.CHEF_CLIENT_KEY) client.delete_node(chef_id) client.delete_client(chef_id)
def setUp(self): self.client = ChefAPI( settings.TEST_CHEF_SERVER_URL, settings.TEST_CHEF_CLIENT_NAME, settings.TEST_CHEF_CLIENT_KEY)
def launch_node(node_id, creds, params, init, ssh_username, ssh_private_key): region = params.get('region', 'us-east-1') conn = create_ec2_connection(region, creds['access_key'], creds['secret_key']) # find or create the security group for this formation sg_name = params['layer'] sg = conn.get_all_security_groups(sg_name)[0] # add the security group to the list params.setdefault('security_groups', []).append(sg.name) # retrieve the ami for launching this node image_id = params.get( 'image', getattr(settings, 'EC2_IMAGE_MAP', EC2_IMAGE_MAP)[region]) images = conn.get_all_images([image_id]) if len(images) != 1: raise LookupError('Could not find AMI: %s' % image_id) image = images[0] kwargs = prepare_run_kwargs(params, init) reservation = image.run(**kwargs) instances = reservation.instances boto = instances[0] # initial sleep time.sleep(10) boto.update() # try adding a tag boto.add_tag('Name', params['id']) # loop until running while (True): time.sleep(2) boto.update() if boto.state == 'running': break # update the node node = Node.objects.get(uuid=node_id) node.provider_id = boto.id node.fqdn = boto.public_dns_name node.metadata = format_metadata(boto) node.save() # wait 10 seconds for ssh daemon to come up time.sleep(10) # loop until cloud-init is finished ssh = util.connect_ssh(ssh_username, boto.public_dns_name, 22, ssh_private_key) initializing = True while initializing: time.sleep(10) initializing, _rc = util.exec_ssh( ssh, 'ps auxw | egrep "cloud-init" | grep -v egrep') # loop until node is registered with chef # if chef bootstrapping fails, the node will not complete registration if settings.CHEF_ENABLED: registered = False while not registered: # reinstatiate the client on each poll attempt # to avoid disconnect errors client = ChefAPI(settings.CHEF_SERVER_URL, settings.CHEF_CLIENT_NAME, settings.CHEF_CLIENT_KEY) resp, status = client.get_node(node.id) if status == 200: body = json.loads(resp) # wait until idletime is not null # meaning the node is registered if body.get('automatic', {}).get('idletime'): break time.sleep(5)
def launch_node(node_id, creds, params, init, ssh_username, ssh_private_key): region = params.get('region', 'us-east-1') conn = create_ec2_connection( region, creds['access_key'], creds['secret_key']) # find or create the security group for this formation sg_name = params['layer'] sg = conn.get_all_security_groups(sg_name)[0] # add the security group to the list params.setdefault('security_groups', []).append(sg.name) # retrieve the ami for launching this node image_id = params.get( 'image', getattr(settings, 'EC2_IMAGE_MAP', EC2_IMAGE_MAP)[region]) images = conn.get_all_images([image_id]) if len(images) != 1: raise LookupError('Could not find AMI: %s' % image_id) image = images[0] kwargs = prepare_run_kwargs(params, init) reservation = image.run(**kwargs) instances = reservation.instances boto = instances[0] # initial sleep time.sleep(10) boto.update() # try adding a tag boto.add_tag('Name', params['id']) # loop until running while(True): time.sleep(2) boto.update() if boto.state == 'running': break # update the node node = Node.objects.get(uuid=node_id) node.provider_id = boto.id node.fqdn = boto.public_dns_name node.metadata = format_metadata(boto) node.save() # loop until cloud-init is finished ssh = util.connect_ssh(ssh_username, boto.public_dns_name, 22, ssh_private_key) initializing = True while initializing: time.sleep(10) initializing, _rc = util.exec_ssh( ssh, 'ps auxw | egrep "cloud-init" | grep -v egrep') # loop until node is registered with chef # if chef bootstrapping fails, the node will not complete registration if settings.CHEF_ENABLED: registered = False while not registered: # reinstatiate the client on each poll attempt # to avoid disconnect errors client = ChefAPI(settings.CHEF_SERVER_URL, settings.CHEF_CLIENT_NAME, settings.CHEF_CLIENT_KEY) resp, status = client.get_node(node.id) if status == 200: body = json.loads(resp) # wait until idletime is not null # meaning the node is registered if body.get('automatic', {}).get('idletime'): break time.sleep(5)
def setUp(self): self.client = ChefAPI(settings.TEST_CHEF_SERVER_URL, settings.TEST_CHEF_CLIENT_NAME, settings.TEST_CHEF_CLIENT_KEY)
def destroy_formation(formation_id): client = ChefAPI(settings.CHEF_SERVER_URL, settings.CHEF_CLIENT_NAME, settings.CHEF_CLIENT_KEY) _resp, _code = client.delete_databag_item('deis-formations', formation_id) subprocess.check_call(['sudo', 'chef-client', '--override-runlist', 'recipe[deis::gitosis]'])