def test_publish_volume_with_node_id_only_has_wwns(self, enter):
        context = utils.FakeContext()
        self.request.node_id = "hostname;;500143802426baf4"
        self.mediator.get_host_by_host_identifiers.return_value = self.hostname, ["fc"]
        self.mediator.get_array_fc_wwns = Mock()
        self.mediator.get_array_fc_wwns.return_value = ["500143802426baf4"]
        enter.return_value = self.mediator

        res = self.servicer.ControllerPublishVolume(self.request, context)
        self.assertEqual(context.code, grpc.StatusCode.OK)

        self.assertEqual(res.publish_context["PUBLISH_CONTEXT_LUN"], '1')
        self.assertEqual(res.publish_context["PUBLISH_CONTEXT_CONNECTIVITY"],
                         "fc")
        self.assertEqual(
            res.publish_context["PUBLISH_CONTEXT_ARRAY_FC_INITIATORS"],
            "500143802426baf4")

        self.request.node_id = "hostname;;500143802426baf4:500143806626bae2"
        self.mediator.get_host_by_host_identifiers.return_value = self.hostname, ["fc"]
        self.mediator.get_array_fc_wwns = Mock()
        self.mediator.get_array_fc_wwns.return_value = ["500143802426baf4",
                                                        "500143806626bae2"]
        enter.return_value = self.mediator

        res = self.servicer.ControllerPublishVolume(self.request, context)
        self.assertEqual(context.code, grpc.StatusCode.OK)

        self.assertEqual(res.publish_context["PUBLISH_CONTEXT_LUN"], '1')
        self.assertEqual(res.publish_context["PUBLISH_CONTEXT_CONNECTIVITY"],
                         "fc")
        self.assertEqual(
            res.publish_context["PUBLISH_CONTEXT_ARRAY_FC_INITIATORS"],
            "500143802426baf4,500143806626bae2")
 def test_create_volume_get_volume_exception(self, a_enter, get_volume, array_type):
     a_enter.return_value = self.mediator
     self.mediator.get_volume.side_effect = [Exception("error")]
     context = utils.FakeContext()
     res = self.servicer.CreateVolume(self.request, context)
     self.assertEqual(context.code, grpc.StatusCode.INTERNAL)
     self.assertTrue("error" in context.details)
     self.mediator.get_volume.assert_called_once_with(vol_name)
 def test_create_volume_with_get_array_type_exception(self, a_enter, a_exit, array_type):
     a_enter.return_value = self.mediator
     context = utils.FakeContext()
     array_type.side_effect = [array_errors.FailedToFindStorageSystemType("endpoint")]
     res = self.servicer.CreateVolume(self.request, context)
     self.assertEqual(context.code, grpc.StatusCode.INTERNAL, "failed to find storage system")
     msg = array_errors.FailedToFindStorageSystemType("endpoint").message
     self.assertTrue(msg in context.details)
    def test_publish_volume_get_volume_mappings_more_then_one_mapping(self, enter):
        context = utils.FakeContext()
        self.mediator.get_volume_mappings = Mock()
        self.mediator.get_volume_mappings.return_value = {"other-hostname": 3, self.hostname: 4}
        enter.return_value = self.mediator

        self.servicer.ControllerPublishVolume(self.request, context)
        self.assertEqual(context.code, grpc.StatusCode.FAILED_PRECONDITION)
        self.assertTrue("Volume is already mapped" in context.details)
 def delete_volume_returns_error(self, a_enter, delete_volume, error, return_code):
     a_enter.return_value = self.mediator
     delete_volume.side_effect = [error]
     context = utils.FakeContext()
     res = self.servicer.DeleteVolume(self.request, context)
     self.assertEqual(context.code, return_code)
     if return_code != grpc.StatusCode.OK:
         msg = str(error)
         self.assertTrue(msg in context.details, "msg : {0} is not in : {1}".format(msg, context.details))
    def test_create_volume_with_get_volume_illegal_object_name_exception(self, a_enter, get_volume, array_type):
        a_enter.return_value = self.mediator
        self.mediator.get_volume.side_effect = [array_errors.IllegalObjectName("vol")]
        context = utils.FakeContext()
        res = self.servicer.CreateVolume(self.request, context)
        msg = array_errors.IllegalObjectName("vol").message

        self.assertEqual(context.code, grpc.StatusCode.INVALID_ARGUMENT)
        self.assertTrue(msg in context.details)
        self.mediator.get_volume.assert_called_once_with(vol_name)
    def test_create_volume_succeeds(self, a_exit, a_enter, array_type):
        a_enter.return_value = self.mediator
        context = utils.FakeContext()

        self.mediator.create_volume = Mock()
        self.mediator.create_volume.return_value = utils.get_mock_mediator_response_volume(10, "vol", "wwn", "xiv")
        array_type.return_value = "a9k"
        res = self.servicer.CreateVolume(self.request, context)
        self.assertEqual(context.code, grpc.StatusCode.OK)
        self.mediator.get_volume.assert_called_once_with(vol_name)
        self.mediator.create_volume.assert_called_once_with(vol_name, 10, {}, 'pool1')
    def test_publish_volume_get_volume_mappings_one_map_for_existing_host(self, enter):
        context = utils.FakeContext()
        self.mediator.get_volume_mappings = Mock()
        self.mediator.get_volume_mappings.return_value = {self.hostname: 2}
        enter.return_value = self.mediator

        res = self.servicer.ControllerPublishVolume(self.request, context)
        self.assertEqual(context.code, grpc.StatusCode.OK)

        self.assertEqual(res.publish_context["PUBLISH_CONTEXT_LUN"], '2')
        self.assertEqual(res.publish_context["PUBLISH_CONTEXT_CONNECTIVITY"], "iscsi")
    def test_create_volume_with_zero_size(self, a_exit, a_enter, array_type):
        a_enter.return_value = self.mediator
        context = utils.FakeContext()

        self.request.capacity_range.required_bytes = 0
        self.mediator.create_volume = Mock()
        self.mediator.create_volume.return_value = utils.get_mock_mediator_response_volume(10, "vol", "wwn", "xiv")
        array_type.return_value = "a9k"
        res = self.servicer.CreateVolume(self.request, context)
        self.assertEqual(context.code, grpc.StatusCode.OK)
        self.mediator.create_volume.assert_called_once_with(self.request.name, 1 * 1024 * 1024 * 1024, {}, "pool1")
    def test_create_volume_cuts_name_if_its_too_long(self, a_exit, a_enter, array_type):
        a_enter.return_value = self.mediator
        context = utils.FakeContext()

        self.request.name = "a" * 128
        self.mediator.create_volume = Mock()
        self.mediator.create_volume.return_value = utils.get_mock_mediator_response_volume(10, "vol", "wwn", "xiv")
        array_type.return_value = "a9k"
        res = self.servicer.CreateVolume(self.request, context)
        self.assertEqual(context.code, grpc.StatusCode.OK)
        self.mediator.get_volume.assert_called_once_with("a" * self.mediator.max_vol_name_length)
    def test_create_volume_with_name_prefix(self, a_exit, a_enter, array_type):
        a_enter.return_value = self.mediator
        context = utils.FakeContext()

        self.request.name = "some_name"
        self.request.parameters[PARAMETERS_PREFIX] = "prefix"
        self.mediator.create_volume = Mock()
        self.mediator.create_volume.return_value = utils.get_mock_mediator_response_volume(10, "vol", "wwn", "xiv")
        array_type.return_value = "a9k"
        res = self.servicer.CreateVolume(self.request, context)
        self.assertEqual(context.code, grpc.StatusCode.OK)
        self.mediator.create_volume.assert_called_once_with("prefix_some_name", 10, {}, "pool1")
    def create_volume_returns_error(self, a_enter, create_volume, array_type, return_code, err):
        a_enter.return_value = self.mediator
        create_volume.side_effect = [err]

        context = utils.FakeContext()
        res = self.servicer.CreateVolume(self.request, context)
        msg = str(err)

        self.assertEqual(context.code, return_code)
        self.assertTrue(msg in context.details)
        self.mediator.get_volume.assert_called_once_with(vol_name)
        self.mediator.create_volume.assert_called_once_with(vol_name, self.capacity_bytes, {}, self.pool)
    def test_unpublish_volume_get_host_by_host_identifiers_exception(self, enter):
        context = utils.FakeContext()

        self.mediator.get_host_by_host_identifiers = Mock()
        self.mediator.get_host_by_host_identifiers.side_effect = [array_errors.MultipleHostsFoundError("", "")]
        enter.return_value = self.mediator

        self.servicer.ControllerUnpublishVolume(self.request, context)
        self.assertTrue("Multiple hosts" in context.details)
        self.assertEqual(context.code, grpc.StatusCode.INTERNAL)

        self.mediator.get_host_by_host_identifiers.side_effect = [array_errors.HostNotFoundError("")]
        enter.return_value = self.mediator

        self.servicer.ControllerUnpublishVolume(self.request, context)
        self.assertEqual(context.code, grpc.StatusCode.NOT_FOUND)
    def test_publish_volume_with_connectivity_type_fc(self, enter):
        context = utils.FakeContext()
        self.mediator.get_host_by_host_identifiers.return_value = self.hostname, ["iscsi", "fc"]
        self.mediator.get_array_fc_wwns = Mock()
        self.mediator.get_array_fc_wwns.return_value = ["500143802426baf4"]
        self.mediator.get_array_iqns = Mock()
        self.mediator.get_array_iqns.return_value = [
            "iqn.1994-05.com.redhat:686358c930fe"]
        enter.return_value = self.mediator

        res = self.servicer.ControllerPublishVolume(self.request, context)
        self.assertEqual(context.code, grpc.StatusCode.OK)

        self.assertEqual(res.publish_context["PUBLISH_CONTEXT_LUN"], '1')
        self.assertEqual(res.publish_context["PUBLISH_CONTEXT_CONNECTIVITY"], "fc")
        self.assertEqual(res.publish_context["PUBLISH_CONTEXT_ARRAY_FC_INITIATORS"], "500143802426baf4")
    def test_delete_volume_with_wrong_secrets(self, a_enter, a_exit):
        a_enter.return_value = self.mediator
        context = utils.FakeContext()

        self.request.secrets = {"password": "******", "management_address": "mg"}
        res = self.servicer.DeleteVolume(self.request, context)
        self.assertEqual(context.code, grpc.StatusCode.INVALID_ARGUMENT, "username is missing in secrets")
        self.assertTrue("secret" in context.details)

        self.request.secrets = {"username": "******", "management_address": "mg"}
        res = self.servicer.DeleteVolume(self.request, context)
        self.assertEqual(context.code, grpc.StatusCode.INVALID_ARGUMENT, "password is missing in secrets")
        self.assertTrue("secret" in context.details)

        self.request.secrets = {"username": "******", "password": "******"}
        res = self.servicer.DeleteVolume(self.request, context)
        self.assertEqual(context.code, grpc.StatusCode.INVALID_ARGUMENT, "mgmt address is missing in secrets")
        self.assertTrue("secret" in context.details)