def verify_origin_proto(self, connection_info, origin_proto): access_url = connection_info.get('access_url') if not access_url: detail = _("No access_url in connection_info. " "Cannot validate protocol") raise exception.ValidationError(detail=detail) expected_protos = [urlparse.urlparse(access_url).scheme] # NOTE: For serial consoles the expected protocol could be ws or # wss which correspond to http and https respectively in terms of # security. if 'ws' in expected_protos: expected_protos.append('http') if 'wss' in expected_protos: expected_protos.append('https') return origin_proto in expected_protos
def spawn(self, context, server, configdrive_value): """Deploy a server. :param context: The security context. :param server: The server object. :param configdrive_value: The configdrive value to be injected. """ LOG.debug('Spawn called for server', server=server) # The engine manager is meant to know the node uuid, so missing uuid # is a significant issue. It may mean we've been passed the wrong data. node_uuid = server.node_uuid if not node_uuid: raise ironic_exc.BadRequest( _("Ironic node uuid not supplied to " "driver for server %s.") % server.uuid) # add server info to node node = self._get_node(node_uuid) self._add_server_info_to_node(node, server) # validate we are ready to do the deploy validate_chk = self.ironicclient.call("node.validate", node_uuid) if (not validate_chk.deploy.get('result') or not validate_chk.power.get('result')): # something is wrong. undo what we have done self._cleanup_deploy(context, node, server) raise exception.ValidationError( _("Ironic node: %(id)s failed to validate." " (deploy: %(deploy)s, power: %(power)s)") % { 'id': server.node_uuid, 'deploy': validate_chk.deploy, 'power': validate_chk.power }) # trigger the node deploy try: self.ironicclient.call("node.set_provision_state", node_uuid, ironic_states.ACTIVE, configdrive=configdrive_value) except Exception as e: with excutils.save_and_reraise_exception(): msg = ("Failed to request Ironic to provision server " "%(server)s: %(reason)s", { 'server': server.uuid, 'reason': six.text_type(e) }) LOG.error(msg) timer = loopingcall.FixedIntervalLoopingCall(self._wait_for_active, server) try: timer.start(interval=CONF.ironic.api_retry_interval).wait() LOG.info('Successfully provisioned Ironic node %s', node.uuid, server=server) except Exception: with excutils.save_and_reraise_exception(): LOG.error( "Error deploying server %(server)s on " "baremetal node %(node)s.", { 'server': server.uuid, 'node': node_uuid })