예제 #1
0
 def retrieve(self,
              request,
              tenant_pk=None,
              aws_env_pk=None,
              region_pk=None,
              service_pk=None,
              pk=None):
     log = NarukoLogging(request)
     logger = log.get_logger(__name__)
     logger.info("START: retrieve")
     try:
         aws_environment = AwsEnvironmentModel.objects.get(
             id=aws_env_pk, tenant_id=tenant_pk)
         resource = ControlResourceUseCase(log).describe_resource(
             request.user, aws_environment,
             Resource.get_service_resource(region_pk, service_pk, pk))
     except (TypeError, ValueError, KeyError, NarukoException) as e:
         # リクエストデータが不正
         logger.exception(e)
         return Response(status=status.HTTP_400_BAD_REQUEST)
     except ObjectDoesNotExist as e:
         # AWS環境が存在しない
         logger.exception(e)
         return Response(status=status.HTTP_404_NOT_FOUND)
     except Exception as e:
         logger.exception(e)
         raise
     else:
         logger.info("END: retrieve")
         return Response(data=resource.serialize(aws_environment),
                         status=status.HTTP_200_OK)
예제 #2
0
 def list(self,
          request,
          tenant_pk=None,
          aws_env_pk=None,
          region_pk=None,
          service_pk=None,
          resource_pk=None):
     log = NarukoLogging(request)
     logger = log.get_logger(__name__)
     logger.info("START: list")
     try:
         aws_environment = AwsEnvironmentModel.objects.get(
             id=aws_env_pk, tenant_id=tenant_pk)
         resource = Resource.get_service_resource(region_pk, service_pk,
                                                  resource_pk)
         backups = ControlResourceUseCase(log).fetch_backups(
             request.user, aws_environment, resource)
     except (TypeError, ValueError, KeyError, ClientError,
             NarukoException) as e:
         # リクエストデータが不正
         logger.exception(e)
         return Response(status=status.HTTP_400_BAD_REQUEST)
     except ObjectDoesNotExist as e:
         # AWS環境が存在しない
         logger.exception(e)
         return Response(status=status.HTTP_404_NOT_FOUND)
     except Exception as e:
         logger.exception(e)
         raise
     else:
         logger.info("END: list")
         return Response(data=[backup.serialize() for backup in backups],
                         status=status.HTTP_200_OK)
예제 #3
0
 def create(self,
            request,
            tenant_pk=None,
            aws_env_pk=None,
            region_pk=None,
            service_pk=None,
            resource_pk=None):
     log = NarukoLogging(request)
     logger = log.get_logger(__name__)
     logger.info("START: create")
     try:
         aws_environment = AwsEnvironmentModel.objects.get(
             id=aws_env_pk, tenant_id=tenant_pk)
         resource = Resource.get_service_resource(region_pk, service_pk,
                                                  resource_pk)
         no_reboot = request.data["no_reboot"] if isinstance(resource,
                                                             Ec2) else None
         backup_id = ControlResourceUseCase(log).create_backup(
             request.user, aws_environment, resource, no_reboot)
     except (TypeError, ValueError, KeyError, ClientError,
             NarukoException) as e:
         # リクエストデータが不正
         logger.exception(e)
         return Response(status=status.HTTP_400_BAD_REQUEST)
     except ObjectDoesNotExist as e:
         # AWS環境が存在しない
         logger.exception(e)
         return Response(status=status.HTTP_404_NOT_FOUND)
     except Exception as e:
         logger.exception(e)
         raise
     else:
         logger.info("END: create")
         return Response(data={"backup_id": backup_id},
                         status=status.HTTP_201_CREATED)
예제 #4
0
    def test_fetch_resources(self, mock_tag: mock.Mock,
                             mock_cloudwatch: mock.Mock):
        mock_user = mock.Mock(spec=UserModel)
        mock_aws = mock.Mock(spec=AwsEnvironmentModel)
        region = "region"

        # mockの準備
        cloudwatch_return_value = mock_cloudwatch.return_value
        cloudwatch_return_value.get_resources_status.return_value = {
            "EC2": {
                "ec2": "OK"
            },
            "RDS": {
                "rds": "DANGER"
            },
            "ELB": {
                "elb": "CAUTION"
            }
        }
        tag_return_value = mock_tag.return_value
        mock_resource1 = mock.Mock()
        mock_resource1.get_service_name.return_value = "EC2"
        mock_resource1.resource_id = "ec2"
        mock_resource2 = mock.Mock()
        mock_resource2.get_service_name.return_value = "RDS"
        mock_resource2.resource_id = "rds"
        mock_resource3 = mock.Mock()
        mock_resource3.get_service_name.return_value = "ELB"
        mock_resource3.resource_id = "elb"
        mock_resource4 = mock.Mock()
        mock_resource4.get_service_name.return_value = "EC2"
        tag_return_value.get_resources.return_value = [[
            mock_resource1, mock_resource2, mock_resource3, mock_resource4
        ], []]

        # 検証対象の実行
        resp = ControlResourceUseCase(mock.Mock()).fetch_resources(
            mock_user, mock_aws, region)

        # 戻り値の検証
        self.assertEqual(
            resp,
            [mock_resource1, mock_resource2, mock_resource3, mock_resource4])
        self.assertEqual(["OK", "DANGER", "CAUTION", "UNSET"], [
            mock_resource1.status, mock_resource2.status,
            mock_resource3.status, mock_resource4.status
        ])

        # 呼び出し検証
        mock_user.has_aws_env.assert_called_with(mock_aws)
        mock_cloudwatch.assert_called_with(aws_environment=mock_aws,
                                           region=region)
        mock_tag.assert_called_with(aws_environment=mock_aws, region=region)

        cloudwatch_return_value.get_resources_status.assert_called()
        tag_return_value.get_resources.assert_called()
예제 #5
0
 def stop(self, request, tenant_pk=None, aws_env_pk=None,
          region_pk=None, service_pk=None, pk=None):
     log = NarukoLogging(request)
     logger = log.get_logger(__name__)
     logger.info("START: stop")
     aws_environment = AwsEnvironmentModel.objects.get(id=aws_env_pk, tenant_id=tenant_pk)
     resource = Resource.get_service_resource(region_pk, service_pk, pk)
     ControlResourceUseCase(log).stop_resource(request.user, aws_environment, resource)
     logger.info("END: stop")
     return Response(status=status.HTTP_200_OK)
예제 #6
0
 def list(self, request, tenant_pk=None, aws_env_pk=None, region_pk=None):
     log = NarukoLogging(request)
     logger = log.get_logger(__name__)
     logger.info("START: list")
     aws_environment = AwsEnvironmentModel.objects.get(id=aws_env_pk,
                                                       tenant_id=tenant_pk)
     documents = ControlResourceUseCase(log).fetch_documents(
         request.user, aws_environment, region_pk)
     logger.info("END: list")
     return Response(data=[doc.serialize() for doc in documents],
                     status=status.HTTP_200_OK)
예제 #7
0
    def test_run_command(self):
        mock_user = mock.Mock(spec=UserModel)
        mock_aws = mock.Mock(spec=AwsEnvironmentModel)
        mock_command = mock.Mock()

        # 検証対象の実行
        res = ControlResourceUseCase(mock.Mock()).run_command(
            mock_user, mock_aws, mock_command)

        mock_user.is_belong_to_tenant.assert_called_once_with(mock_aws.tenant)
        mock_user.has_aws_env.assert_called_once_with(mock_aws)
        mock_command.run.assert_called_once_with(mock_aws)
        self.assertEqual(res, mock_command)
예제 #8
0
    def test_create_backup(self):
        mock_user = mock.Mock(spec=UserModel)
        mock_aws = mock.Mock(spec=AwsEnvironmentModel)
        mock_resource = mock.Mock()

        # 検証対象の実行
        res = ControlResourceUseCase(mock.Mock()).create_backup(
            mock_user, mock_aws, mock_resource, True)

        # 呼び出し検証
        mock_user.is_belong_to_tenant.assert_called_once()
        mock_user.has_aws_env.assert_called_once()
        self.assertEqual(res, mock_resource.create_backup.return_value)
예제 #9
0
 def retrieve(self, request, tenant_pk=None, aws_env_pk=None,
              region_pk=None, service_pk=None, pk=None):
     log = NarukoLogging(request)
     logger = log.get_logger(__name__)
     logger.info("START: retrieve")
     aws_environment = AwsEnvironmentModel.objects.get(id=aws_env_pk, tenant_id=tenant_pk)
     resource = ControlResourceUseCase(log).describe_resource(
         request.user,
         aws_environment,
         Resource.get_service_resource(region_pk, service_pk, pk))
     logger.info("END: retrieve")
     return Response(data=resource.serialize(aws_environment),
                     status=status.HTTP_200_OK)
예제 #10
0
    def test_create_backup_not_have_aws(self):
        mock_user = mock.Mock(spec=UserModel)
        mock_user.has_aws_env.return_value = False
        mock_aws = mock.Mock(spec=AwsEnvironmentModel)
        mock_resource = mock.Mock()

        # 検証対象の実行
        with self.assertRaises(PermissionDenied):
            ControlResourceUseCase(mock.Mock()).create_backup(
                mock_user, mock_aws, mock_resource, True)

        # 呼び出し検証
        mock_user.is_belong_to_tenant.assert_called_once()
        mock_user.has_aws_env.assert_called_once()
예제 #11
0
    def test_stop_resource(self):
        mock_user = mock.Mock(spec=UserModel)
        mock_aws = mock.Mock(spec=AwsEnvironmentModel)
        mock_resource = mock.Mock()

        # 検証対象の実行
        ControlResourceUseCase(mock.Mock()).stop_resource(
            mock_user, mock_aws, mock_resource)

        # 呼び出し検証
        mock_user.is_belong_to_tenant.assert_called_once()
        mock_user.has_aws_env.assert_called_once()

        mock_resource.stop.assert_called_once()
예제 #12
0
 def list(self, request, tenant_pk=None, aws_env_pk=None):
     log = NarukoLogging(request)
     logger = log.get_logger(__name__)
     logger.info("START: list")
     region = request.GET.get("region")
     aws_environment = AwsEnvironmentModel.objects.get(id=aws_env_pk, tenant_id=tenant_pk)
     resources = ControlResourceUseCase(log).fetch_resources(
         request.user,
         aws_environment,
         region
     )
     logger.info("END: list")
     return Response(data=[resource.serialize(aws_environment) for resource in resources],
                     status=status.HTTP_200_OK)
예제 #13
0
    def test_fetch_documents(self, mock_ssm):
        mock_user = mock.Mock(spec=UserModel)
        mock_aws = mock.Mock(spec=AwsEnvironmentModel)

        list_documents = mock_ssm.return_value.list_documents
        list_documents.return_value = [[1, 2, 3], [4, 5, 6]]

        # 検証対象の実行
        res = ControlResourceUseCase(mock.Mock()).fetch_documents(
            mock_user, mock_aws, "region")

        mock_user.is_belong_to_tenant.assert_called_once_with(mock_aws.tenant)
        mock_user.has_aws_env.assert_called_once_with(mock_aws)
        list_documents.assert_called()
        self.assertEqual(res, [1, 2, 3, 4, 5, 6])
예제 #14
0
 def run_command(self, request, tenant_pk=None, aws_env_pk=None,
                 region_pk=None, service_pk=None, pk=None):
     log = NarukoLogging(request)
     logger = log.get_logger(__name__)
     logger.info("START: run_command")
     aws_environment = AwsEnvironmentModel.objects.get(id=aws_env_pk, tenant_id=tenant_pk)
     resource = Resource.get_service_resource(region_pk, service_pk, pk)
     command = Command(
         Document(
             request.data["name"],
             [Parameter(**param) for param in request.data["parameters"]]),
         resource)
     command = ControlResourceUseCase(log).run_command(request.user, aws_environment, command)
     logger.info("END: run_command")
     return Response(status=status.HTTP_200_OK, data=command.serialize())
예제 #15
0
    def test_fetch_documents_no_aws(self, mock_ssm):
        mock_user = mock.Mock(spec=UserModel)
        mock_user.has_aws_env.return_value = False
        mock_aws = mock.Mock(spec=AwsEnvironmentModel)

        list_documents = mock_ssm.return_value.list_documents
        list_documents.return_value = [[1, 2, 3], [4, 5, 6]]

        # 検証対象の実行
        with self.assertRaises(PermissionDenied):
            ControlResourceUseCase(mock.Mock()).fetch_documents(
                mock_user, mock_aws, "region")

        mock_user.is_belong_to_tenant.assert_called_once_with(mock_aws.tenant)
        mock_user.has_aws_env.assert_called_once_with(mock_aws)
        list_documents.assert_not_called()
예제 #16
0
    def test_describe_resource_not_belong_to_tenant(self):
        mock_user = mock.Mock(spec=UserModel)
        mock_user.is_belong_to_tenant.return_value = False
        mock_aws = mock.Mock(spec=AwsEnvironmentModel)
        mock_resource = mock.Mock()

        # 検証対象の実行
        with self.assertRaises(PermissionDenied):
            ControlResourceUseCase(mock.Mock()).describe_resource(
                mock_user, mock_aws, mock_resource)

        # 呼び出し検証
        mock_user.is_belong_to_tenant.assert_called_once()
        mock_user.has_aws_env.assert_not_called()

        mock_resource.describe.assert_not_called()
예제 #17
0
    def test_describe_document(self, mock_ssm):
        mock_user = mock.Mock(spec=UserModel)
        mock_aws = mock.Mock(spec=AwsEnvironmentModel)
        mock_doc = mock.Mock()

        describe_document = mock_ssm.return_value.describe_document
        describe_document.return_value = mock_doc

        # 検証対象の実行
        res = ControlResourceUseCase(mock.Mock()).describe_document(
            mock_user, mock_aws, "region", "name")

        mock_user.is_belong_to_tenant.assert_called_once_with(mock_aws.tenant)
        mock_user.has_aws_env.assert_called_once_with(mock_aws)
        describe_document.assert_called_once_with("name")
        self.assertEqual(res, mock_doc)
예제 #18
0
    def test_describe_document_no_aws(self, mock_ssm):
        mock_user = mock.Mock(spec=UserModel)
        mock_user.has_aws_env.return_value = False
        mock_aws = mock.Mock(spec=AwsEnvironmentModel)
        mock_doc = mock.Mock()

        describe_document = mock_ssm.return_value.describe_document
        describe_document.return_value = mock_doc

        # 検証対象の実行
        with self.assertRaises(PermissionDenied):
            ControlResourceUseCase(mock.Mock()).describe_document(
                mock_user, mock_aws, "region", "name")

        mock_user.is_belong_to_tenant.assert_called_once_with(mock_aws.tenant)
        mock_user.has_aws_env.assert_called_once_with(mock_aws)
        describe_document.assert_not_called()
예제 #19
0
 def list(self,
          request,
          tenant_pk=None,
          aws_env_pk=None,
          region_pk=None,
          service_pk=None,
          resource_pk=None):
     log = NarukoLogging(request)
     logger = log.get_logger(__name__)
     logger.info("START: list")
     aws_environment = AwsEnvironmentModel.objects.get(id=aws_env_pk,
                                                       tenant_id=tenant_pk)
     resource = Resource.get_service_resource(region_pk, service_pk,
                                              resource_pk)
     backups = ControlResourceUseCase(log).fetch_backups(
         request.user, aws_environment, resource)
     logger.info("END: list")
     return Response(data=[backup.serialize() for backup in backups],
                     status=status.HTTP_200_OK)
예제 #20
0
 def create(self,
            request,
            tenant_pk=None,
            aws_env_pk=None,
            region_pk=None,
            service_pk=None,
            resource_pk=None):
     log = NarukoLogging(request)
     logger = log.get_logger(__name__)
     logger.info("START: create")
     aws_environment = AwsEnvironmentModel.objects.get(id=aws_env_pk,
                                                       tenant_id=tenant_pk)
     resource = Resource.get_service_resource(region_pk, service_pk,
                                              resource_pk)
     no_reboot = request.data["no_reboot"] if isinstance(resource,
                                                         Ec2) else None
     backup_id = ControlResourceUseCase(log).create_backup(
         request.user, aws_environment, resource, no_reboot)
     logger.info("END: create")
     return Response(data={"backup_id": backup_id},
                     status=status.HTTP_201_CREATED)
예제 #21
0
    def test_not_belong_to_tenant(self, mock_tag: mock.Mock,
                                  mock_cloudwatch: mock.Mock):
        mock_user = mock.Mock(spec=UserModel)
        mock_user.is_belong_to_tenant.return_value = False
        mock_aws = mock.Mock(spec=AwsEnvironmentModel)
        region = "region"

        # 検証対象の実行
        with self.assertRaises(PermissionDenied):
            ControlResourceUseCase(mock.Mock()).fetch_resources(
                mock_user, mock_aws, region)

        # 呼び出し検証
        mock_user.has_aws_env.assert_not_called()
        mock_cloudwatch.assert_not_called()
        mock_tag.assert_not_called()

        cloudwatch_return_value = mock_cloudwatch.return_value
        tag_return_value = mock_tag.return_value

        cloudwatch_return_value.get_resources_status.assert_not_called()
        tag_return_value.get_resources.assert_not_called()