type awsMixedInstancesPolicy
  @generate(
    query: { get: false, query: false, aggregate: false }
    mutation: { add: false, delete: false }
    subscription: false
  ) {
  launchTemplateId: String @search(by: [hash, regexp])
  launchTemplateName: String @search(by: [hash, regexp])
  launchTemplateVersion: String @search(by: [hash, regexp])
  launchTemplateOverrides: [awsLaunchTemplateOverrides]
  instDistrOnDemandAllocationStrategy: String @search(by: [hash, regexp])
  instDistrOnDemandBaseCapacity: Int
  instDistrOnDemandPercentageAboveBaseCapacity: Int
  instDistrSpotAllocationStrategy: String @search(by: [hash, regexp])
  instDistrSpotInstancePools: Int
  instDistrSpotMaxPrice: String @search(by: [hash, regexp])
}

type awsLaunchTemplateOverrides
  @generate(
    query: { get: false, query: false, aggregate: false }
    mutation: { add: false, delete: false }
    subscription: false
  ) {
  id: String! @id
  instanceType: String
  weightedCapacity: String
  launchTemplateId: String @search(by: [hash, regexp])
  launchTemplateName: String @search(by: [hash, regexp])
  launchTemplateVersion: String @search(by: [hash, regexp])
}

type awsSuspendedProcess
  @generate(
    query: { get: false, query: false, aggregate: false }
    mutation: { add: false, delete: false }
    subscription: false
  ) {
  id: String! @id
  processName: String! @search(by: [hash, regexp])
  suspensionReason: String @search(by: [hash, regexp])
}

type awsEnabledMetrics
  @generate(
    query: { get: false, query: true, aggregate: false }
    mutation: { add: false, delete: false }
    subscription: false
  ) {
  id: String! @id
  metric: String! @search(by: [hash, regexp])
  granularity: String @search(by: [hash, regexp])
}

type awsLcBlockDeviceMapping
  @generate(
    query: { get: false, query: false, aggregate: false }
    mutation: { add: false, delete: false }
    subscription: false
  ) {
  id: String! @id
  virtualName: String @search(by: [hash, regexp])
  deviceName: String @search(by: [hash, regexp])
  noDevice: String @search(by: [hash, regexp])
}

type awsLaunchConfiguration
  @generate(
    query: { get: false, query: false, aggregate: false }
    mutation: { add: false, delete: false }
    subscription: false
  ) {
  launchConfigurationName: String @search(by: [hash, regexp])
  launchConfigurationARN: String @search(by: [hash, regexp])
  imageId: String @search(by: [hash, regexp])
  keyName: String @search(by: [hash, regexp])
  securityGroups: [String] @search(by: [hash])
  classicLinkVPCId: String @search(by: [hash, regexp])
  classicLinkVPCSecurityGroups: [String] @search(by: [hash])
  userData: String @search(by: [hash, regexp])
  instanceType: String @search(by: [hash, regexp])
  kernelId: String @search(by: [hash, regexp])
  ramdiskId: String @search(by: [hash, regexp])
  blockDeviceMappings: [awsLcBlockDeviceMapping]
  instanceMonitoring: String @search(by: [hash, regexp])
  spotPrice: String @search(by: [hash, regexp])
  iamInstanceProfile: String @search(by: [hash, regexp])
  ebsOptimized: String @search(by: [hash, regexp])
  associatePublicIpAddress: String @search(by: [hash, regexp])
  placementTenancy: String @search(by: [hash, regexp])
  metadataOptHttpTokens: String @search(by: [hash, regexp])
  metadataOptHttpPutResponseHopLimit: Int @search
  metadataOptHttpEndpoint: String @search(by: [hash, regexp])
}

#TODO: add iam role connection here
type awsAsg implements awsBaseService @key(fields: "arn") {
  name: String @search(by: [hash, regexp])
  launchConfigurationName: String @search(by: [hash, regexp])
  launchTemplateId: String @search(by: [hash, regexp])
  launchTemplateName: String @search(by: [hash, regexp])
  launchTemplateVersion: String @search(by: [hash, regexp])
  mixedInstancesPolicy: awsMixedInstancesPolicy
  minSize: Int @search
  maxSize: Int @search
  desiredCapacity: Int @search
  predictedCapacity: Int @search
  cooldown: Int @search
  availabilityZones: [String] @search(by: [hash])
  loadBalancerNames: [String] @search(by: [hash])
  targetGroupARNs: [String] @search(by: [hash])
  healthCheckType: String @search(by: [hash, regexp])
  healthCheckGracePeriod: Int @search
  ec2InstanceIds: [String]
  suspendedProcesses: [awsSuspendedProcess]
  placementGroup: String @search(by: [hash, regexp])
  vpcZoneIdentifier: String @search(by: [hash, regexp])
  enabledMetrics: [awsEnabledMetrics]
  status: String @search(by: [hash, regexp])
  terminationPolicies: [String] @search(by: [hash])
  newInstancesProtectedFromScaleIn: String @search(by: [hash, regexp])
  serviceLinkedRoleARN: String @search(by: [hash, regexp])
  maxInstanceLifetime: Int @search
  capacityRebalanceEnabled: String @search(by: [hash, regexp])
  warmPoolConfigMaxGroupPreparedCapacity: Int
  warmPoolConfigMinSize: Int
  warmPoolConfigPoolState: String @search(by: [hash, regexp])
  warmPoolConfigStatus: String @search(by: [hash, regexp])
  warmPoolSize: Int @search
  context: String @search(by: [hash, regexp])
  tags: [awsRawTag]
  launchConfiguration: awsLaunchConfiguration
  ec2Instance: [awsEc2] @hasInverse(field: asg) #change to plural
  elasticBeanstalkEnvs: [awsElasticBeanstalkEnv] @hasInverse(field: asgs)
  securityGroups: [awsSecurityGroup] @hasInverse(field: asg)
  ebs: [awsEbs] @hasInverse(field: asg)
  subnet: [awsSubnet] @hasInverse(field: asg) #change to plural
  iamRole: [awsIamRole] @hasInverse(field: asg)
}
