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)
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)
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)
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 })
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
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
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)
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
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)
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)
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)