def on_get(self, req, resp, name): """ Handles GET (or "status") requests for a Cluster upgrade. :param req: Request instance that will be passed through. :type req: falcon.Request :param resp: Response instance that will be passed through. :type resp: falcon.Response :param name: The name of the Cluster being upgraded. :type name: str """ if not util.etcd_cluster_exists(name): self.logger.info( 'Upgrade GET requested for nonexistent cluster {0}'.format( name)) resp.status = falcon.HTTP_404 return try: cluster_upgrade = ClusterUpgrade.retrieve(name) self.logger.debug('Found ClusterUpgrade for {0}'.format(name)) except: # Return "204 No Content" if we have no status, # meaning no upgrade is in progress. The client # can't be expected to know that, so it's not a # client error (4xx). self.logger.debug(( 'Upgrade GET requested for {0} but no upgrade ' 'has ever been executed.').format(name)) resp.status = falcon.HTTP_204 return resp.status = falcon.HTTP_200 req.context['model'] = cluster_upgrade
def on_put(self, req, resp, name): """ Handles PUT (or "initiate") requests for a Cluster upgrade. :param req: Request instance that will be passed through. :type req: falcon.Request :param resp: Response instance that will be passed through. :type resp: falcon.Response :param name: The name of the Cluster being upgraded. :type name: str """ # Make sure the cluster name is valid. if not util.etcd_cluster_exists(name): self.logger.info( 'Upgrade PUT requested for nonexistent cluster {0}'.format( name)) resp.status = falcon.HTTP_404 return # If the operation is already in progress, return the current # status with response code 200 OK. try: cluster_upgrade = ClusterUpgrade.retrieve(name) self.logger.debug('Found ClusterUpgrade for {0}'.format(name)) if not cluster_upgrade.finished_at: self.logger.debug( 'Cluster {0} upgrade already in progress'.format(name)) resp.status = falcon.HTTP_200 req.context['model'] = cluster_upgrade return except: # This means one doesn't already exist. pass # TODO: Move to a poll? p = Process(target=clusterexec, args=(name, 'upgrade')) p.start() self.logger.debug('Started upgrade in clusterexecpool for {0}'.format( name)) cluster_upgrade_default = { 'status': 'in_process', 'upgraded': [], 'in_process': [], 'started_at': datetime.datetime.utcnow().isoformat(), 'finished_at': None } cluster_upgrade = ClusterUpgrade(**cluster_upgrade_default) cluster_upgrade.save(name) resp.status = falcon.HTTP_201 req.context['model'] = cluster_upgrade