Exemple #1
0
 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())
Exemple #3
0
    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())
Exemple #6
0
    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())
Exemple #8
0
    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())
Exemple #9
0
    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())
Exemple #10
0
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)