def _start_lio(iqn, portal_port, device): try: storage = rtslib_fb.BlockStorageObject(name=iqn, dev=device) target = rtslib_fb.Target(rtslib_fb.FabricModule('iscsi'), iqn, mode='create') tpg = rtslib_fb.TPG(target, mode='create') # disable all authentication tpg.set_attribute('authentication', '0') tpg.set_attribute('demo_mode_write_protect', '0') tpg.set_attribute('generate_node_acls', '1') # lun=1 is hardcoded in ironic rtslib_fb.LUN(tpg, storage_object=storage, lun=1) tpg.enable = 1 except rtslib_fb.utils.RTSLibError as exc: msg = 'Failed to create a target: {}'.format(exc) raise errors.ISCSIError(msg) try: # bind to the default port on all interfaces listen_ip = netutils.wrap_ipv6(netutils.get_wildcard_address()) rtslib_fb.NetworkPortal(tpg, listen_ip, portal_port) except rtslib_fb.utils.RTSLibError as exc: msg = 'Failed to publish a target: {}'.format(exc) raise errors.ISCSIError(msg)
def start(self): """Start the API service in the background.""" self.service = wsgi.Server(self._conf, 'ironic-python-agent', app=self, host=netutils.get_wildcard_address(), port=self.PORT) self.service.start() LOG.info('Started API service on port %s', self.PORT)
def setUp(self): """Start the agent and wait for it to start""" super(FunctionalBase, self).setUp() mpl = multiprocessing.log_to_stderr() mpl.setLevel(logging.INFO) self.test_port = os.environ.get('TEST_PORT', '9999') # Build a basic standalone agent using the config option defaults. # 127.0.0.1:6835 is the fake Ironic client. self.agent = agent.IronicPythonAgent( api_url='http://127.0.0.1:6835', advertise_address=agent.Host('localhost', 9999), listen_address=agent.Host(netutils.get_wildcard_address(), int(self.test_port)), ip_lookup_attempts=3, ip_lookup_sleep=10, network_interface=None, lookup_timeout=300, lookup_interval=1, standalone=True, agent_token=None) self.process = multiprocessing.Process(target=self.agent.run) self.process.start() self.addCleanup(self.process.terminate) # Wait for process to start, otherwise we have a race for tests sleep_time = 0.1 tries = 0 max_tries = int(os.environ.get('IPA_WAIT_TRIES', '100')) while tries < max_tries: try: return self.request('get', 'commands') except requests.ConnectionError: time.sleep(sleep_time) tries += 1 raise IOError('Agent did not start after %s seconds.' % (max_tries * sleep_time))
def setUp(self): """Start the agent and wait for it to start""" super(FunctionalBase, self).setUp() mpl = multiprocessing.log_to_stderr() mpl.setLevel(logging.INFO) self.test_port = os.environ.get('TEST_PORT', '9999') # Build a basic standalone agent using the config option defaults. # 127.0.0.1:6835 is the fake Ironic client. self.agent = agent.IronicPythonAgent( api_url='http://127.0.0.1:6835', advertise_address=agent.Host('localhost', 9999), listen_address=agent.Host(netutils.get_wildcard_address(), int(self.test_port)), ip_lookup_attempts=3, ip_lookup_sleep=10, network_interface=None, lookup_timeout=300, lookup_interval=1, standalone=True) self.process = multiprocessing.Process( target=self.agent.run) self.process.start() self.addCleanup(self.process.terminate) # Wait for process to start, otherwise we have a race for tests sleep_time = 0.1 tries = 0 max_tries = int(os.environ.get('IPA_WAIT_TRIES', '100')) while tries < max_tries: try: return self.request('get', 'commands') except requests.ConnectionError: time.sleep(sleep_time) tries += 1 raise IOError('Agent did not start after %s seconds.' % (max_tries * sleep_time))
cfg.StrOpt('api_url', default=APARAMS.get('ipa-api-url'), regex='^(mdns|http(s?):\\/\\/.+)', help='URL of the Ironic API. ' 'Can be supplied as "ipa-api-url" kernel parameter.' 'The value must start with either http:// or https://. ' 'A special value "mdns" can be specified to fetch the ' 'URL using multicast DNS service discovery.'), cfg.StrOpt('global_request_id', default=APARAMS.get('ipa-global-request-id'), help='Global request ID header to provide to Ironic API. ' 'Can be supplied as "ipa-global-request-id" kernel ' 'parameter. The value must be in form "req-<UUID>".'), cfg.StrOpt('listen_host', default=APARAMS.get('ipa-listen-host', netutils.get_wildcard_address()), sample_default='::', help='The IP address to listen on. ' 'Can be supplied as "ipa-listen-host" kernel parameter.'), cfg.PortOpt('listen_port', default=int(APARAMS.get('ipa-listen-port', 9999)), help='The port to listen on. ' 'Can be supplied as "ipa-listen-port" kernel parameter.'), # This is intentionally not settable via kernel command line, as it # requires configuration parameters from oslo_service which are not # configurable over the command line and require files-on-disk. # Operators who want to use this support should configure it statically # as part of a ramdisk build. cfg.BoolOpt('listen_tls', default=False,
# # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from ironic_python_agent import netutils # Server Specific Configurations # See https://pecan.readthedocs.org/en/latest/configuration.html#server-configuration # noqa server = { 'port': '9999', 'host': netutils.get_wildcard_address() } # Pecan Application Configurations # See https://pecan.readthedocs.org/en/latest/configuration.html#application-configuration # noqa app = { 'root': 'ironic_python_agent.api.controllers.root.RootController', 'modules': ['ironic_python_agent.api'], 'static_root': '%(confdir)s/public', 'debug': False, 'enable_acl': True, 'acl_public_routes': ['/', '/v1'], } # WSME Configurations # See https://wsme.readthedocs.org/en/latest/integrate.html#configuration
# you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from ironic_python_agent import netutils # Server Specific Configurations # See https://pecan.readthedocs.org/en/latest/configuration.html#server-configuration # noqa server = {'port': '9999', 'host': netutils.get_wildcard_address()} # Pecan Application Configurations # See https://pecan.readthedocs.org/en/latest/configuration.html#application-configuration # noqa app = { 'root': 'ironic_python_agent.api.controllers.root.RootController', 'modules': ['ironic_python_agent.api'], 'static_root': '%(confdir)s/public', 'debug': False, 'enable_acl': True, 'acl_public_routes': ['/', '/v1'], } # WSME Configurations # See https://wsme.readthedocs.org/en/latest/integrate.html#configuration wsme = {
CONF = cfg.CONF APARAMS = utils.get_agent_params() cli_opts = [ cfg.StrOpt('api_url', default=APARAMS.get('ipa-api-url'), deprecated_name='api-url', regex='^http(s?):\/\/.+', help='URL of the Ironic API. ' 'Can be supplied as "ipa-api-url" kernel parameter.' 'The value must start with either http:// or https://.'), cfg.StrOpt('listen_host', default=APARAMS.get('ipa-listen-host', netutils.get_wildcard_address()), sample_default='::', deprecated_name='listen-host', help='The IP address to listen on. ' 'Can be supplied as "ipa-listen-host" kernel parameter.'), cfg.IntOpt('listen_port', default=int(APARAMS.get('ipa-listen-port', 9999)), deprecated_name='listen-port', help='The port to listen on. ' 'Can be supplied as "ipa-listen-port" kernel parameter.'), cfg.StrOpt('advertise_host', default=APARAMS.get('ipa-advertise-host', None), deprecated_name='advertise_host', help='The host to tell Ironic to reply and send '