class ScDedicatedServerInfo(object): def __init__(self, endpoint, token, name, fail_on_absent): self.api = ScApi(token, endpoint) self.server_id = name self.fail_on_absent = fail_on_absent @staticmethod def _is_server_ready(server_info): if (server_info.get('status') == 'active' and server_info.get('power_status') == 'powered_on' and server_info.get('operational_status') == 'normal'): return True else: return False def run(self): try: server_info = self.api.get_dedicated_servers(self.server_id) except APIError404 as e: if self.fail_on_absent: raise e return {'changed': False, 'found': False, 'ready': False} module_output = server_info module_output['found'] = True module_output['ready'] = self._is_server_ready(server_info) module_output['changed'] = False return module_output
class ScDedicatedServerReinstall(object): def __init__(self, endpoint, token, server_id, hostname, drives_layout_template, drives_layout, operating_system_id, ssh_keys, ssh_key_name, wait, update_interval, checkmode): if wait: if int(wait) < int(update_interval): raise ModuleError( f"Update interval ({update_interval}) is longer " f"than wait time ({wait}") self.api = ScApi(token, endpoint) self.old_server_data = None self.server_id = server_id self.hostname = self.get_hostname(hostname) self.drives_layout = self.get_drives_layout(drives_layout, drives_layout_template) self.operating_system_id = self.get_operating_system_id( operating_system_id) self.ssh_keys = self.get_ssh_keys(ssh_keys, ssh_key_name) self.wait = wait self.update_interval = update_interval self.checkmode = checkmode def get_server_data(self): if not self.old_server_data: self.old_server_data = \ self.api.get_dedicated_servers(self.server_id) def get_hostname(self, hostname): if hostname: return hostname self.get_server_data() if 'title' not in self.old_server_data: raise ModuleError( "Unable to retrive old title for the server. " "use hostname option to specify the hostname for reinstall.") return self.old_server_data['title'] def get_operating_system_id(self, operating_system_id): if operating_system_id: return operating_system_id self.get_server_data() cfg = self.old_server_data.get('configuration_details') if not cfg or 'operating_system_id' not in cfg: raise ModuleError( "no operating_system_id was given, and unable to get old" "operating_system_id") return cfg['operating_system_id'] def get_ssh_keys(self, ssh_keys, ssh_key_name): if ssh_keys: return ssh_keys if not ssh_key_name: return [] return [ self.api.toolbox.get_ssh_fingerprints_by_key_name(ssh_key_name, must=True) ] @staticmethod def get_drives_layout(layout, template): partitions_template = [{ "target": "/boot", "size": 500, "fill": False, "fs": "ext4" }, { "target": "swap", "size": 4096, "fill": False }, { "target": "/", "fill": True, "fs": "ext4" }] rai1_simple = [{ 'slot_positions': [0, 1], 'raid': 1, 'partitions': partitions_template }] raid0_simple = [{ 'slot_positions': [0], 'raid': 0, 'partitions': partitions_template }] templates = {'raid1-simple': rai1_simple, 'raid0-simple': raid0_simple} if layout: return layout if template not in templates: raise ModuleError("Invalid drives_layout_template.") else: return templates[template] def wait_for_server(self): ready = False start_time = time.time() elapsed = 0 while not ready: time.sleep(self.update_interval) elapsed = time.time() - start_time if elapsed > self.wait: raise WaitError(msg="Server is not ready.", timeout=elapsed) server_info = self.api.get_dedicated_servers(self.server_id) ready = ScDedicatedServerInfo._is_server_ready(server_info) server_info['ready'] = True server_info['elapsed'] = elapsed return server_info def run(self): if self.checkmode: return {'changed': True} result = self.api.post_dedicated_server_reinstall( server_id=self.server_id, hostname=self.hostname, operating_system_id=self.operating_system_id, ssh_key_fingerprints=self.ssh_keys, drives={ 'layout': self.drives_layout, }) if self.wait: result = self.wait_for_server() result['changed'] = True return result