diff options
author | Harry Huang <huangxiangyu5@huawei.com> | 2018-10-30 11:07:30 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@opnfv.org> | 2018-10-30 11:07:30 +0000 |
commit | 7d85ab67f8f50f74b3cf3d037b09974b1b7bd428 (patch) | |
tree | e16bcc9244d1d7e6c0c281e36836ae911a1a94ff /compass-tasks-base | |
parent | 3a901b963ff7e5d56f65a3581563835da6765202 (diff) | |
parent | f89ef9a9ee968c778af3444c7f9d2a39489fcf2b (diff) |
Merge "Manage host power from cobbler"
Diffstat (limited to 'compass-tasks-base')
-rw-r--r-- | compass-tasks-base/apiclient/restful.py | 24 | ||||
-rw-r--r-- | compass-tasks-base/db/api/cluster.py | 6 | ||||
-rw-r--r-- | compass-tasks-base/db/api/machine.py | 24 | ||||
-rw-r--r-- | compass-tasks-base/db/api/switch.py | 22 | ||||
-rw-r--r-- | compass-tasks-base/db/api/utils.py | 35 | ||||
-rw-r--r-- | compass-tasks-base/db/models.py | 15 | ||||
-rw-r--r-- | compass-tasks-base/deployment/deploy_manager.py | 29 | ||||
-rw-r--r-- | compass-tasks-base/deployment/installers/config_manager.py | 22 | ||||
-rw-r--r-- | compass-tasks-base/deployment/installers/os_installers/cobbler/cobbler.py | 28 | ||||
-rw-r--r-- | compass-tasks-base/deployment/utils/constants.py | 4 |
10 files changed, 119 insertions, 90 deletions
diff --git a/compass-tasks-base/apiclient/restful.py b/compass-tasks-base/apiclient/restful.py index bb82922..f5d4855 100644 --- a/compass-tasks-base/apiclient/restful.py +++ b/compass-tasks-base/apiclient/restful.py @@ -231,7 +231,7 @@ class Client(object): return self._get('/switches/%s/machines-hosts' % switch_id, data=data) def add_switch_machine(self, switch_id, mac=None, port=None, - vlans=None, ipmi_credentials=None, + vlans=None, power_manage=None, tag=None, location=None, raw_data=None): data = {} if raw_data: @@ -246,8 +246,8 @@ class Client(object): if vlans: data['vlans'] = vlans - if ipmi_credentials: - data['ipmi_credentials'] = ipmi_credentials + if power_manage: + data['power_manage'] = power_manage if tag: data['tag'] = tag @@ -258,7 +258,7 @@ class Client(object): return self._post('/switches/%s/machines' % switch_id, data=data) def update_switch_machine(self, switch_id, machine_id, port=None, - vlans=None, ipmi_credentials=None, tag=None, + vlans=None, power_manage=None, tag=None, location=None, raw_data=None): data = {} if raw_data: @@ -270,8 +270,8 @@ class Client(object): if vlans: data['vlans'] = vlans - if ipmi_credentials: - data['ipmi_credentials'] = ipmi_credentials + if power_manage: + data['power_manage'] = power_manage if tag: data['tag'] = tag @@ -412,14 +412,14 @@ class Client(object): return self._get('/machines/%s' % machine_id, data=data) - def update_machine(self, machine_id, ipmi_credentials=None, tag=None, + def update_machine(self, machine_id, power_manage=None, tag=None, location=None, raw_data=None): data = {} if raw_data: data = raw_data else: - if ipmi_credentials: - data['ipmi_credentials'] = ipmi_credentials + if power_manage: + data['power_manage'] = power_manage if tag: data['tag'] = tag @@ -429,15 +429,15 @@ class Client(object): return self._put('/machines/%s' % machine_id, data=data) - def patch_machine(self, machine_id, ipmi_credentials=None, + def patch_machine(self, machine_id, power_manage=None, tag=None, location=None, raw_data=None): data = {} if raw_data: data = raw_data else: - if ipmi_credentials: - data['ipmi_credentials'] = ipmi_credentials + if power_manage: + data['power_manage'] = power_manage if tag: data['tag'] = tag diff --git a/compass-tasks-base/db/api/cluster.py b/compass-tasks-base/db/api/cluster.py index 9a0b8f0..82bcaab 100644 --- a/compass-tasks-base/db/api/cluster.py +++ b/compass-tasks-base/db/api/cluster.py @@ -48,9 +48,9 @@ RESP_CLUSTERHOST_FIELDS = [ 'cluster_id', 'clustername', 'location', 'tag', 'networks', 'mac', 'switch_ip', 'port', 'switches', 'os_installed', 'distributed_system_installed', - 'os_name', 'os_id', 'ip', - 'reinstall_os', 'reinstall_distributed_system', - 'owner', 'cluster_id', 'ipmi_credentials', + 'os_name', 'os_id', 'ip', 'reinstall_os', + 'reinstall_distributed_system', 'owner', 'cluster_id', + 'power_type', 'power_manage', 'created_at', 'updated_at', 'patched_roles' ] diff --git a/compass-tasks-base/db/api/machine.py b/compass-tasks-base/db/api/machine.py index 4222288..5b3cea0 100644 --- a/compass-tasks-base/db/api/machine.py +++ b/compass-tasks-base/db/api/machine.py @@ -29,20 +29,20 @@ from compass.utils import util MACHINE_PRIMARY_FILEDS = ['mac', 'owner_id'] SUPPORTED_FIELDS = [ - 'mac', 'tag', 'location', 'ipmi_credentials', - 'machine_attributes', 'owner_id'] + 'mac', 'tag', 'location', 'power_manage', + 'machine_attributes', 'owner_id', 'power_type'] IGNORE_FIELDS = ['id', 'created_at', 'updated_at'] UPDATED_FIELDS = [ - 'ipmi_credentials', 'machine_attributes', - 'tag', 'location'] + 'mac', 'tag', 'location', 'power_manage', + 'machine_attributes', 'power_type'] PATCHED_FIELDS = [ - 'patched_ipmi_credentials', 'patched_tag', + 'patched_power_manage', 'patched_tag', 'patched_location' ] RESP_FIELDS = [ - 'id', 'mac', 'ipmi_credentials', 'switches', 'switch_ip', + 'id', 'mac', 'power_manage', 'switches', 'switch_ip', 'port', 'vlans', 'machine_attributes', 'owner_id', - 'tag', 'location', 'created_at', 'updated_at' + 'tag', 'location', 'power_type', 'created_at', 'updated_at' ] RESP_DEPLOY_FIELDS = [ 'status', 'machine' @@ -149,7 +149,7 @@ def _update_machine(machine_id, session=None, **kwargs): optional_support_keys=UPDATED_FIELDS, ignore_support_keys=IGNORE_FIELDS ) -@utils.input_validates(ipmi_credentials=utils.check_ipmi_credentials) +@utils.input_validates(power_manage=utils.check_power_manage) @database.run_in_session() @user_api.check_user_permission( permission.PERMISSION_ADD_MACHINE @@ -161,11 +161,11 @@ def update_machine(machine_id, user=None, session=None, **kwargs): ) -# replace [ipmi_credentials, tag, location] to -# [patched_ipmi_credentials, patched_tag, patched_location] +# replace [power_manage, tag, location] to +# [patched_power_manage, patched_tag, patched_location] # in kwargs. It tells db these fields will be patched. @utils.replace_filters( - ipmi_credentials='patched_ipmi_credentials', + power_manage='patched_power_manage', tag='patched_tag', location='patched_location' ) @@ -174,7 +174,7 @@ def update_machine(machine_id, user=None, session=None, **kwargs): ignore_support_keys=IGNORE_FIELDS ) @database.run_in_session() -@utils.output_validates(ipmi_credentials=utils.check_ipmi_credentials) +@utils.output_validates(power_manage=utils.check_power_manage) @user_api.check_user_permission( permission.PERMISSION_ADD_MACHINE ) diff --git a/compass-tasks-base/db/api/switch.py b/compass-tasks-base/db/api/switch.py index 647eec0..92d7a7f 100644 --- a/compass-tasks-base/db/api/switch.py +++ b/compass-tasks-base/db/api/switch.py @@ -58,17 +58,17 @@ UPDATED_FILTERS_FIELDS = ['put_machine_filters'] PATCHED_FILTERS_FIELDS = ['patched_machine_filters'] ADDED_MACHINES_FIELDS = ['mac'] OPTIONAL_ADDED_MACHINES_FIELDS = [ - 'ipmi_credentials', 'tag', 'location', 'owner_id' + 'power_manage', 'tag', 'location', 'owner_id' ] ADDED_SWITCH_MACHINES_FIELDS = ['port'] OPTIONAL_ADDED_SWITCH_MACHINES_FIELDS = ['vlans'] UPDATED_MACHINES_FIELDS = [ - 'ipmi_credentials', + 'power_manage', 'tag', 'location' ] UPDATED_SWITCH_MACHINES_FIELDS = ['port', 'vlans', 'owner_id'] PATCHED_MACHINES_FIELDS = [ - 'patched_ipmi_credentials', + 'patched_power_manage', 'patched_tag', 'patched_location' ] PATCHED_SWITCH_MACHINES_FIELDS = ['patched_vlans'] @@ -85,13 +85,13 @@ RESP_ACTION_FIELDS = [ RESP_MACHINES_FIELDS = [ 'id', 'switch_id', 'switch_ip', 'machine_id', 'switch_machine_id', 'port', 'vlans', 'mac', 'owner_id', - 'ipmi_credentials', 'tag', 'location', + 'power_manage', 'tag', 'location', 'created_at', 'updated_at' ] RESP_MACHINES_HOSTS_FIELDS = [ 'id', 'switch_id', 'switch_ip', 'machine_id', 'switch_machine_id', 'port', 'vlans', 'mac', - 'ipmi_credentials', 'tag', 'location', 'ip', + 'power_manage', 'tag', 'location', 'ip', 'name', 'hostname', 'os_name', 'owner', 'os_installer', 'reinstall_os', 'os_installed', 'clusters', 'created_at', 'updated_at' @@ -988,13 +988,13 @@ def update_switchmachine(switch_machine_id, user=None, session=None, **kwargs): ) -# replace [vlans, ipmi_credentials, tag, location] to -# [patched_vlans, patched_ipmi_credentials, patched_tag, +# replace [vlans, power_manage, tag, location] to +# [patched_vlans, patched_power_manage, patched_tag, # patched_location] in kwargs. It tells db these fields will # be patched. @utils.replace_filters( vlans='patched_vlans', - ipmi_credentials='patched_ipmi_credentials', + power_manage='patched_power_manage', tag='patched_tag', location='patched_location' ) @@ -1024,13 +1024,13 @@ def patch_switch_machine( ) -# replace [vlans, ipmi_credentials, tag, location] to -# [patched_vlans, patched_ipmi_credentials, patched_tag, +# replace [vlans, power_manage, tag, location] to +# [patched_vlans, patched_power_manage, patched_tag, # patched_location] in kwargs. It tells db these fields will # be patched. @utils.replace_filters( vlans='patched_vlans', - ipmi_credentials='patched_ipmi_credentials', + power_manage='patched_power_manage', tag='patched_tag', location='patched_location' ) diff --git a/compass-tasks-base/db/api/utils.py b/compass-tasks-base/db/api/utils.py index a44f26e..ef975ef 100644 --- a/compass-tasks-base/db/api/utils.py +++ b/compass-tasks-base/db/api/utils.py @@ -1208,42 +1208,41 @@ def check_name(name): ) -def _check_ipmi_credentials_ip(ip): +def _check_power_manage_ip(ip): check_ip(ip) -def check_ipmi_credentials(ipmi_credentials): - """Check ipmi credentials format is correct.""" - if not ipmi_credentials: +def check_power_manage(power_manage): + """Check power manage format is correct.""" + if not power_manage: return - if not isinstance(ipmi_credentials, dict): + if not isinstance(power_manage, dict): raise exception.InvalidParameter( - 'invalid ipmi credentials %s' % ipmi_credentials - + 'invalid power manage %s' % power_manage ) - for key in ipmi_credentials: + for key in power_manage: if key not in ['ip', 'username', 'password']: raise exception.InvalidParameter( - 'unrecognized field %s in ipmi credentials %s' % ( - key, ipmi_credentials + 'unrecognized field %s in power manage %s' % ( + key, power_manage ) ) for key in ['ip', 'username', 'password']: - if key not in ipmi_credentials: + if key not in power_manage: raise exception.InvalidParameter( - 'no field %s in ipmi credentials %s' % ( - key, ipmi_credentials + 'no field %s in power manage %s' % ( + key, power_manage ) ) - check_ipmi_credential_field = '_check_ipmi_credentials_%s' % key + check_power_manage_field = '_check_power_manage_%s' % key this_module = globals() - if check_ipmi_credential_field in this_module: - this_module[check_ipmi_credential_field]( - ipmi_credentials[key] + if check_power_manage_field in this_module: + this_module[check_power_manage_field]( + power_manage[key] ) else: logging.debug( - 'function %s is not defined', check_ipmi_credential_field + 'function %s is not defined', check_power_manage_field ) diff --git a/compass-tasks-base/db/models.py b/compass-tasks-base/db/models.py index 929f4dc..e312f61 100644 --- a/compass-tasks-base/db/models.py +++ b/compass-tasks-base/db/models.py @@ -1533,10 +1533,11 @@ class Machine(BASE, HelperMixin, TimestampMixin): __tablename__ = 'machine' id = Column(Integer, primary_key=True) mac = Column(JSONEncoded, nullable=False) - ipmi_credentials = Column(JSONEncoded, default={}) tag = Column(JSONEncoded, default={}) location = Column(JSONEncoded, default={}) owner_id = Column(Integer, nullable=True) + power_type = Column(String(10), default="ipmilan") + power_manage = Column(JSONEncoded, default={}) machine_attributes = Column(JSONEncoded, default={}) switch_machines = relationship( @@ -1572,15 +1573,15 @@ class Machine(BASE, HelperMixin, TimestampMixin): ) @property - def patched_ipmi_credentials(self): - return self.ipmi_credentials + def patched_power_manage(self): + return self.power_manage - @patched_ipmi_credentials.setter - def patched_ipmi_credentials(self, value): + @patched_power_manage.setter + def patched_power_manage(self, value): if not value: return - ipmi_credentials = copy.deepcopy(self.ipmi_credentials) - self.ipmi_credentials = util.merge_dict(ipmi_credentials, value) + power_manage = copy.deepcopy(self.power_manage) + self.power_manage = util.merge_dict(power_manage, value) @property def patched_tag(self): diff --git a/compass-tasks-base/deployment/deploy_manager.py b/compass-tasks-base/deployment/deploy_manager.py index baf7cd6..225c31e 100644 --- a/compass-tasks-base/deployment/deploy_manager.py +++ b/compass-tasks-base/deployment/deploy_manager.py @@ -111,7 +111,34 @@ class DeployManager(object): self.os_installer.set_package_installer_config(pk_installer_config) # start to deploy OS - return self.os_installer.deploy() + result = self.os_installer.deploy() + self.reset_server() + + return result + + def poweron_server(self): + if not self.os_installer: + return + + host_id_list = self.os_installer.config_manager.get_host_id_list() + for host_id in host_id_list: + self.os_installer.poweron(host_id) + + def poweroff_server(self): + if not self.os_installer: + return + + host_id_list = self.os_installer.config_manager.get_host_id_list() + for host_id in host_id_list: + self.os_installer.poweroff(host_id) + + def reset_server(self): + if not self.os_installer: + return + + host_id_list = self.os_installer.config_manager.get_host_id_list() + for host_id in host_id_list: + self.os_installer.reset(host_id) def deploy_target_system(self): """Deploy target system to all hosts in the cluster. diff --git a/compass-tasks-base/deployment/installers/config_manager.py b/compass-tasks-base/deployment/installers/config_manager.py index d3b28e0..ebee727 100644 --- a/compass-tasks-base/deployment/installers/config_manager.py +++ b/compass-tasks-base/deployment/installers/config_manager.py @@ -169,8 +169,8 @@ class HostInfo(object): self.package_config = self.host_info.setdefault(const.PK_CONFIG, {}) self.roles = self.host_info.setdefault(const.ROLES, []) self.patched_roles = self.host_info.setdefault(const.PATCHED_ROLES, []) - self.ipmi = deepcopy(self.host_info.setdefault(const.IPMI, {})) - self.ipmi_credentials = deepcopy(self.host_info.setdefault(const.IPMI_CREDS, {})) + self.power_type = deepcopy(self.host_info.setdefault(const.POWER_TYPE, {})) + self.power_manage = deepcopy(self.host_info.setdefault(const.POWER_MANAGE, {})) self.reinstall_os_flag = self.host_info.get(const.REINSTALL_OS_FLAG) self.deployed_os_config = self.host_info.setdefault( const.DEPLOYED_OS_CONFIG, {} @@ -276,7 +276,8 @@ class HostInfo(object): def baseinfo(self): return { const.REINSTALL_OS_FLAG: self.reinstall_os_flag, - const.IPMI_CREDS: self.ipmi_credentials, + const.POWER_TYPE: self.power_type, + const.POWER_MANAGE: self.power_manage, const.MAC_ADDR: self.mac, const.NAME: self.name, const.HOSTNAME: self.hostname, @@ -516,14 +517,15 @@ class BaseConfigManager(object): self.validate_host(host_id) return self.hosts_info[host_id].roles_mapping - def get_host_ipmi_info(self, host_id): + def get_host_power_info(self, host_id): self.validate_host(host_id) - if self.hosts_info[host_id].ipmi: + if self.hosts_info[host_id].power_manage: return ( - self.hosts_info[host_id].ipmi[const.IP_ADDR], - self.hosts_info[host_id].ipmi - [const.IPMI_CREDS][const.USERNAME], - self.hosts_info[host_id].ipmi - [const.IPMI_CREDS][const.USERNAME]) + self.hosts_info[host_id].power_manage + [const.IP_ADDR], + self.hosts_info[host_id].power_manage + [const.USERNAME], + self.hosts_info[host_id].power_manage + [const.PASSWORD]) else: return (None, None, None) diff --git a/compass-tasks-base/deployment/installers/os_installers/cobbler/cobbler.py b/compass-tasks-base/deployment/installers/os_installers/cobbler/cobbler.py index 9c2a935..aa74f68 100644 --- a/compass-tasks-base/deployment/installers/os_installers/cobbler/cobbler.py +++ b/compass-tasks-base/deployment/installers/os_installers/cobbler/cobbler.py @@ -397,25 +397,25 @@ class CobblerInstaller(OSInstaller): return cluster_vas_dict - def _check_and_set_system_impi(self, host_id, sys_id): + def _check_and_set_system_power(self, host_id, sys_id): if not sys_id: logging.info("System is None!") return False system = self.dump_system_info(host_id) - if system[self.POWER_TYPE] != 'ipmilan' or not system[self.POWER_USER]: + if not system.get(self.POWER_TYPE): # Set sytem power type to ipmilan if needs and set IPMI info - ipmi_info = self.config_manager.get_host_ipmi_info(host_id) - if not ipmi_info: + power_info = self.config_manager.get_host_power_info(host_id) + if not power_info: logging.info('No IPMI information found! Failed power on.') return False - ipmi_ip, ipmi_user, ipmi_pass = ipmi_info + ip, username, password = power_info power_opts = {} power_opts[self.POWER_TYPE] = 'ipmilan' - power_opts[self.POWER_ADDR] = ipmi_ip - power_opts[self.POWER_USER] = ipmi_user - power_opts[self.POWER_PASS] = ipmi_pass + power_opts[self.POWER_ADDR] = ip + power_opts[self.POWER_USER] = username + power_opts[self.POWER_PASS] = password self._update_system_config(sys_id, power_opts) @@ -424,26 +424,26 @@ class CobblerInstaller(OSInstaller): def poweron(self, host_id): hostname = self.config_manager.get_hostname(host_id) sys_id = self._get_create_system(hostname) - if not self._check_and_set_system_impi(sys_id): + if not self._check_and_set_system_power(host_id, sys_id): return - self.remote.power_system(sys_id, self.token, power='on') + self.remote.power_system(sys_id, 'on', self.token) logging.info("Host with ID=%d starts to power on!" % host_id) def poweroff(self, host_id): hostname = self.config_manager.get_hostname(host_id) sys_id = self._get_create_system(hostname) - if not self._check_and_set_system_impi(sys_id): + if not self._check_and_set_system_power(host_id, sys_id): return - self.remote.power_system(sys_id, self.token, power='off') + self.remote.power_system(sys_id, 'off', self.token) logging.info("Host with ID=%d starts to power off!" % host_id) def reset(self, host_id): hostname = self.config_manager.get_hostname(host_id) sys_id = self._get_create_system(hostname) - if not self._check_and_set_system_impi(sys_id): + if not self._check_and_set_system_power(host_id, sys_id): return - self.remote.power_system(sys_id, self.token, power='reboot') + self.remote.power_system(sys_id, 'reboot', self.token) logging.info("Host with ID=%d starts to reboot!" % host_id) diff --git a/compass-tasks-base/deployment/utils/constants.py b/compass-tasks-base/deployment/utils/constants.py index e90b1b2..18ee56a 100644 --- a/compass-tasks-base/deployment/utils/constants.py +++ b/compass-tasks-base/deployment/utils/constants.py @@ -54,8 +54,8 @@ DOMAIN = 'domain' HOST_ID = 'host_id' HOSTNAME = 'hostname' IP_ADDR = 'ip' -IPMI = 'ipmi' -IPMI_CREDS = 'ipmi_credentials' +POWER_TYPE = 'power_type' +POWER_MANAGE = 'power_manage' MAC_ADDR = 'mac' MGMT_NIC_FLAG = 'is_mgmt' NETMASK = 'netmask' |