def add_product(self, product_name, product_description, attributes, metadatas): """ Add a prodduct to the SDC @param product_name: the name of the product @param product_description: the description of the product @param attributes: the attributes of thw product @param metadatas: the metadata of teh product @return: (None if all OK / an error on failure), (The product / None of error) """ my_url = "%s/%s" % (self.sdc_url, "catalog/product") loggers.set_info_log(my_url) product = productrelease.Product(product_name, product_description) if attributes is not None: attributes_list = productrelease.process_attributes(attributes) for att in attributes_list: product.add_attribute(att) metadatas_list = productrelease.process_attributes(metadatas) for meta in metadatas_list: product.add_metadata(meta) payload = product.to_product_xml() print(EL.tostring(payload)) print(my_url) response = http.post(my_url, self.header2, EL.tostring(payload)) if response.status() is not 200: error = 'error to add the product sdc ' + str(response.status()) loggers.set_error_log(error) return error, None else: self.products.append(product) return None, product
def add_node_run_list(self, software): """ add the software to install into the list of the node @param software: The software @return: None if all OK or an error on failure """ puppet_master_url = models.Data.objects.get(key="puppet_master_url") software_name = software[0] version = software[1] uri = '%s/%s/%s/%s/%s/%s' % (puppet_master_url, 'install', self.tenant, self.name, software_name, version) loggers.set_info_log(uri) response = http.post(uri, self.headers, None) if response.status() != 200: msg = "Error adding the software to puppet" loggers.set_error_log( str(response.status) + ": " + msg + ": " + response.read()) return "Error" uri = '%s/%s/%s' % (puppet_master_url, 'generate', self.name) loggers.set_info_log(uri) response = http.post(uri, self.headers, "") if response.status() != 200: msg = "Error adding the software to puppet" loggers.set_error_log( str(response.status) + ": " + msg + ": " + response.read()) return "Error" return None
def update_master_server(self): """ Add the software into puppet-master or chef-server @return: None if all OK or an error on failure """ puppet_master_url = models.Data.objects.get(key="puppet_master_url") if self.repo == 'svn': uri = '%s/%s/%s' % ( puppet_master_url, 'download/svn', self.name) loggers.set_info_log("update puppet_master url: " + uri) elif self.repo == 'git': uri = u'{0:s}/{1:s}/{2:s}'.format(puppet_master_url, 'download/git', self.name) loggers.set_info_log("update puppet_master url: " + uri) else: msg = "The repository is not svn or git. " loggers.set_error_log(msg) return msg payload = "url=" + self.cookbook_url loggers.set_info_log("update puppet_master payload: " + payload) response = http.post(uri, self.headers, payload) if response.status() is not 200: msg = "Error downloading the puppet module into the puppet master" loggers.set_error_log(str(response.status) + ": " + msg + ": " + response.read()) return msg loggers.set_info_log(str( response.status) + ": Correctly download the module into the " "puppet master") return None
def add_node_run_list(self, software): """ add the software to install into the list of the node @param software: The software @return: None if all OK or an error on failure """ puppet_master_url = models.Data.objects.get(key="puppet_master_url") software_name = software[0] version = software[1] uri = '%s/%s/%s/%s/%s/%s' % (puppet_master_url, 'install', self.tenant, self.name, software_name, version) loggers.set_info_log(uri) response = http.post(uri, self.headers, None) if response.status() != 200: msg = "Error adding the software to puppet" loggers.set_error_log(str(response.status) + ": " + msg + ": " + response.read()) return "Error" uri = '%s/%s/%s' % (puppet_master_url, 'generate', self.name) loggers.set_info_log(uri) response = http.post(uri, self.headers, "") if response.status() != 200: msg = "Error adding the software to puppet" loggers.set_error_log(str(response.status) + ": " + msg + ": " + response.read()) return "Error" return None
def update_master_server(self): """ Add the software into puppet-master or chef-server @return: None if all OK or an error on failure """ puppet_master_url = models.Data.objects.get(key="puppet_master_url") if self.repo == 'svn': uri = '%s/%s/%s' % (puppet_master_url, 'download/svn', self.name) loggers.set_info_log("update puppet_master url: " + uri) elif self.repo == 'git': uri = u'{0:s}/{1:s}/{2:s}'.format(puppet_master_url, 'download/git', self.name) loggers.set_info_log("update puppet_master url: " + uri) else: msg = "The repository is not svn or git. " loggers.set_error_log(msg) return msg payload = "url=" + self.cookbook_url loggers.set_info_log("update puppet_master payload: " + payload) response = http.post(uri, self.headers, payload) if response.status() is not 200: msg = "Error downloading the puppet module into the puppet master" loggers.set_error_log( str(response.status) + ": " + msg + ": " + response.read()) return msg loggers.set_info_log( str(response.status) + ": Correctly download the module into the " "puppet master") return None
def delete_node_client(self): """ Delete the node from chef-server or puppet-master @return: None if all OK or an error on failure """ puppet_master_url = models.Data.objects.get(key="puppet_master_url") uri = '%s/%s/%s' % (puppet_master_url, 'delete/node', self.name) loggers.set_info_log("delete node: puppet_master url: " + uri) response = http.delete(uri, self.headers) if response.status() != 200: msg = "Error deleting node from puppet" loggers.set_error_log( str(response.status) + ": " + msg + ": " + response.read()) return "Error" return None
def delete_node_client(self): """ Delete the node from chef-server or puppet-master @return: None if all OK or an error on failure """ puppet_master_url = models.Data.objects.get(key="puppet_master_url") uri = '%s/%s/%s' % (puppet_master_url, 'delete/node', self.name) loggers.set_info_log("delete node: puppet_master url: " + uri) response = http.delete(uri, self.headers) if response.status() != 200: msg = "Error deleting node from puppet" loggers.set_error_log(str(response.status) + ": " + msg + ": " + response.read()) return "Error" return None
def get_vm(self, vm_id): """ Obtain data about a vm @param vm_id: the id of the VM @return: the info or None if cannot find the VM """ the_url = "%s/%s/%s" % (self.url_openstack, "servers", vm_id) response = http.get(the_url, self.header) if response.status is not 200 and response.status is not 202: loggers.set_error_log( str(response.status) + ': error to add the product') return None else: info = response.read() loggers.set_info_log(info) return info
def remove_master_server(self): """ Remove the software from puppet-master or chef-server @return: None if all OK or an error on failure """ puppet_master_url = models.Data.objects.get(key="puppet_master_url") uri = u'{0:s}/{1:s}/{2:s}'.format(puppet_master_url, 'delete/module', self.name) response = http.delete(uri, self.headers) if response.status() != 200: msg = "Error deleting the puppet module from the puppet master" loggers.set_error_log(str(response.status) + ": " + msg + ": " + response.read()) return msg loggers.set_info_log( str(response.status) + ": Correctly deleting the module from the " "puppet master") return None
def remove_master_server(self): """ Remove the software from puppet-master or chef-server @return: None if all OK or an error on failure """ puppet_master_url = models.Data.objects.get(key="puppet_master_url") uri = u'{0:s}/{1:s}/{2:s}'.format(puppet_master_url, 'delete/module', self.name) response = http.delete(uri, self.headers) if response.status() != 200: msg = "Error deleting the puppet module from the puppet master" loggers.set_error_log( str(response.status) + ": " + msg + ": " + response.read()) return msg loggers.set_info_log( str(response.status) + ": Correctly deleting the module from the " "puppet master") return None
def connect_ssh(self, ip): """ Go into a VM to check the software installation @param ip: The IP of the VM @return: None if all OK or an error on failure """ loggers.set_info_log("En el ssh") ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: ssh.connect(ip, username=self.sdc_user, password=str( models.Data.objects.get(key="ubuntu_password"))) except Exception: try: ssh.connect( ip, username=self.sdc_user, password=str( models.Data.objects.get(key="centos_password"))) except Exception: msg = 'Error connecting to the Chef-server for recipe ' \ 'execution' loggers.set_error_log(msg) return msg if self.manager == 'chef': stdin, stdout, stderr = ssh.exec_command('chef-client') stdin.flush() else: ssh.exec_command('service puppet stop') stdin, stdout, stderr = ssh.exec_command('servicepuppet agent -t') stdin.flush() result = '' for line in stdout: result += line.strip('\n') loggers.set_info_log(line.strip('\n')) ssh.close() if "FATAL" in result: msg = 'ERROR to execute the recipe' loggers.set_error_log(msg) return msg return None
def get_product_release(self, product_name): """ Obtain the product release from a product @param product_name: the name of the product @return: The version of the software """ my_url = "%s/%s/%s/%s" % ( self.sdc_url, "catalog/product", product_name, "release") response = http.get(my_url, self.header) if response.status() != 200: error = 'error to get the product ' + product_name + ' ' + str( response.status()) loggers.set_error_log(error) return None else: data = json.loads(response.read()) loggers.set_info_log(data) if data is None: return None return data['productRelease']['version']
def get_product_info(self, product_name): """ return the information from a product @param product_name: the product name @return: the product description """ the_url = "%s/%s/%s" % (self.sdc_url, "catalog/product", product_name) response = http.get(the_url, self.header) if response.status() != 200: loggers.set_error_log('error to get the product ' + product_name + ' ' + str(response.status())) return None else: data = json.loads(response.read()) loggers.set_info_log(data) try: description = data['description'] except Exception: return None return description
def get_product_release(self, product_name): """ Obtain the product release from a product @param product_name: the name of the product @return: The version of the software """ my_url = "%s/%s/%s/%s" % (self.sdc_url, "catalog/product", product_name, "release") response = http.get(my_url, self.header) if response.status() != 200: error = 'error to get the product ' + product_name + ' ' + str( response.status()) loggers.set_error_log(error) return None else: data = json.loads(response.read()) loggers.set_info_log(data) if data is None: return None return data['productRelease']['version']
def get_products(self): """ Obtain a list of the product's name @return:List od products """ my_url = "%s/%s" % (self.sdc_url, "catalog/product") loggers.set_info_log(my_url) response = http.get(my_url, self.header) if response.status() != 200: msg = "Error obtaining the token" loggers.set_error_log(msg) return "Error", msg else: data = json.loads(response.read()) products = data["product"] my_products = [] for product in products: var = product['name'] my_products.append(var) loggers.set_info_log(my_products) return None, my_products
def get_product_release_info(self, product_name, product_version): """ Obtain the information from a product release @param product_name: the product version @param product_version: the product release @return: The description of the product release """ my_url = "%s/%s/%s/%s/%s" % (self.sdc_url, "catalog/product", product_name, "release", product_version) response = http.get(my_url, self.header) if response.status() != 200: error = 'error to get the product ' + product_name + ' ' + str( response.status()) loggers.set_error_log(error) return None else: data = json.loads(response.read()) try: description = data['productRelease']['product']['description'] except Exception: return None return description
def connect_ssh(self, ip): """ Go into a VM to check the software installation @param ip: The IP of the VM @return: None if all OK or an error on failure """ loggers.set_info_log("En el ssh") ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: ssh.connect(ip, username=self.sdc_user, password=str( models.Data.objects.get(key="ubuntu_password"))) except Exception: try: ssh.connect(ip, username=self.sdc_user, password=str( models.Data.objects.get(key="centos_password"))) except Exception: msg = 'Error connecting to the Chef-server for recipe ' \ 'execution' loggers.set_error_log(msg) return msg if self.manager == 'chef': stdin, stdout, stderr = ssh.exec_command('chef-client') stdin.flush() else: ssh.exec_command('service puppet stop') stdin, stdout, stderr = ssh.exec_command('servicepuppet agent -t') stdin.flush() result = '' for line in stdout: result += line.strip('\n') loggers.set_info_log(line.strip('\n')) ssh.close() if "FATAL" in result: msg = 'ERROR to execute the recipe' loggers.set_error_log(msg) return msg return None
def get_product_release_info(self, product_name, product_version): """ Obtain the information from a product release @param product_name: the product version @param product_version: the product release @return: The description of the product release """ my_url = "%s/%s/%s/%s/%s" % ( self.sdc_url, "catalog/product", product_name, "release", product_version) response = http.get(my_url, self.header) if response.status() != 200: error = 'error to get the product ' + product_name + ' ' + str( response.status()) loggers.set_error_log(error) return None else: data = json.loads(response.read()) try: description = data['productRelease']['product']['description'] except Exception: return None return description
def test(self): """ Test the software into a VM @return: """ loggers.set_info_log("En el test de openstack") loggers.set_info_log("*************") loggers.set_info_log(self.name) loggers.set_info_log(self.so) loggers.set_info_log(self.cookbook) loggers.set_info_log("*************") chef_puppet = None software_install = '' if self.manager == 'chef': chef_puppet = chef_management.MINode(self.name) software_install = self.cookbook + '::' + self.version + "_install" if self.manager == 'pupet': chef_puppet = puppet_management.MINode(self.name, self.tenant) software_install = [self.cookbook, self.version] if self.token is None: msg = "Error: Cannot obtained the token" loggers.set_error_log(msg) return msg ip, server_id = self.deploy_vm() if ip is None: msg = server_id + ". Image id: " + self.so loggers.set_error_log(msg) return msg loggers.set_info_log("Correctly deployed VM withb image id: " + self.so) fip, fip_id = self.add_floating_ip(server_id) if fip is None: self.delete_vm(server_id) msg = "Error, cannot find floating IP: " + fip_id loggers.set_error_log(msg) return msg time.sleep(60) r = chef_puppet.add_node_run_list(software_install) if r is not None: self.rem_floating_ip(fip, server_id, fip_id) self.delete_vm(server_id) msg = 'Error installing software in a VM with image id: ' + \ self.so + '. Error: ' + r loggers.set_error_log(msg) return msg r = self.connect_ssh(fip) if r is not None: self.rem_floating_ip(fip, server_id, fip_id) self.delete_vm(server_id) chef_puppet.delete_node_client() msg = "Error testing the software: " + r loggers.set_error_log(msg) return msg loggers.set_info_log("Antes del delete") r = self.delete_vm(server_id) chef_puppet.delete_node_client() if r is not None: msg = "Error deleting the testing VM: " + r loggers.set_error_log(msg) return msg self.rem_floating_ip(fip, server_id, fip_id) return None
def test(self): """ Test the software into a VM @return: """ loggers.set_info_log("En el test de openstack") loggers.set_info_log("*************") loggers.set_info_log(self.name) loggers.set_info_log(self.so) loggers.set_info_log(self.cookbook) loggers.set_info_log("*************") chef_puppet = None software_install = '' if self.manager == 'chef': chef_puppet = chef_management.MINode(self.name) software_install = self.cookbook + '::' + self.version + "_install" if self.manager == 'pupet': chef_puppet = puppet_management.MINode(self.name, self.tenant) software_install = [self.cookbook, self.version] if self.token is None: msg = "Error: Cannot obtained the token" loggers.set_error_log(msg) return msg ip, server_id = self.deploy_vm() if ip is None: msg = server_id + ". Image id: " + self.so loggers.set_error_log(msg) return msg loggers.set_info_log( "Correctly deployed VM withb image id: " + self.so) fip, fip_id = self.add_floating_ip(server_id) if fip is None: self.delete_vm(server_id) msg = "Error, cannot find floating IP: " + fip_id loggers.set_error_log(msg) return msg time.sleep(60) r = chef_puppet.add_node_run_list(software_install) if r is not None: self.rem_floating_ip(fip, server_id, fip_id) self.delete_vm(server_id) msg = 'Error installing software in a VM with image id: ' + \ self.so + '. Error: ' + r loggers.set_error_log(msg) return msg r = self.connect_ssh(fip) if r is not None: self.rem_floating_ip(fip, server_id, fip_id) self.delete_vm(server_id) chef_puppet.delete_node_client() msg = "Error testing the software: " + r loggers.set_error_log(msg) return msg loggers.set_info_log("Antes del delete") r = self.delete_vm(server_id) chef_puppet.delete_node_client() if r is not None: msg = "Error deleting the testing VM: " + r loggers.set_error_log(msg) return msg self.rem_floating_ip(fip, server_id, fip_id) return None