def get(self, vm_name=None): """get info on virtual machine(s)""" data = [] #if no vm name get all if vm_name == None: #get list of all inactive and active vm_defined_list = self.conn.listDefinedDomains() vm_active_list = self.conn.listDomainsID() #iterate over these lists and get some info on each domain for vmid in vm_active_list: dom = self.conn.lookupByID(vmid) data.append(dom.XMLDesc(3)) for name in vm_defined_list: dom = self.conn.lookupByName(name) data.append(dom.XMLDesc(3)) else: vm_name = common.validate_hostname(vm_name) try: dom = self.conn.lookupByName(vm_name) except libvirt.libvirtError: result = common.process_results(data, 'VM') self.log.debug('Result: %s' % result) return result info = dom.XMLDesc(3) data.append(info) #self.conn.close() # Connection closing left to calling app - bad? result = common.process_results(data, 'VM') self.log.debug('Result: %s' % result) return result
def get(self): """Retrieve subnet information; return results list.""" if not (self.network and self.mask): # Retrive all subnets data = self.KV.keys() result = common.process_results(data, 'Subnet') self.log.debug('Result: %s' % result) return result data = [] obj = self.kv_name attributes = {} attributes['free'] = [self.KV.scard(self.kv_free)] attributes['aloc'] = [self.KV.scard(self.kv_aloc)] if attributes['free'] == [0] and attributes ['aloc'] == [0]: result = common.process_results(data, 'Subnet') self.log.debug('Result: %s' % result) return result try: free = attributes['free'][0] except KeyError: free = 0 try: aloc = attributes['aloc'][0] except KeyError: aloc = 0 msg = 'Subnet %s/%s found; %s free and %s pre-allocated IP addresses' % \ (self.kv_name, str(self.mask), free, aloc) self.log.debug(msg) item = (obj, attributes) data.append(item) result = common.process_results(data, 'Subnet') self.log.debug('Result: %s' % result) return result
def get(self): """Retrieve subnet information; return results list.""" if not (self.network and self.mask): # Retrive all subnets data = self.KV.keys() result = common.process_results(data, 'Subnet') self.log.debug('Result: %s' % result) return result data = [] obj = self.kv_name attributes = {} attributes['free'] = [self.KV.scard(self.kv_free)] attributes['aloc'] = [self.KV.scard(self.kv_aloc)] if attributes['free'] == [0] and attributes['aloc'] == [0]: result = common.process_results(data, 'Subnet') self.log.debug('Result: %s' % result) return result try: free = attributes['free'][0] except KeyError: free = 0 try: aloc = attributes['aloc'][0] except KeyError: aloc = 0 msg = 'Subnet %s/%s found; %s free and %s pre-allocated IP addresses' % \ (self.kv_name, str(self.mask), free, aloc) self.log.debug(msg) item = (obj, attributes) data.append(item) result = common.process_results(data, 'Subnet') self.log.debug('Result: %s' % result) return result
def get(self, lv_name=None): """Get logical volume; return list of volume attributes.""" if lv_name is not None: lv_name = common.validate_hostname(lv_name) # LV names are always hostnames args = ['lvs', '--noheadings', '--units', self.lv_units, '-o', 'lv_name,lv_size', '--separator', ':', '/dev/%s/%s' % (self.vg_name, lv_name)] else: args = ['lvs', '--noheadings', '--units', self.lv_units, '-o', 'lv_name,lv_size', '--separator', ':', '/dev/%s' % self.vg_name] str_args = " ".join(args) msg = "Running " + str_args self.log.debug(msg) try: result = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True) except Exception: msg = 'Running command %s failed' % str_args #trace = traceback.format_exec() raise error.SpokeError, msg out = result.communicate() (stdout, stderr) = (out[0], out[1]) msg = "Command stdout was: %s, stderr was: %s" % (stdout, stderr) self.log.debug(msg) data = [] # Errors we know about if "Volume group \"%s\" not found" % self.vg_name in stderr: msg = "Volume group '%s' was not found." % self.vg_name raise error.NotFound(msg) elif "logical volume(s) not found" in stderr: result = common.process_results(data) self.log.debug('Result: %s' % result) return result elif stderr == "" and stdout == "": result = common.process_results(data) self.log.debug('Result: %s' % result) return result # Catch unexpected errors if result.returncode != 0: msg = "Search command returned non-zero: %s stdout was: %s, stderr was: %s" % \ (result.returncode, stdout, stderr) raise error.LVMError(msg) output = stdout.strip() output = re.compile('\n').split(output) for item in output: item = item.strip() dic = {} name, size = item.split(':') dic['lv_size'] = size dic['lv_name'] = name data.append(dic) result = common.process_results(data) self.log.debug('Result: %s' % result) return result
def get(self): """Retrieve a certificate request; return results object.""" # TODO Put this in a dir walk loop so it supports multiple reqs data = [] item = {} try: req = X509.load_request(self.req_file) except IOError: result = common.process_results(data, 'Request') return result item['req_cn'] = req.get_subject().CN item['req_as_pem'] = req.as_pem() pkey = req.get_pubkey() if req.verify(pkey): item['verify'] = 'success' data.append(item) result = common.process_results(data, 'Request') return result
def get(self): """Search for a CA; return a result object containing CA attributes.""" data = [] item = {} for directory in self.req_dirs: if not (os.path.exists(directory)): self.log.debug('Cannot find %s' % directory) result = common.process_results(data, 'CA') self.log.debug('Result: %s' % result) return result ca_info = self._get_ca_info() item.update(ca_info) item['ca_key'] = self.ca_key_file item['ca_cert_file'] = self.ca_cert_file item['ca_def_duration'] = self.ca_def_duration data.append(item) result = common.process_results(data, 'CA') self.log.debug('Result: %s' % result) return result
def get(self): """Retrieve a certificate; return results object.""" # TODO Put this in a dir walk loop so it supports multiple reqs data = [] item = {} try: cert = X509.load_cert(self.cert_file) except IOError: result = common.process_results(data, 'Certificate') self.log.debug('Result: %s' % result) return result item['cert_cn'] = cert.get_subject().CN item['cert_as_pem'] = cert.as_pem() item['verify'] = 'failure' if self._verify(): item['verify'] = 'success' data.append(item) result = common.process_results(data, 'Certificate') self.log.debug('Result: %s' % result) return result
def get(self): '''get the power state of a given vm''' data = [] item = {} state = self._lookupState(self.dom.info()[0]) item['vm_name'] = self.vm_name item['state'] = state data.append(item) self.log.debug(data) result = common.process_results(data, 'VM') #out = xml.xml_to_text(info, self.headers) #self.log.info(out) self.log.debug('Result: %s' % result) return result
def modify(self, reserve=False, release=False): """Reserve or release IP address from Subnet""" if not (self.network and self.mask): msg = 'Please specify ip and mask' raise error.InputError(msg) if not reserve and not release: msg = 'You must specify if you wish to reserve or release an IP' raise error.InputError(msg) if reserve and release: msg = 'You cannot simultaneously reserve and release an IP' raise error.InputError(msg) if reserve: offer = self._reserve_ip(reserve) result = common.process_results(offer) result['msg'] = 'Reserved ip(s) %s from %s' % (offer, self.kv_name) self.log.debug('Result: %s' % result) return result if release: self._release_ip(release) result = self.get() result['msg'] = 'Returned %s ip(s) to %s' % (release, self.kv_name) self.log.debug('Result: %s' % result) return result
def get(self, lv_name=None): """Get logical volume; return list of volume attributes.""" if lv_name is not None: lv_name = common.validate_hostname( lv_name) # LV names are always hostnames args = [ 'lvs', '--noheadings', '--units', self.lv_units, '-o', 'lv_name,lv_size', '--separator', ':', '/dev/%s/%s' % (self.vg_name, lv_name) ] else: args = [ 'lvs', '--noheadings', '--units', self.lv_units, '-o', 'lv_name,lv_size', '--separator', ':', '/dev/%s' % self.vg_name ] str_args = " ".join(args) msg = "Running " + str_args self.log.debug(msg) try: result = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True) except Exception: msg = 'Running command %s failed' % str_args #trace = traceback.format_exec() raise error.SpokeError, msg out = result.communicate() (stdout, stderr) = (out[0], out[1]) msg = "Command stdout was: %s, stderr was: %s" % (stdout, stderr) self.log.debug(msg) data = [] # Errors we know about if "Volume group \"%s\" not found" % self.vg_name in stderr: msg = "Volume group '%s' was not found." % self.vg_name raise error.NotFound(msg) elif "logical volume(s) not found" in stderr: result = common.process_results(data) self.log.debug('Result: %s' % result) return result elif stderr == "" and stdout == "": result = common.process_results(data) self.log.debug('Result: %s' % result) return result # Catch unexpected errors if result.returncode != 0: msg = "Search command returned non-zero: %s stdout was: %s, stderr was: %s" % \ (result.returncode, stdout, stderr) raise error.LVMError(msg) output = stdout.strip() output = re.compile('\n').split(output) for item in output: item = item.strip() dic = {} name, size = item.split(':') dic['lv_size'] = size dic['lv_name'] = name data.append(dic) result = common.process_results(data) self.log.debug('Result: %s' % result) return result
def search(self, mac=None, template=None): data = [] if mac is None and template is None: # Give me all macs and all templates #read the file system self.log.debug('Searching for all templates and macs under %s' % \ self.tftp_dir) file_list = os.listdir(self.tftp_dir) if len(file_list) == 0: result = common.process_results(data, self.type) self.log.debug('Result: %s' % result) return result item = {} for file in file_list: valid_template = False item_path = self.tftp_dir + file file_name = os.path.basename(item_path) if ".template" in file_name: valid_template = True file_name = file_name[3:] #use a regex to see if the file is a mac config pattern = re.compile('^([0-9a-fA-F]{2}[:-]){5}[0-9a-fA-F]{2}$') valid_mac = pattern.match(file_name) #if it's a mac add to list of macs if valid_mac and os.path.isfile(item_path): macs = file_name try: item["configs"] except KeyError: item["configs"] = [] # Initialise dict if not exist item["configs"].append(macs) elif valid_template and os.path.isfile(item_path): try: item["templates"] except KeyError: item["templates"] = [] # Initialise dict if not exist item["templates"].append(file) else: self.log.debug('Unknown file type %s, skipping' % file) elif mac is not None and template is None: # We're looking for a mac address mac = common.validate_mac(mac) mac_file = string.replace(mac, ":", "-") #Format for use on filesystem mac_file_name = self.tftp_prefix + mac_file mac_link = self.tftp_dir + mac_file_name if not os.path.isfile(mac_link): result = common.process_results(data, self.type) self.log.debug('Result: %s' % result) return result else: item = [mac_file_name] #item[mac_file_name] = "Found" elif template is not None and mac is None: #Now we just want to check if template exists, no longer maintaining list of links template = common.validate_filename(template) template = self._validate_template(template) item = [template] else: msg = "please specify nothing, mac or target (not mac and target)." raise error.InputError, msg data.append(item) result = common.process_results(data, self.type) self.log.debug('Result: %s' % result) return result