def ListRoutes(self, namespace_ref): messages = self._messages_module request = messages.ServerlessNamespacesRoutesListRequest( parent=namespace_ref.RelativeName()) with metrics.record_duration(metrics.LIST_ROUTES): response = self._client.namespaces_routes.List(request) return [service.Service(item, messages) for item in response.items]
def ListConfigurations(self, namespace_ref): messages = self._messages_module request = messages.ServerlessNamespacesConfigurationsListRequest( parent=namespace_ref.RelativeName()) with metrics.record_duration(metrics.LIST_CONFIGURATIONS): response = self._client.namespaces_configurations.List(request) return [service.Service(item, messages) for item in response.items]
def GetService(self, service_ref): """Return the relevant Service from the server, or None if 404.""" messages = self._messages_module service_get_request = messages.ServerlessNamespacesServicesGetRequest( name=service_ref.RelativeName()) try: with metrics.record_duration(metrics.GET_SERVICE): service_get_response = self._client.namespaces_services.Get( service_get_request) return service.Service(service_get_response, messages) except api_exceptions.HttpNotFoundError: return None
def _UpdateOrCreateService(self, service_ref, config_changes): """Apply config_changes to the service. Create it if necessary.""" messages = self._messages_module # GET the Service serv = self.GetService(service_ref) if serv: # PUT the changed Service for config_change in config_changes: config_change.AdjustConfiguration(serv.configuration, serv.metadata) serv_name = service_ref.RelativeName() serv_update_req = ( messages.ServerlessNamespacesServicesReplaceServiceRequest( service=serv.Message(), name=serv_name)) with metrics.record_duration(metrics.UPDATE_SERVICE): updated = self._client.namespaces_services.ReplaceService( serv_update_req) return service.Service(updated, messages) else: # POST a new Service new_serv = service.Service.New(self._client, service_ref.namespacesId) new_serv.name = service_ref.servicesId pretty_print.Info('Creating new service [{bold}{service}{reset}]', service=new_serv.name) parent = service_ref.Parent().RelativeName() for config_change in config_changes: config_change.AdjustConfiguration(new_serv.configuration, new_serv.metadata) serv_create_req = ( messages.ServerlessNamespacesServicesCreateRequest( service=new_serv.Message(), parent=parent)) with metrics.record_duration(metrics.CREATE_SERVICE): raw_service = self._client.namespaces_services.Create( serv_create_req) return service.Service(raw_service, messages)
def DeleteRevision(self, revision_ref): """Delete the provided Revision. Args: revision_ref: Resource, a reference to the Revision to delete Raises: RevisionNotFoundError: if provided revision is not found. """ messages = self._messages_module revision_name = revision_ref.RelativeName() request = messages.ServerlessNamespacesRevisionsDeleteRequest( name=revision_name) try: with metrics.record_duration(metrics.DELETE_REVISION): self._client.namespaces_revisions.Delete(request) except api_exceptions.HttpNotFoundError: raise serverless_exceptions.RevisionNotFoundError( 'Revision [{}] could not be found.'.format(revision_ref.revisionsId))
def GetRevision(self, revision_ref): """Get the revision. Args: revision_ref: Resource, revision to get. Returns: A revision.Revision object. """ messages = self._messages_module revision_name = revision_ref.RelativeName() request = messages.ServerlessNamespacesRevisionsGetRequest( name=revision_name) try: with metrics.record_duration(metrics.GET_REVISION): response = self._client.namespaces_revisions.Get(request) return revision.Revision(response, messages) except api_exceptions.HttpNotFoundError: return None
def GetConfiguration(self, service_ref): """Return the relevant Configuration from the server, or None if 404.""" messages = self._messages_module name = self._registry.Parse( service_ref.servicesId, params={ 'namespacesId': service_ref.namespacesId, }, collection='serverless.namespaces.configurations').RelativeName() configuration_get_request = ( messages.ServerlessNamespacesConfigurationsGetRequest(name=name)) try: with metrics.record_duration(metrics.GET_CONFIGURATION): configuration_get_response = self._client.namespaces_configurations.Get( configuration_get_request) return configuration.Configuration(configuration_get_response, messages) except api_exceptions.HttpNotFoundError: return None
def _GetRoute(self, service_ref): """Return the relevant Route from the server, or None if 404.""" messages = self._messages_module # GET the Route route_name = self._registry.Parse( service_ref.servicesId, params={ 'namespacesId': service_ref.namespacesId, }, collection='serverless.namespaces.routes').RelativeName() route_get_request = messages.ServerlessNamespacesRoutesGetRequest( name=route_name, ) try: with metrics.record_duration(metrics.GET_ROUTE): route_get_response = self._client.namespaces_routes.Get( route_get_request) return route.Route(route_get_response, messages) except api_exceptions.HttpNotFoundError: return None
def DeleteService(self, service_ref): """Delete the provided Service. Args: service_ref: Resource, a reference to the Service to delete Raises: ServiceNotFoundError: if provided service is not found. """ messages = self._messages_module service_name = service_ref.RelativeName() service_delete_request = messages.ServerlessNamespacesServicesDeleteRequest( name=service_name, ) try: with metrics.record_duration(metrics.DELETE_SERVICE): self._client.namespaces_services.Delete(service_delete_request) except api_exceptions.HttpNotFoundError: raise serverless_exceptions.ServiceNotFoundError( 'Service [{}] could not be found.'.format(service_ref.servicesId))
def ListRevisions(self, namespace_ref, service_name): """List all revisions for the given service. Args: namespace_ref: Resource, namespace to list revisions in service_name: str, The service for which to list revisions. Returns: A list of revisions for the given service. """ messages = self._messages_module request = messages.ServerlessNamespacesRevisionsListRequest( parent=namespace_ref.RelativeName(), ) if service_name is not None: # For now, same as the service name, and keeping compatible with # 'service-less' operation. request.labelSelector = 'serving.knative.dev/service = {}'.format( service_name) with metrics.record_duration(metrics.LIST_REVISIONS): response = self._client.namespaces_revisions.List(request) return [revision.Revision(item, messages) for item in response.items]
def _UpdateOrCreateService(self, service_ref, config_changes, with_code): """Apply config_changes to the service. Create it if necessary. Arguments: service_ref: Reference to the service to create or update config_changes: list of ConfigChanger to modify the service with with_code: boolean, True if the config_changes contains code to deploy. We can't create the service if we're not deploying code. Returns: The Service object we created or modified. """ nonce = _Nonce() config_changes = [_NewRevisionForcingChange(nonce)] + config_changes messages = self._messages_module # GET the Service serv = self.GetService(service_ref) try: if serv: if not with_code: # Avoid changing the running code by making the new revision by digest self._EnsureImageDigest(serv, config_changes) # PUT the changed Service for config_change in config_changes: config_change.AdjustConfiguration(serv.configuration, serv.metadata) serv_name = service_ref.RelativeName() serv_update_req = ( messages.ServerlessNamespacesServicesReplaceServiceRequest( service=serv.Message(), name=serv_name)) with metrics.record_duration(metrics.UPDATE_SERVICE): updated = self._client.namespaces_services.ReplaceService( serv_update_req) return service.Service(updated, messages) else: if not with_code: raise serverless_exceptions.ServiceNotFoundError( 'Service [{}] could not be found.'.format(service_ref.servicesId)) # POST a new Service new_serv = service.Service.New(self._client, service_ref.namespacesId) new_serv.name = service_ref.servicesId pretty_print.Info('Creating new service [{bold}{service}{reset}]', service=new_serv.name) parent = service_ref.Parent().RelativeName() for config_change in config_changes: config_change.AdjustConfiguration(new_serv.configuration, new_serv.metadata) serv_create_req = ( messages.ServerlessNamespacesServicesCreateRequest( service=new_serv.Message(), parent=parent)) with metrics.record_duration(metrics.CREATE_SERVICE): raw_service = self._client.namespaces_services.Create( serv_create_req) return service.Service(raw_service, messages) except api_exceptions.HttpBadRequestError as e: error_payload = exceptions_util.HttpErrorPayload(e) if error_payload.field_violations: if (serverless_exceptions.BadImageError.IMAGE_ERROR_FIELD in error_payload.field_violations): exceptions.reraise(serverless_exceptions.BadImageError(e)) exceptions.reraise(e)