def create_nodes(cluster, hosts_dict): hosts = [] new_nodes = [] for host_dict in hosts_dict: zone = Zone.objects.get(name=host_dict["zone_name"]) defaults = { "name": host_dict['name'], "ip": host_dict['ip'], "zone": zone, "status": Host.HOST_STATUS_CREATING, "auto_gather_info": False } if host_dict.get('new', False): result = Host.objects.update_or_create(defaults, name=host_dict['name']) host = result[0] node = cluster.create_node(host_dict['role'], host) new_nodes.append(node) hosts.append(host) client = get_cloud_client(cluster.plan.mixed_vars) terraform_result = client.apply_terraform(cluster, hosts_dict) if not terraform_result: for node in new_nodes: node.host.delete() raise RuntimeError("create host error!") if cluster.plan.mixed_vars.get('provider') == 'openstack': print("sleep 20s,等待sshd服务可用") sleep(20) for host in hosts: host.gather_info(retry=5)
def get(self, request, *args, **kwargs): region_name = kwargs.get('region') region = get_object_or_404(Region, name=region_name) region.vars['provider'] = 'vsphere' client = get_cloud_client(region.vars) data = client.list_zone(region.cloud_region) return HttpResponse(json.dumps(data))
def create_image(self): try: self.change_status(Zone.ZONE_STATUS_INITIALIZING) client = get_cloud_client(self.region.vars) client.create_image(zone=self) self.change_status(Zone.ZONE_STATUS_READY) except Exception as e: self.change_status(Zone.ZONE_STATUS_ERROR)
def get(self, request, *args, **kwargs): region_name = kwargs.get('region') region = get_object_or_404(Region, name=region_name) client = get_cloud_client(region.vars) models = client.get_flavors(region.cloud_region) if not models: return Response(data={'msg': "没有合适的flavor规格!请添加大于4C8G60G的flavor."}, status=status.HTTP_400_BAD_REQUEST) return HttpResponse(json.dumps(models))
def delete_hosts(cluster): cloud_provider = get_cloud_client(cluster.plan.mixed_vars) result = cloud_provider.destroy_terraform(cluster.name) if not result: raise Exception('Destroy nodes error! ') else: cluster.change_to() nodes = Node.objects.filter(~Q(name__in=['::1', '127.0.0.1', 'localhost'])) for node in nodes: node.host.delete()
def create_image(self): try: logger.info('upload os image') self.change_status(Zone.ZONE_STATUS_INITIALIZING) client = get_cloud_client(self.region.vars) client.create_image(zone=self) self.change_status(Zone.ZONE_STATUS_READY) except Exception as e: logger.error(msg='upload os image error!', exc_info=True) self.change_status(Zone.ZONE_STATUS_ERROR)
def create_hosts(cluster): terraform_hosts = generate_host_model(cluster) cluster.set_terraform_hosts(terraform_hosts) cloud_provider = get_cloud_client(cluster.plan.mixed_vars) result = cloud_provider.apply_terraform(cluster=cluster) if result: for h in cluster.terraform_hosts.all(): h.create_host() cluster.create_nodes_by_terraform() else: raise Exception('Create nodes error!')
def add_hosts(cluster, num): terraform_hosts = add_terraform_host(cluster, num) cluster.set_terraform_hosts(terraform_hosts) cloud_provider = get_cloud_client(cluster.plan.mixed_vars) result = cloud_provider.apply_terraform(cluster=cluster) if result: for h in cluster.terraform_hosts.all(): h.create_host() cluster.add_nodes_by_terraform() else: for host in terraform_hosts: host.delete() raise Exception('Add nodes error!')
def scale_up(cluster, num): worker_size = cluster.worker_size new_hosts = [] worker_hosts_new = [] master_hosts_new = [] remove_list = [] add_list = [] if worker_size > num: hosts = create_cluster_hosts(cluster) worker_hosts_new = list(filter(is_worker, hosts)) master_hosts_new = list(filter(is_master, hosts)) for i in range(worker_size - num): rm_worker = worker_hosts_new.pop() remove_list.append(rm_worker) cluster.set_worker_size(num) drain_workers(cluster, remove_list) elif worker_size < num: cluster.set_worker_size(num) hosts = create_cluster_hosts(cluster) worker_hosts_new = list(filter(is_worker, hosts)) master_hosts_new = list(filter(is_master, hosts)) for h in hosts: if h.get('new', None): add_list.append(h) new_hosts.extend(worker_hosts_new) new_hosts.extend(master_hosts_new) mix_vars = cluster.plan.mixed_vars mix_vars["hosts"] = new_hosts client = get_cloud_client(mix_vars) terraform_result = client.apply_terraform(cluster, mix_vars) if not terraform_result: raise RuntimeError("create host error!") for host in add_list: zone = Zone.objects.get(name=host["zone_name"]) defaults = { "name": host['name'], "ip": host['ip'], "zone": zone, "username": '******', "password": '******' } h = Host.objects.update_or_create(defaults, name=host['name']) node = cluster.create_node(host['role'], h[0]) cluster.add_to_new_node(node) for host in remove_list: cluster.change_to() node = Node.objects.get(name=host['name']) node.host.delete()
def create_hosts(cluster): hosts = create_cluster_hosts(cluster) mix_vars = cluster.plan.mixed_vars mix_vars["hosts"] = hosts client = get_cloud_client(mix_vars) terraform_result = client.apply_terraform(cluster, mix_vars) if not terraform_result: raise RuntimeError("create host error!") for host in hosts: defaults = { "name": host['name'], "ip": host['ip'], "username": '******', "password": '******' } h = Host.objects.update_or_create(defaults, name=host['name']) cluster.create_node(host['role'], h)
def create_nodes(cluster, hosts_dict): hosts = [] new_nodes = [] for host_dict in hosts_dict: zone = Zone.objects.get(name=host_dict["zone_name"]) defaults = { "name": host_dict['name'], "ip": host_dict['ip'], "zone": zone, "status": Host.HOST_STATUS_CREATING, "auto_gather_info": False } if zone.vars.get('template_type') is not None and zone.vars[ 'template_type'] == 'customize' and zone.vars[ 'template_password']: defaults['password'] = zone.vars['template_password'] if host_dict.get('new', False): result = Host.objects.update_or_create(defaults, name=host_dict['name']) host = result[0] node = cluster.create_node(host_dict['role'], host) item_resource = ItemResource.objects.get(resource_id=cluster.id) item_r = ItemResource( item_id=item_resource.item_id, resource_id=host.id, resource_type=ItemResource.RESOURCE_TYPE_HOST) item_r.save() new_nodes.append(node) hosts.append(host) client = get_cloud_client(cluster.plan.mixed_vars) terraform_result = client.apply_terraform(cluster, hosts_dict) if not terraform_result: for node in new_nodes: node.host.delete() raise RuntimeError("create host error!") if cluster.plan.mixed_vars.get('provider') == 'openstack': print("sleep 20s,等待sshd服务可用") sleep(20) for host in hosts: host.gather_info(retry=5)
def create_nodes(cluster, hosts_dict): hosts = [] for host_dict in hosts_dict: zone = Zone.objects.get(name=host_dict["zone_name"]) defaults = { "name": host_dict['name'], "ip": host_dict['ip'], "zone": zone, "status": Host.HOST_STATUS_CREATING, "auto_gather_info": False } result = Host.objects.update_or_create(defaults, name=host_dict['name']) host = result[0] cluster.create_node(host_dict['role'], host) hosts.append(host) client = get_cloud_client(cluster.plan.mixed_vars) terraform_result = client.apply_terraform(cluster, hosts_dict) if not terraform_result: raise RuntimeError("create host error!") for host in hosts: host.gather_info()
def post(self, request): vars = request.data client = get_cloud_client(vars) data = client.list_region() return HttpResponse(json.dumps(data))
def get(self, request, *args, **kwargs): region_name = kwargs.get('region') region = get_object_or_404(Region, name=region_name) client = get_cloud_client(region.vars) return HttpResponse(json.dumps(client.get_flavors(region.cloud_region)))
def post(self, request): vars = request.data vars['provider'] = 'vsphere' client = get_cloud_client(vars) data = client.list_region() return HttpResponse(json.dumps(data))