Example #1
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 = AwsEnvironmentModel.objects.get(id=aws_env_pk,
                                               tenant_id=tenant_pk)
         resource = Resource.get_service_resource(region_pk, service_pk,
                                                  resource_pk)
         monitors = ControlMonitorUseCase(log).fetch_monitors(
             request.user, aws, resource)
     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: list")
         return Response(data=[monitor.serialize() for monitor in monitors],
                         status=status.HTTP_200_OK)
Example #2
0
 def graph(self,
           request,
           tenant_pk=None,
           aws_env_pk=None,
           region_pk=None,
           service_pk=None,
           resource_pk=None,
           pk=None):
     log = NarukoLogging(request)
     logger = log.get_logger(__name__)
     logger.info("START: graph")
     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)
         monitor_graph = MonitorGraph(metric_name=pk, **request.data)
         monitor_graph = ControlMonitorUseCase(log).graph(
             request.user, resource, aws_environment, monitor_graph)
     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: graph")
         return Response(data=monitor_graph.serialize(),
                         status=status.HTTP_200_OK)
Example #3
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:
         with transaction.atomic():
             tenant = TenantModel.objects.get(id=tenant_pk)
             aws_env = AwsEnvironmentModel.objects.get(id=aws_env_pk, tenant=tenant)
             resource = Resource.get_service_resource(region_pk, service_pk, resource_pk)
             schedules = ControlScheduleUseCase(log).fetch_schedules(request.user, tenant, aws_env, 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=[schedule.serialize() for schedule in schedules], status=status.HTTP_200_OK)
Example #4
0
    def test_create_monitor(self, use_case: mock.Mock):
        client = APIClient()
        user_model = UserModel.objects.get(email="test_email")
        client.force_authenticate(user=user_model)

        # Company1のIDを取得
        tenant_id = TenantModel.objects.get(tenant_name="test_tenant_users_in_tenant_1").id
        # AWS環境のIDを取得
        aws_id = AwsEnvironmentModel.objects.get(aws_account_id="test_aws1").id

        # mock準備
        create_monitor = use_case.return_value.save_monitor
        resource = Resource.get_service_resource("ap-northeast-1", "ec2", "i-123456789012")
        resource.monitors.append(Monitor(
            "test_name",
            {"caution": 60, "danger": 90},
            True,
            300,
            1,
            'Average'
        ))

        create_monitor.return_value = resource

        # 検証対象の実行
        response = client.post(
            path=self.api_path.format(tenant_id, aws_id),
            data={
                "metric_name": "test_name",
                "values": {
                    "caution": 60,
                    "danger": 90
                },
                "enabled": True,
                "period": 300,
                "evaluation_period": 1,
                "statistic": 'Average'
            },
            format='json')

        use_case.assert_called_once()
        create_monitor.assert_called_once()
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.data, {
            "metric_name": "test_name",
            "values": {
                "danger": 90,
                "caution": 60
            },
            "enabled": True,
            "period": 300,
            "evaluation_period": 1,
            "statistic": 'Average',
            "comparison_operator": "GreaterThanOrEqualToThreshold",
            "status": None
        })
Example #5
0
    def describe_load_balancer(self, name: str):
        # response = self.client.describe_load_balancers(
        #     Names=[name]
        # )
        #
        # load_balancer = response['LoadBalancers'][0]

        resource = Resource.get_service_resource(self.region, 'elb', name)

        resource.name = name
        return resource
Example #6
0
    def describe_instance(self, instance_id: str):
        response = self.client.describe_db_instances(
            DBInstanceIdentifier=instance_id)

        instance = response['DBInstances'][0]

        instance_state = instance.get('DBInstanceStatus')

        resource = Resource.get_service_resource(self.region,
                                                 self._service_name(),
                                                 instance_id)

        resource.state = instance_state
        resource.name = instance_id

        return resource
Example #7
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 = AwsEnvironmentModel.objects.get(id=aws_env_pk,
                                           tenant_id=tenant_pk)
     resource = Resource.get_service_resource(region_pk, service_pk,
                                              resource_pk)
     monitors = ControlMonitorUseCase(log).fetch_monitors(
         request.user, aws, resource)
     logger.info("END: list")
     return Response(data=[monitor.serialize() for monitor in monitors],
                     status=status.HTTP_200_OK)
Example #8
0
    def describe_instance(self, instance_id: str):
        response = self.client.describe_instances(
            Filters=[
                {'Name': 'instance-id', 'Values': [instance_id]}
            ]
        )

        instance = response['Reservations'][0]['Instances'][0]
        tag = self.convert_tag(instance.get("Tags", []))
        name = tag.get("Name", instance_id)

        instance_state = instance.get('State', {}).get('Name')

        resource = Resource.get_service_resource(self.region, self._service_name(), instance_id)

        resource.name = name
        resource.state = instance_state

        return resource
Example #9
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")
     tenant = TenantModel.objects.get(id=tenant_pk)
     aws_env = AwsEnvironmentModel.objects.get(id=aws_env_pk, tenant=tenant)
     resource = Resource.get_service_resource(region_pk, service_pk,
                                              resource_pk)
     schedules = ControlScheduleUseCase(log).fetch_schedules(
         request.user, tenant, aws_env, resource)
     logger.info("END: list")
     return Response(data=[schedule.serialize() for schedule in schedules],
                     status=status.HTTP_200_OK)
Example #10
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)
     resource.monitors.append(Monitor(**request.data))
     resource = ControlMonitorUseCase(log).save_monitor(
         request.user, resource, aws_environment)
     logger.info("END: create")
     return Response(data=resource.monitors[0].serialize(),
                     status=status.HTTP_200_OK)
Example #11
0
 def graph(self,
           request,
           tenant_pk=None,
           aws_env_pk=None,
           region_pk=None,
           service_pk=None,
           resource_pk=None,
           pk=None):
     log = NarukoLogging(request)
     logger = log.get_logger(__name__)
     logger.info("START: graph")
     aws_environment = AwsEnvironmentModel.objects.get(id=aws_env_pk,
                                                       tenant_id=tenant_pk)
     resource = Resource.get_service_resource(region_pk, service_pk,
                                              resource_pk)
     monitor_graph = MonitorGraph(metric_name=pk, **request.data)
     monitor_graph = ControlMonitorUseCase(log).graph(
         request.user, resource, aws_environment, monitor_graph)
     logger.info("END: graph")
     return Response(data=monitor_graph.serialize(),
                     status=status.HTTP_200_OK)