def send_items(commissioning_results): for filename, content in commissioning_results.items(): if isinstance(content, dict) or isinstance(content, list): content = json.dumps(content, indent=4) if not isinstance(content, bytes): content = content.encode() try: signal( url=metadata_url.geturl(), creds={ "consumer_key": consumer_key, "token_key": token_key, "token_secret": token_secret, "consumer_secret": "", }, status="WORKING", files={ # UI shows combined output by default. filename: content, # STDOUT output is whats actually proceed. f"{filename}.out": content, # Clear out STDERR and results. f"{filename}.err": b"", f"{filename}.yaml": b"", }, exit_status=0, error=f"Finished {filename}: 0", ) except SignalException as e: raise PodActionFail( f"Unable to send Pod commissioning information for {name}({system_id}): {e.error}" )
def test_signal_formats_files(self): mock_encode_multipart_data = self.patch(maas_api_helper, "encode_multipart_data") mock_encode_multipart_data.return_value = None, None mock_geturl = self.patch(maas_api_helper, "geturl") mm = MagicMock() mm.status = 200 mm.read.return_value = b"OK" mock_geturl.return_value = mm status = factory.make_name("status") files = {factory.make_name(): factory.make_bytes()} # None used for url and creds as we're not actually sending data. maas_api_helper.signal(None, None, status, files=files) self.assertThat( mock_encode_multipart_data, MockCalledWith( { b"op": b"signal", b"status": status.encode("utf-8") }, files), ) self.assertThat(mock_geturl, MockCalledOnce())
def test_signal_formats_params_with_script_version_id(self): mock_encode_multipart_data = self.patch(maas_api_helper, 'encode_multipart_data') mock_encode_multipart_data.return_value = None, None mock_geturl = self.patch(maas_api_helper, 'geturl') mm = MagicMock() mm.status = 200 mm.read.return_value = b'OK' mock_geturl.return_value = mm status = factory.make_name('status') script_version_id = random.randint(1, 1000) # None used for url and creds as we're not actually sending data. maas_api_helper.signal(None, None, status, script_version_id=script_version_id) self.assertThat( mock_encode_multipart_data, MockCalledWith( { b'op': b'signal', b'status': status.encode('utf-8'), b'script_version_id': str(script_version_id).encode('utf-8'), }, {})) self.assertThat(mock_geturl, MockCalledOnce())
def test_signal_formats_params_with_script_version_id(self): mock_encode_multipart_data = self.patch(maas_api_helper, "encode_multipart_data") mock_encode_multipart_data.return_value = None, None mock_geturl = self.patch(maas_api_helper, "geturl") mm = MagicMock() mm.status = 200 mm.read.return_value = b"OK" mock_geturl.return_value = mm status = factory.make_name("status") script_version_id = random.randint(1, 1000) # None used for url and creds as we're not actually sending data. maas_api_helper.signal(None, None, status, script_version_id=script_version_id) self.assertThat( mock_encode_multipart_data, MockCalledWith( { b"op": b"signal", b"status": status.encode("utf-8"), b"script_version_id": str(script_version_id).encode("utf-8"), }, {}, ), ) self.assertThat(mock_geturl, MockCalledOnce())
def test_signal_formats_params_with_exit_status(self): mock_encode_multipart_data = self.patch( maas_api_helper, "encode_multipart_data" ) mock_encode_multipart_data.return_value = None, None mock_geturl = self.patch(maas_api_helper, "geturl") mm = MagicMock() mm.status = 200 mm.read.return_value = b"OK" mock_geturl.return_value = mm status = factory.make_name("status") exit_status = random.randint(0, 255) # None used for url and creds as we're not actually sending data. maas_api_helper.signal(None, None, status, exit_status=exit_status) self.assertThat( mock_encode_multipart_data, MockCalledWith( { b"op": b"signal", b"status": status.encode("utf-8"), b"exit_status": str(exit_status).encode("utf-8"), }, files=None, ), ) self.assertThat(mock_geturl, MockCalledOnce())
def test_signal_formats_params_with_moonshot_power_params(self): mock_encode_multipart_data = self.patch( maas_api_helper, 'encode_multipart_data') mock_encode_multipart_data.return_value = None, None mock_geturl = self.patch(maas_api_helper, 'geturl') mock_geturl.return_value = b'OK' status = factory.make_name('status') power_type = 'moonshot' power_params = OrderedDict([ ('power_user', factory.make_name('power_user')), ('power_pass', factory.make_name('power_pass')), ('power_address', factory.make_url()), ('power_hwaddress', factory.make_name('power_hwaddress')), ]) # None used for url and creds as we're not actually sending data. maas_api_helper.signal( None, None, status, power_type=power_type, power_params=','.join([value for value in power_params.values()])) # XXX ltrager 2017-01-18 - The power_parameters JSON dump breaks # MockCalledWith. self.assertDictEqual( mock_encode_multipart_data.call_args[0][0], { b'op': b'signal', b'status': status.encode('utf-8'), b'power_type': power_type.encode('utf-8'), b'power_parameters': json.dumps(power_params).encode(), }) self.assertThat(mock_geturl, MockCalledOnce())
def test_signal_formats_params_with_power_params(self): mock_encode_multipart_data = self.patch( maas_api_helper, "encode_multipart_data" ) mock_encode_multipart_data.return_value = None, None mock_geturl = self.patch(maas_api_helper, "geturl") mm = MagicMock() mm.status = 200 mm.read.return_value = b"OK" mock_geturl.return_value = mm status = factory.make_name("status") power_type = factory.make_name("power_type") power_params = OrderedDict( [ ("power_user", factory.make_name("power_user")), ("power_pass", factory.make_name("power_pass")), ("power_address", factory.make_url()), ("power_driver", factory.make_name("power_driver")), ("power_boot_type", factory.make_name("power_boot_type")), ] ) # None used for url and creds as we're not actually sending data. maas_api_helper.signal( None, None, status, power_type=power_type, power_params=",".join([value for value in power_params.values()]), ) # XXX ltrager 2017-01-18 - The power_parameters JSON dump breaks # MockCalledWith. self.assertDictEqual( mock_encode_multipart_data.call_args[0][0], { b"op": b"signal", b"status": status.encode("utf-8"), b"power_type": power_type.encode("utf-8"), b"power_parameters": json.dumps(power_params).encode(), }, ) self.assertThat(mock_geturl, MockCalledOnce())
def test_signal_formats_basic_params(self): mock_encode_multipart_data = self.patch( maas_api_helper, 'encode_multipart_data') mock_encode_multipart_data.return_value = None, None mock_geturl = self.patch(maas_api_helper, 'geturl') mock_geturl.return_value = b'OK' status = factory.make_name('status') # None used for url and creds as we're not actually sending data. maas_api_helper.signal(None, None, status) self.assertThat( mock_encode_multipart_data, MockCalledWith({ b'op': b'signal', b'status': status.encode('utf-8'), }, {})) self.assertThat(mock_geturl, MockCalledOnce())
def test_signal_formats_files(self): mock_encode_multipart_data = self.patch(maas_api_helper, 'encode_multipart_data') mock_encode_multipart_data.return_value = None, None mock_geturl = self.patch(maas_api_helper, 'geturl') mm = MagicMock() mm.status = 200 mm.read.return_value = b'OK' mock_geturl.return_value = mm status = factory.make_name('status') files = {factory.make_name(): factory.make_bytes()} # None used for url and creds as we're not actually sending data. maas_api_helper.signal(None, None, status, files=files) self.assertThat( mock_encode_multipart_data, MockCalledWith( { b'op': b'signal', b'status': status.encode('utf-8'), }, files)) self.assertThat(mock_geturl, MockCalledOnce())
def signal_wrapper(*args, **kwargs): """Wrapper to capture and log any SignalException from signal.""" try: signal(*args, **kwargs) except SignalException as e: maaslog.error("Error during controller refresh: %s" % e.error)