{
  "typeName" : "AWS::ResilienceHub::App",
  "description" : "Resource Type Definition for AWS::ResilienceHub::App.",
  "sourceUrl" : "https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-resiliencehub",
  "definitions" : {
    "TagValue" : {
      "type" : "string",
      "maxLength" : 256
    },
    "TagMap" : {
      "type" : "object",
      "patternProperties" : {
        ".{1,128}" : {
          "$ref" : "#/definitions/TagValue"
        }
      },
      "additionalProperties" : false
    },
    "PhysicalResourceId" : {
      "type" : "object",
      "additionalProperties" : false,
      "properties" : {
        "AwsAccountId" : {
          "type" : "string",
          "pattern" : "^[0-9]{12}$"
        },
        "AwsRegion" : {
          "type" : "string",
          "pattern" : "^[a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]$"
        },
        "Identifier" : {
          "type" : "string",
          "minLength" : 1,
          "maxLength" : 255
        },
        "Type" : {
          "type" : "string",
          "pattern" : "Arn|Native"
        }
      },
      "required" : [ "Identifier", "Type" ]
    },
    "ResourceMapping" : {
      "description" : "Resource mapping is used to map logical resources from template to physical resource",
      "type" : "object",
      "additionalProperties" : false,
      "properties" : {
        "LogicalStackName" : {
          "type" : "string"
        },
        "MappingType" : {
          "type" : "string",
          "pattern" : "CfnStack|Resource|Terraform"
        },
        "ResourceName" : {
          "type" : "string",
          "pattern" : "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$"
        },
        "TerraformSourceName" : {
          "type" : "string"
        },
        "PhysicalResourceId" : {
          "$ref" : "#/definitions/PhysicalResourceId"
        }
      },
      "required" : [ "MappingType", "PhysicalResourceId" ]
    }
  },
  "properties" : {
    "Name" : {
      "description" : "Name of the app.",
      "type" : "string",
      "pattern" : "^[A-Za-z0-9][A-Za-z0-9_\\-]{1,59}$"
    },
    "Description" : {
      "description" : "App description.",
      "type" : "string",
      "minLength" : 0,
      "maxLength" : 500
    },
    "AppArn" : {
      "type" : "string",
      "description" : "Amazon Resource Name (ARN) of the App.",
      "pattern" : "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9][A-Za-z0-9:_/+=,@.-]{0,1023}$"
    },
    "ResiliencyPolicyArn" : {
      "type" : "string",
      "description" : "Amazon Resource Name (ARN) of the Resiliency Policy.",
      "pattern" : "^arn:(aws|aws-cn|aws-iso|aws-iso-[a-z]{1}|aws-us-gov):[A-Za-z0-9][A-Za-z0-9_/.-]{0,62}:([a-z]{2}-((iso[a-z]{0,1}-)|(gov-)){0,1}[a-z]+-[0-9]):[0-9]{12}:[A-Za-z0-9][A-Za-z0-9:_/+=,@.-]{0,1023}$"
    },
    "Tags" : {
      "$ref" : "#/definitions/TagMap"
    },
    "AppTemplateBody" : {
      "description" : "A string containing full ResilienceHub app template body.",
      "type" : "string",
      "minLength" : 0,
      "maxLength" : 5000,
      "pattern" : "^[\\w\\s:,-\\.'{}\\[\\]:\"]+$"
    },
    "ResourceMappings" : {
      "description" : "An array of ResourceMapping objects.",
      "type" : "array",
      "uniqueItems" : false,
      "insertionOrder" : false,
      "items" : {
        "$ref" : "#/definitions/ResourceMapping"
      }
    },
    "AppAssessmentSchedule" : {
      "description" : "Assessment execution schedule.",
      "type" : "string",
      "enum" : [ "Disabled", "Daily" ]
    }
  },
  "additionalProperties" : false,
  "required" : [ "Name", "AppTemplateBody", "ResourceMappings" ],
  "createOnlyProperties" : [ "/properties/Name" ],
  "readOnlyProperties" : [ "/properties/AppArn" ],
  "primaryIdentifier" : [ "/properties/AppArn" ],
  "handlers" : {
    "create" : {
      "permissions" : [ "cloudformation:DescribeStacks", "cloudformation:ListStackResources", "s3:GetBucketLocation", "s3:GetObject", "s3:ListAllMyBuckets", "autoscaling:DescribeAutoScalingGroups", "apigateway:GET", "ec2:DescribeVolumes", "ec2:DescribeInstances", "ec2:DescribeNatGateways", "ecs:DescribeServices", "elasticfilesystem:DescribeFileSystems", "elasticloadbalancing:DescribeLoadBalancers", "lambda:GetFunction", "rds:DescribeDBInstances", "rds:DescribeDBClusters", "rds:DescribeGlobalClusters", "route53:ListHostedZones", "route53:ListResourceRecordSets", "sqs:GetQueueAttributes", "sns:GetTopicAttributes", "resiliencehub:CreateApp", "resiliencehub:TagResource", "resiliencehub:PutDraftAppVersionTemplate", "resiliencehub:AddDraftAppVersionResourceMappings", "resiliencehub:PublishAppVersion" ]
    },
    "read" : {
      "permissions" : [ "resiliencehub:DescribeApp", "resiliencehub:DescribeAppVersionTemplate", "resiliencehub:ListAppVersionResourceMappings", "resiliencehub:ListTagsForResource" ]
    },
    "update" : {
      "permissions" : [ "cloudformation:DescribeStacks", "cloudformation:ListStackResources", "s3:GetBucketLocation", "s3:GetObject", "s3:ListAllMyBuckets", "autoscaling:DescribeAutoScalingGroups", "apigateway:GET", "ec2:DescribeVolumes", "ec2:DescribeInstances", "ec2:DescribeNatGateways", "ecs:DescribeServices", "elasticfilesystem:DescribeFileSystems", "elasticloadbalancing:DescribeLoadBalancers", "lambda:GetFunction", "rds:DescribeDBInstances", "rds:DescribeDBClusters", "rds:DescribeGlobalClusters", "route53:ListHostedZones", "route53:ListResourceRecordSets", "sqs:GetQueueAttributes", "sns:GetTopicAttributes", "resiliencehub:UpdateApp", "resiliencehub:PutDraftAppVersionTemplate", "resiliencehub:AddDraftAppVersionResourceMappings", "resiliencehub:RemoveDraftAppVersionResourceMappings", "resiliencehub:PublishAppVersion", "resiliencehub:TagResource", "resiliencehub:UntagResource", "resiliencehub:ListTagsForResource" ]
    },
    "delete" : {
      "permissions" : [ "resiliencehub:DeleteApp", "resiliencehub:UntagResource", "resiliencehub:ListApps" ]
    },
    "list" : {
      "permissions" : [ "resiliencehub:ListApps" ]
    }
  }
}