Esempio n. 1
0
 def test_fallback_failure(self):
     """
     Validate that when host plugin fails, the default channel is reset
     """
     test_goal_state = wire.GoalState(WireProtocolData(DATA_FILE).goal_state)
     status = restapi.VMStatus(status="Ready",
                               message="Guest Agent is running")
     wire.HostPluginProtocol.set_default_channel(False)
     with patch.object(wire.HostPluginProtocol,
                       "ensure_initialized",
                       return_value=True):
         with patch.object(wire.StatusBlob,
                           "upload",
                           return_value=False):
             with patch.object(wire.HostPluginProtocol,
                               "_put_page_blob_status",
                               side_effect=wire.HttpError("put failure")) as patch_put:
                 client = wire.WireProtocol(wireserver_url).client
                 client.get_goal_state = Mock(return_value=test_goal_state)
                 client.ext_conf = wire.ExtensionsConfig(None)
                 client.ext_conf.status_upload_blob = sas_url
                 client.ext_conf.status_upload_blob_type = page_blob_type
                 client.status_blob.set_vm_status(status)
                 client.upload_status_blob()
                 self.assertTrue(patch_put.call_count == 1,
                                 "Fallback was not engaged")
                 self.assertFalse(wire.HostPluginProtocol.is_default_channel())
Esempio n. 2
0
 def test_put_status_error_reporting(self):
     """
     Validate the telemetry when uploading status fails
     """
     test_goal_state = wire.GoalState(WireProtocolData(DATA_FILE).goal_state)
     status = restapi.VMStatus(status="Ready",
                               message="Guest Agent is running")
     wire.HostPluginProtocol.set_default_channel(False)
     with patch.object(wire.StatusBlob,
                       "upload",
                       return_value=False):
         wire_protocol_client = wire.WireProtocol(wireserver_url).client
         wire_protocol_client.get_goal_state = Mock(return_value=test_goal_state)
         wire_protocol_client.ext_conf = wire.ExtensionsConfig(None)
         wire_protocol_client.ext_conf.status_upload_blob = sas_url
         wire_protocol_client.status_blob.set_vm_status(status)
         put_error = wire.HttpError("put status http error")
         with patch.object(event,
                           "add_event") as patch_add_event:
             with patch.object(restutil,
                               "http_put",
                               side_effect=put_error) as patch_http_put:
                 with patch.object(wire.HostPluginProtocol,
                                   "ensure_initialized", return_value=True):
                     wire_protocol_client.upload_status_blob()
                     self.assertFalse(wire.HostPluginProtocol.is_default_channel())
                     self.assertTrue(patch_add_event.call_count == 1)
Esempio n. 3
0
 def test_fallback(self):
     """
     Validate fallback to upload status using HostGAPlugin is happening when
     status reporting via default method is unsuccessful
     """
     test_goal_state = wire.GoalState(WireProtocolData(DATA_FILE).goal_state)
     status = restapi.VMStatus(status="Ready", message="Guest Agent is running")
     with patch.object(wire.HostPluginProtocol,
                       "ensure_initialized",
                       return_value=True):
         with patch.object(wire.StatusBlob, "upload", return_value=False) as patch_upload:
             with patch.object(wire.HostPluginProtocol,
                               "_put_page_blob_status") as patch_put:
                 wire_protocol_client = wire.WireProtocol(wireserver_url).client
                 wire_protocol_client.get_goal_state = Mock(return_value=test_goal_state)
                 wire_protocol_client.ext_conf = wire.ExtensionsConfig(None)
                 wire_protocol_client.ext_conf.status_upload_blob = sas_url
                 wire_protocol_client.ext_conf.status_upload_blob_type = page_blob_type
                 wire_protocol_client.status_blob.set_vm_status(status)
                 wire_protocol_client.upload_status_blob()
                 self.assertEqual(patch_upload.call_count, 1)
                 self.assertTrue(patch_put.call_count == 1,
                                 "Fallback was not engaged")
                 self.assertTrue(patch_put.call_args[0][0] == sas_url)
                 self.assertTrue(wire.HostPluginProtocol.is_default_channel())
                 wire.HostPluginProtocol.set_default_channel(False)
Esempio n. 4
0
    def test_put_status_error_reporting(self, patch_add_event):
        """
        Validate the telemetry when uploading status fails
        """
        test_goal_state = wire.GoalState(
            WireProtocolData(DATA_FILE).goal_state)
        status = restapi.VMStatus(status="Ready",
                                  message="Guest Agent is running")
        wire.HostPluginProtocol.set_default_channel(False)
        with patch.object(wire.StatusBlob, "upload", return_value=False):
            wire_protocol_client = wire.WireProtocol(wireserver_url).client
            wire_protocol_client.get_goal_state = Mock(
                return_value=test_goal_state)
            wire_protocol_client.ext_conf = wire.ExtensionsConfig(None)
            wire_protocol_client.ext_conf.status_upload_blob = sas_url
            wire_protocol_client.status_blob.set_vm_status(status)
            put_error = wire.HttpError("put status http error")
            with patch.object(restutil, "http_put",
                              side_effect=put_error) as patch_http_put:
                with patch.object(wire.HostPluginProtocol,
                                  "ensure_initialized",
                                  return_value=True):
                    wire_protocol_client.upload_status_blob()

                    # The agent tries to upload via HostPlugin and that fails due to
                    # http_put having a side effect of "put_error"
                    #
                    # The agent tries to upload using a direct connection, and that succeeds.
                    self.assertEqual(
                        1, wire_protocol_client.status_blob.upload.call_count)
                    # The agent never touches the default protocol is this code path, so no change.
                    self.assertFalse(
                        wire.HostPluginProtocol.is_default_channel())
                    # The agent never logs a telemetry event for a bad HTTP call
                    self.assertEqual(patch_add_event.call_count, 0)
Esempio n. 5
0
 def test_fallback(self):
     """
     Status now defaults to HostPlugin. Validate that any errors on the public
     channel are ignored.  Validate that the default channel is never changed
     as part of status upload.
     """
     test_goal_state = wire.GoalState(
         WireProtocolData(DATA_FILE).goal_state)
     status = restapi.VMStatus(status="Ready",
                               message="Guest Agent is running")
     with patch.object(wire.HostPluginProtocol,
                       "ensure_initialized",
                       return_value=True):
         with patch.object(wire.StatusBlob, "upload",
                           return_value=False) as patch_upload:
             with patch.object(wire.HostPluginProtocol,
                               "_put_page_blob_status") as patch_put:
                 wire_protocol_client = wire.WireProtocol(
                     wireserver_url).client
                 wire_protocol_client.get_goal_state = Mock(
                     return_value=test_goal_state)
                 wire_protocol_client.ext_conf = wire.ExtensionsConfig(None)
                 wire_protocol_client.ext_conf.status_upload_blob = sas_url
                 wire_protocol_client.ext_conf.status_upload_blob_type = page_blob_type
                 wire_protocol_client.status_blob.set_vm_status(status)
                 wire_protocol_client.upload_status_blob()
                 self.assertEqual(patch_upload.call_count, 0)
                 self.assertTrue(patch_put.call_count == 1,
                                 "Fallback was not engaged")
                 self.assertTrue(patch_put.call_args[0][0] == sas_url)
                 self.assertFalse(
                     wire.HostPluginProtocol.is_default_channel())
Esempio n. 6
0
 def test_no_fallback(self):
     with patch.object(wire.HostPluginProtocol,
                       "put_vm_status") as patch_put:
         with patch.object(wire.StatusBlob, "upload") as patch_upload:
             patch_upload.return_value = True
             wire_protocol_client = wire.WireProtocol(wireserver_url).client
             wire_protocol_client.ext_conf = wire.ExtensionsConfig(None)
             wire_protocol_client.ext_conf.status_upload_blob = sas_url
             wire_protocol_client.upload_status_blob()
             self.assertTrue(patch_put.call_count == 0,
                             "Fallback was engaged")
Esempio n. 7
0
 def test_no_fallback(self):
     """
     Validate fallback to upload status using HostGAPlugin is not happening when status reporting via
     default method is successful
     """
     with patch.object(wire.HostPluginProtocol,
                       "put_vm_status") as patch_put:
         with patch.object(wire.StatusBlob, "upload") as patch_upload:
             patch_upload.return_value = True
             wire_protocol_client = wire.WireProtocol(wireserver_url).client
             wire_protocol_client.ext_conf = wire.ExtensionsConfig(None)
             wire_protocol_client.ext_conf.status_upload_blob = sas_url
             wire_protocol_client.upload_status_blob()
             self.assertTrue(patch_put.call_count == 0,
                             "Fallback was engaged")
Esempio n. 8
0
    def test_fallback(self):
        """
        Validate fallback to upload status using HostGAPlugin is happening when status reporting via
        default method is unsuccessful
        """
        test_goal_state = wire.GoalState(
            WireProtocolData(DATA_FILE).goal_state)

        with patch.object(wire.HostPluginProtocol,
                          "put_vm_status") as patch_put:
            with patch.object(wire.StatusBlob, "upload",
                              return_value=False) as patch_upload:
                wire_protocol_client = wire.WireProtocol(wireserver_url).client
                wire_protocol_client.get_goal_state = Mock(
                    return_value=test_goal_state)
                wire_protocol_client.ext_conf = wire.ExtensionsConfig(None)
                wire_protocol_client.ext_conf.status_upload_blob = sas_url
                wire_protocol_client.upload_status_blob()
                self.assertTrue(patch_put.call_count == 1,
                                "Fallback was not engaged")
                self.assertTrue(patch_put.call_args[0][1] == sas_url)
Esempio n. 9
0
    def test_fallback_channel_failure(self, patch_update, patch_put,
                                      patch_upload, _):
        """
        When host plugin returns a 500, and direct fails, we should raise a ProtocolError
        """
        test_goal_state = wire.GoalState(
            WireProtocolData(DATA_FILE).goal_state)
        status = restapi.VMStatus(status="Ready",
                                  message="Guest Agent is running")

        wire_protocol_client = wire.WireProtocol(wireserver_url).client
        wire_protocol_client.get_goal_state = Mock(
            return_value=test_goal_state)
        wire_protocol_client.ext_conf = wire.ExtensionsConfig(None)
        wire_protocol_client.ext_conf.status_upload_blob = sas_url
        wire_protocol_client.ext_conf.status_upload_blob_type = page_blob_type
        wire_protocol_client.status_blob.set_vm_status(status)

        # act
        self.assertRaises(wire.ProtocolError,
                          wire_protocol_client.upload_status_blob)

        # assert direct route is not called
        self.assertEqual(1, patch_upload.call_count,
                         "Direct channel was not used")

        # assert host plugin route is called
        self.assertEqual(1, patch_put.call_count, "Host plugin was not used")

        # assert update goal state is called twice, forced=True on the second
        self.assertEqual(1, patch_update.call_count,
                         "Update goal state unexpected call count")
        self.assertEqual(0, len(patch_update.call_args[1]),
                         "Update goal state unexpected call count")

        # ensure the correct url is used
        self.assertEqual(sas_url, patch_put.call_args[0][0])

        # ensure host plugin is not set as default
        self.assertFalse(wire.HostPluginProtocol.is_default_channel())
Esempio n. 10
0
    def test_fallback_channel_410(self, patch_refresh_host_plugin,
                                  patch_update, patch_put, patch_upload, _):
        """
        When host plugin returns a 410, we should force the goal state update and return
        """
        test_goal_state = wire.GoalState(
            WireProtocolData(DATA_FILE).goal_state)
        status = restapi.VMStatus(status="Ready",
                                  message="Guest Agent is running")

        wire_protocol_client = wire.WireProtocol(wireserver_url).client
        wire_protocol_client.get_goal_state = Mock(
            return_value=test_goal_state)
        wire_protocol_client.ext_conf = wire.ExtensionsConfig(None)
        wire_protocol_client.ext_conf.status_upload_blob = sas_url
        wire_protocol_client.ext_conf.status_upload_blob_type = page_blob_type
        wire_protocol_client.status_blob.set_vm_status(status)

        # act
        wire_protocol_client.upload_status_blob()

        # assert direct route is not called
        self.assertEqual(0, patch_upload.call_count, "Direct channel was used")

        # assert host plugin route is called
        self.assertEqual(1, patch_put.call_count, "Host plugin was not used")

        # assert update goal state is called with no arguments (forced=False), then update_host_plugin_from_goal_state is called
        self.assertEqual(1, patch_update.call_count,
                         "Update goal state unexpected call count")
        self.assertEqual(0, len(patch_update.call_args[1]),
                         "Update goal state unexpected argument count")
        self.assertEqual(1, patch_refresh_host_plugin.call_count,
                         "Refresh host plugin unexpected call count")

        # ensure the correct url is used
        self.assertEqual(sas_url, patch_put.call_args[0][0])

        # ensure host plugin is not set as default
        self.assertFalse(wire.HostPluginProtocol.is_default_channel())
Esempio n. 11
0
    def test_default_channel(self, patch_update, patch_put, patch_upload, _):
        """
        Status now defaults to HostPlugin. Validate that any errors on the public
        channel are ignored.  Validate that the default channel is never changed
        as part of status upload.
        """
        test_goal_state = wire.GoalState(
            WireProtocolData(DATA_FILE).goal_state)
        status = restapi.VMStatus(status="Ready",
                                  message="Guest Agent is running")

        wire_protocol_client = wire.WireProtocol(wireserver_url).client
        wire_protocol_client.get_goal_state = Mock(
            return_value=test_goal_state)
        wire_protocol_client.ext_conf = wire.ExtensionsConfig(None)
        wire_protocol_client.ext_conf.status_upload_blob = sas_url
        wire_protocol_client.ext_conf.status_upload_blob_type = page_blob_type
        wire_protocol_client.status_blob.set_vm_status(status)

        # act
        wire_protocol_client.upload_status_blob()

        # assert direct route is not called
        self.assertEqual(0, patch_upload.call_count, "Direct channel was used")

        # assert host plugin route is called
        self.assertEqual(1, patch_put.call_count, "Host plugin was not used")

        # assert update goal state is only called once, non-forced
        self.assertEqual(1, patch_update.call_count, "Unexpected call count")
        self.assertEqual(0, len(patch_update.call_args[1]),
                         "Unexpected parameters")

        # ensure the correct url is used
        self.assertEqual(sas_url, patch_put.call_args[0][0])

        # ensure host plugin is not set as default
        self.assertFalse(wire.HostPluginProtocol.is_default_channel())