def create_sandbox(self, context, container, key_name=None, flavor='m1.small', image='kubernetes/pause', nics='auto'): # FIXME(hongbin): We elevate to admin privilege because the default # policy in nova disallows non-admin users to create instance in # specified host. This is not ideal because all nova instances will # be created at service admin tenant now, which breaks the # multi-tenancy model. We need to fix it. elevated = context.elevated() novaclient = nova.NovaClient(elevated) name = self.get_sandbox_name(container) if container.host != CONF.host: raise exception.ZunException( _("Host mismatch: container should be created at host '%s'.") % container.host) # NOTE(hongbin): The format of availability zone is ZONE:HOST:NODE # However, we just want to specify host, so it is ':HOST:' az = ':%s:' % container.host sandbox = novaclient.create_server(name=name, image=image, flavor=flavor, key_name=key_name, nics=nics, availability_zone=az) self._ensure_active(novaclient, sandbox) sandbox_id = self._find_container_by_server_name(name) return sandbox_id
def stop_sandbox(self, context, sandbox_id): elevated = context.elevated() novaclient = nova.NovaClient(elevated) server_name = self._find_server_by_container_id(sandbox_id) if not server_name: LOG.warning("Cannot find server name for sandbox %s", sandbox_id) return novaclient.stop_server(server_name)
def delete_sandbox(self, context, sandbox_id): elevated = context.elevated() novaclient = nova.NovaClient(elevated) server_name = self._find_server_by_container_id(sandbox_id) if not server_name: LOG.warning("Cannot find server name for sandbox %s" % sandbox_id) return server_id = novaclient.delete_server(server_name) self._ensure_deleted(novaclient, server_id)
def get_addresses(self, context, container): elevated = context.elevated() novaclient = nova.NovaClient(elevated) sandbox_id = self.get_sandbox_id(container) if sandbox_id: server_name = self._find_server_by_container_id(sandbox_id) if server_name: # TODO(hongbin): Standardize the format of addresses return novaclient.get_addresses(server_name) else: return None else: return None