From 93c1f43544ce475e424e318ef66a50f6f63ab437 Mon Sep 17 00:00:00 2001 From: Sanne Raymaekers Date: Mon, 28 Aug 2023 13:57:16 +0200 Subject: [PATCH] CreateImageWizard: add WSL image type in preview --- api/schema/imageBuilder.json | 2 +- .../CreateImageWizard/CreateImageWizard.js | 20 +++++++++ .../ImageOutputReleaseSelect.js | 41 +++++++++++-------- .../formComponents/ReviewStep.js | 8 ++++ .../formComponents/TargetEnvironment.js | 22 ++++++++++ src/Components/ImagesTable/ImageDetails.js | 1 + src/Components/ImagesTable/ImageLinkDirect.js | 1 + src/Components/ImagesTable/Target.js | 1 + src/store/imageBuilderApi.ts | 1 + 9 files changed, 78 insertions(+), 19 deletions(-) diff --git a/api/schema/imageBuilder.json b/api/schema/imageBuilder.json index 8fae6283..fec091b8 100644 --- a/api/schema/imageBuilder.json +++ b/api/schema/imageBuilder.json @@ -1 +1 @@ -{"components":{"schemas":{"AWSEC2Clone":{"properties":{"region":{"description":"A region as described in\nhttps://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-regions\n","type":"string"},"share_with_accounts":{"description":"An array of AWS account IDs as described in\nhttps://docs.aws.amazon.com/IAM/latest/UserGuide/console_account-alias.html\n","example":["123456789012"],"items":{"pattern":"^[0-9]{12}$","type":"string"},"maxItems":100,"type":"array"},"share_with_sources":{"example":["12345"],"items":{"type":"string"},"type":"array","uniqueItems":true}},"required":["region"],"type":"object"},"AWSS3UploadRequestOptions":{"type":"object"},"AWSS3UploadStatus":{"properties":{"url":{"type":"string"}},"required":["url"],"type":"object"},"AWSUploadRequestOptions":{"properties":{"share_with_accounts":{"example":["123456789012"],"items":{"type":"string"},"type":"array","uniqueItems":true},"share_with_sources":{"example":["12345"],"items":{"type":"string"},"type":"array","uniqueItems":true}},"type":"object"},"AWSUploadStatus":{"properties":{"ami":{"example":"ami-0c830793775595d4b","type":"string"},"region":{"example":"eu-west-1","type":"string"}},"required":["ami","region"],"type":"object"},"ArchitectureItem":{"properties":{"arch":{"example":"x86_64","type":"string"},"image_types":{"items":{"example":"qcow2","type":"string"},"type":"array"},"repositories":{"description":"Base repositories for the given distribution and architecture.","items":{"$ref":"#/components/schemas/Repository"},"type":"array"}},"required":["arch","image_types","repositories"],"type":"object"},"Architectures":{"items":{"$ref":"#/components/schemas/ArchitectureItem"},"type":"array"},"AzureUploadRequestOptions":{"properties":{"image_name":{"description":"Name of the created image.\nMust begin with a letter or number, end with a letter, number or underscore, and may contain only letters, numbers, underscores, periods, or hyphens.\nThe total length is limited to 60 characters.\n","example":"LinuxImage","maxLength":60,"minLength":1,"pattern":"(^[a-zA-Z0-9]$)|(^[a-zA-Z0-9][a-zA-Z0-9_\\.-]*[a-zA-Z0-9_]$)","type":"string"},"resource_group":{"description":"Name of the resource group where the image should be uploaded.\n","example":"ToucanResourceGroup","type":"string"},"source_id":{"description":"ID of the source that will be used to resolve the tenant and subscription IDs.\nDo not provide a tenant_id or subscription_id when providing a source_id.\n","example":"12345","type":"string"},"subscription_id":{"description":"ID of subscription where the image should be uploaded.\nWhen providing a subscription_id, also be sure to provide a tenant_id and do not include a source_id.\n","example":"4e5d8b2c-ab24-4413-90c5-612306e809e2","type":"string"},"tenant_id":{"description":"ID of the tenant where the image should be uploaded. This link explains how\nto find it in the Azure Portal:\nhttps://docs.microsoft.com/en-us/azure/active-directory/fundamentals/active-directory-how-to-find-tenant\nWhen providing a tenant_id, also be sure to provide a subscription_id and do not include a source_id.\n","example":"5c7ef5b6-1c3f-4da0-a622-0b060239d7d7","type":"string"}},"required":["resource_group"],"type":"object"},"AzureUploadStatus":{"properties":{"image_name":{"example":"my-image","type":"string"}},"required":["image_name"],"type":"object"},"CloneRequest":{"oneOf":[{"$ref":"#/components/schemas/AWSEC2Clone"}]},"CloneResponse":{"properties":{"id":{"example":"123e4567-e89b-12d3-a456-426655440000","format":"uuid","type":"string"}},"required":["id"]},"ClonesResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ClonesResponseItem"},"type":"array"},"links":{"properties":{"first":{"example":"/api/image-builder/v1/composes?limit=10\u0026offset=0","type":"string"},"last":{"example":"/api/image-builder/v1/composes?limit=10\u0026offset=10","type":"string"}},"required":["first","last"],"type":"object"},"meta":{"properties":{"count":{"type":"integer"}},"required":["count"],"type":"object"}},"required":["meta","links","data"]},"ClonesResponseItem":{"properties":{"created_at":{"type":"string"},"id":{"format":"uuid","type":"string"},"request":{}},"required":["id","request","created_at"]},"ComposeMetadata":{"properties":{"ostree_commit":{"description":"ID (hash) of the built commit","type":"string"},"packages":{"description":"Package list including NEVRA","items":{"$ref":"#/components/schemas/PackageMetadata"},"type":"array"}},"type":"object"},"ComposeRequest":{"additionalProperties":false,"properties":{"customizations":{"$ref":"#/components/schemas/Customizations"},"distribution":{"$ref":"#/components/schemas/Distributions"},"image_name":{"example":"MyImageName","maxLength":100,"type":"string"},"image_requests":{"description":"Array of exactly one image request. Having more image requests in one compose is currently not supported.\n","items":{"$ref":"#/components/schemas/ImageRequest"},"maxItems":1,"minItems":1,"type":"array","uniqueItems":true}},"required":["distribution","image_requests"],"type":"object"},"ComposeResponse":{"properties":{"id":{"format":"uuid","type":"string"}},"required":["id"]},"ComposeStatus":{"properties":{"image_status":{"$ref":"#/components/schemas/ImageStatus"},"request":{"$ref":"#/components/schemas/ComposeRequest"}},"required":["image_status","request"]},"ComposeStatusError":{"properties":{"details":{},"id":{"type":"integer"},"reason":{"type":"string"}},"required":["id","reason"]},"ComposesResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ComposesResponseItem"},"type":"array"},"links":{"properties":{"first":{"example":"/api/image-builder/v1/composes?limit=10\u0026offset=0","type":"string"},"last":{"example":"/api/image-builder/v1/composes?limit=10\u0026offset=10","type":"string"}},"required":["first","last"],"type":"object"},"meta":{"properties":{"count":{"type":"integer"}},"required":["count"],"type":"object"}},"required":["meta","links","data"]},"ComposesResponseItem":{"properties":{"created_at":{"type":"string"},"id":{"format":"uuid","type":"string"},"image_name":{"type":"string"},"request":{}},"required":["id","request","created_at"]},"CustomRepository":{"description":"Repository configuration for custom repositories.\nAt least one of the 'baseurl', 'mirrorlist', 'metalink' properties must\nbe specified. If more of them are specified, the order of precedence is\nthe same as listed above. Id is required.\n","properties":{"baseurl":{"example":["https://cdn.redhat.com/content/dist/rhel8/8/x86_64/baseos/os/"],"items":{"format":"uri","type":"string"},"type":"array"},"check_gpg":{"type":"boolean"},"check_repo_gpg":{"type":"boolean"},"enabled":{"type":"boolean"},"filename":{"type":"string"},"gpgkey":{"description":"GPG key used to sign packages in this repository. Can be a gpg key or a URL","example":["-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBGAcScoBEADLf8YHkezJ6adlMYw7aGGIlJalt8Jj2x/B2K+hIfIuxGtpVj7e\nLRgDU76jaT5pVD5mFMJ3pkeneR/cTmqqQkNyQshX2oQXwEzUSb1CNMCfCGgkX8Q2\nzZkrIcCrF0Q2wrKblaudhU+iVanADsm18YEqsb5AU37dtUrM3QYdWg9R+XiPfV8R\nKBjT03vVBOdMSsY39LaCn6Ip1Ovp8IEo/IeEVY1qmCOPAaK0bJH3ufg4Cueks+TS\nwQWTeCLxuZL6OMXoOPKwvMQfxbg1XD8vuZ0Ktj/cNH2xau0xmsAu9HJpekvOPRxl\nyqtjyZfroVieFypwZgvQwtnnM8/gSEu/JVTrY052mEUT7Ccb74kcHFTFfMklnkG/\n0fU4ARa504H3xj0ktbe3vKcPXoPOuKBVsHSv00UGYAyPeuy+87cU/YEhM7k3SVKj\n6eIZgyiMO0wl1YGDRKculwks9A+ulkg1oTb4s3zmZvP07GoTxW42jaK5WS+NhZee\n860XoVhbc1KpS+jfZojsrEtZ8PbUZ+YvF8RprdWArjHbJk2JpRKAxThxsQAsBhG1\n0Lux2WaMB0g2I5PcMdJ/cqjo08ccrjBXuixWri5iu9MXp8qT/fSzNmsdIgn8/qZK\ni8Qulfu77uqhW/wt2btnitgRsqjhxMujYU4Zb4hktF8hKU/XX742qhL5KwARAQAB\ntDFGZWRvcmEgKDM1KSA8ZmVkb3JhLTM1LXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQJOBBMBCAA4FiEEeH6mrhFH7uVsQLMM20Y5cZhnxY8FAmAcScoCGw8FCwkI\nBwIGFQoJCAsCBBYCAwECHgECF4AACgkQ20Y5cZhnxY+NYA/7BYpglySAZYHhjyKh\n/+f6zPfVvbH20Eq3kI7OFBN0nLX+BU1muvS+qTuS3WLrB3m3GultpKREJKLtm5ED\n1rGzXAoT1yp9YI8LADdMCCOyjAjsoWU87YUuC+/bnjrTeR2LROCfyPC76W985iOV\nm5S+bsQDw7C2LrldAM4MDuoyZ1SitGaZ4KQLVt+TEa14isYSGCjzo7PY8V3JOk50\ngqWg82N/bm2EzS7T83WEDb1lvj4IlvxgIqKeg11zXYxmrYSZJJCfvzf+lNS6uxgH\njx/J0ylZ2LibGr6GAAyO9UWrAZSwSM0EcjT8wECnxkSDuyqmWwVvNBXuEIV8Oe3Y\nMiU1fJN8sd7DpsFx5M+XdnMnQS+HrjTPKD3mWrlAdnEThdYV8jZkpWhDys3/99eO\nhk0rLny0jNwkauf/iU8Oc6XvMkjLRMJg5U9VKyJuWWtzwXnjMN5WRFBqK4sZomMM\nftbTH1+5ybRW/A3vBbaxRW2t7UzNjczekSZEiaLN9L/HcJCIR1QF8682DdAlEF9d\nk2gQiYSQAaaJ0JJAzHvRkRJLLgK2YQYiHNVy2t3JyFfsram5wSCWOfhPeIyLBTZJ\nvrpNlPbefsT957Tf2BNIugzZrC5VxDSKkZgRh1VGvSIQnCyzkQy6EU2qPpiW59G/\nhPIXZrKocK3KLS9/izJQTRltjMA=\n=PfT7\n-----END PGP PUBLIC KEY BLOCK-----\n"],"items":{"type":"string"},"type":"array"},"id":{"type":"string"},"metalink":{"example":"https://mirrors.fedoraproject.org/metalink?repo=fedora-32\u0026arch=x86_64","format":"uri","type":"string"},"mirrorlist":{"example":"http://mirrorlist.centos.org/?release=8-stream\u0026arch=aarch64\u0026repo=BaseOS","format":"uri","type":"string"},"name":{"type":"string"},"priority":{"type":"integer"},"ssl_verify":{"type":"boolean"}},"required":["id"],"type":"object"},"Customizations":{"properties":{"custom_repositories":{"items":{"$ref":"#/components/schemas/CustomRepository"},"type":"array"},"filesystem":{"items":{"$ref":"#/components/schemas/Filesystem"},"maxItems":128,"type":"array"},"openscap":{"$ref":"#/components/schemas/OpenSCAP"},"packages":{"example":["postgresql"],"items":{"type":"string"},"maxItems":10000,"type":"array"},"payload_repositories":{"items":{"$ref":"#/components/schemas/Repository"},"type":"array"},"subscription":{"$ref":"#/components/schemas/Subscription"},"users":{"description":"list of users that a customer can add, also specifying their respective groups and SSH keys","items":{"$ref":"#/components/schemas/User"},"type":"array"}},"type":"object"},"DistributionItem":{"properties":{"description":{"example":"Red Hat Enterprise Linux (RHEL) 8.4","type":"string"},"name":{"example":"rhel-84","type":"string"}},"required":["name","description"],"type":"object"},"Distributions":{"enum":["rhel-8","rhel-8-nightly","rhel-84","rhel-85","rhel-86","rhel-87","rhel-88","rhel-9","rhel-9-nightly","rhel-90","rhel-91","rhel-92","centos-8","centos-9","fedora-37","fedora-38","fedora-39"],"type":"string"},"DistributionsResponse":{"items":{"$ref":"#/components/schemas/DistributionItem"},"type":"array"},"Filesystem":{"properties":{"min_size":{"example":1024,"x-go-type":"uint64"},"mountpoint":{"example":"/var","type":"string"}},"required":["mountpoint","min_size"],"type":"object"},"GCPUploadRequestOptions":{"properties":{"share_with_accounts":{"description":"List of valid Google accounts to share the imported Compute Node image with.\nEach string must contain a specifier of the account type. Valid formats are:\n - 'user:{emailid}': An email address that represents a specific\n Google account. For example, 'alice@example.com'.\n - 'serviceAccount:{emailid}': An email address that represents a\n service account. For example, 'my-other-app@appspot.gserviceaccount.com'.\n - 'group:{emailid}': An email address that represents a Google group.\n For example, 'admins@example.com'.\n - 'domain:{domain}': The G Suite domain (primary) that represents all\n the users of that domain. For example, 'google.com' or 'example.com'.\n If not specified, the imported Compute Node image is not shared with any\n account.\n","example":["user:alice@example.com","serviceAccount:my-other-app@appspot.gserviceaccount.com","group:admins@example.com","domain:example.com"],"items":{"type":"string"},"type":"array","uniqueItems":true}},"required":["share_with_accounts"],"type":"object"},"GCPUploadStatus":{"properties":{"image_name":{"example":"my-image","type":"string"},"project_id":{"example":"ascendant-braid-303513","type":"string"}},"required":["project_id","image_name"],"type":"object"},"HTTPError":{"properties":{"detail":{"type":"string"},"title":{"type":"string"}},"required":["title","detail"]},"HTTPErrorList":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/HTTPError"},"type":"array"}},"required":["errors"]},"ImageRequest":{"additionalProperties":false,"properties":{"architecture":{"description":"CPU architecture of the image, x86_64 and aarch64 are currently supported.\n","enum":["x86_64","aarch64"],"type":"string"},"image_type":{"$ref":"#/components/schemas/ImageTypes"},"ostree":{"$ref":"#/components/schemas/OSTree"},"upload_request":{"$ref":"#/components/schemas/UploadRequest"}},"required":["architecture","image_type","upload_request"],"type":"object"},"ImageStatus":{"properties":{"error":{"$ref":"#/components/schemas/ComposeStatusError"},"status":{"enum":["success","failure","pending","building","uploading","registering"],"example":"success","type":"string"},"upload_status":{"$ref":"#/components/schemas/UploadStatus"}},"required":["status"]},"ImageTypes":{"enum":["aws","azure","edge-commit","edge-installer","gcp","guest-image","image-installer","vsphere","vsphere-ova","ami","rhel-edge-commit","rhel-edge-installer","vhd"],"type":"string"},"OSTree":{"properties":{"contenturl":{"description":"A URL which, if set, is used for fetching content. Implies that `url` is set as well,\nwhich will be used for metadata only.\n","type":"string"},"parent":{"description":"Can be either a commit (example: 02604b2da6e954bd34b8b82a835e5a77d2b60ffa), or a branch-like reference (example: rhel/8/x86_64/edge)\n","example":"rhel/8/x86_64/edge","type":"string"},"ref":{"example":"rhel/8/x86_64/edge","type":"string"},"rhsm":{"description":"Determines whether a valid subscription manager (candlepin) identity is required to\naccess this repository. Consumer certificates will be used as client certificates when\nfetching metadata and content.\n","type":"boolean"},"url":{"type":"string"}},"type":"object"},"OpenSCAP":{"properties":{"profile_id":{"example":"xccdf_org.ssgproject.content_profile_cis","type":"string"}},"required":["profile_id"],"type":"object"},"Package":{"properties":{"name":{"type":"string"},"summary":{"type":"string"}},"required":["name","summary"]},"PackageMetadata":{"properties":{"arch":{"type":"string"},"epoch":{"type":"string"},"name":{"type":"string"},"release":{"type":"string"},"sigmd5":{"type":"string"},"signature":{"type":"string"},"type":{"type":"string"},"version":{"type":"string"}},"required":["type","name","version","release","arch","sigmd5"]},"PackagesResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Package"},"type":"array"},"links":{"properties":{"first":{"example":"/api/image-builder/v1/packages?limit=10\u0026offset=0\u0026distribution....","type":"string"},"last":{"example":"/api/image-builder/v1/packages?limit=10\u0026offset=10\u0026distribution....","type":"string"}},"required":["first","last"],"type":"object"},"meta":{"properties":{"count":{"type":"integer"}},"required":["count"],"type":"object"}},"required":["meta","links","data"],"type":"object"},"Readiness":{"properties":{"readiness":{"type":"string"}},"required":["readiness"],"type":"object"},"Repository":{"properties":{"baseurl":{"example":"https://cdn.redhat.com/content/dist/rhel8/8/x86_64/baseos/os/","format":"uri","type":"string"},"check_gpg":{"type":"boolean"},"check_repo_gpg":{"default":false,"description":"Enables gpg verification of the repository metadata\n","type":"boolean"},"gpgkey":{"type":"string"},"ignore_ssl":{"type":"boolean"},"metalink":{"example":"https://mirrors.fedoraproject.org/metalink?repo=fedora-32\u0026arch=x86_64","format":"uri","type":"string"},"mirrorlist":{"example":"http://mirrorlist.centos.org/?release=8-stream\u0026arch=aarch64\u0026repo=BaseOS","format":"uri","type":"string"},"rhsm":{"type":"boolean"}},"required":["rhsm"],"type":"object"},"Subscription":{"properties":{"activation-key":{"example":"my-secret-key","format":"password","type":"string"},"base-url":{"example":"http://cdn.redhat.com/","type":"string"},"insights":{"example":true,"type":"boolean"},"organization":{"example":2040324,"type":"integer"},"rhc":{"default":false,"description":"Optional flag to use rhc to register the system, which also always enables Insights.\n","example":true,"type":"boolean"},"server-url":{"example":"subscription.rhsm.redhat.com","type":"string"}},"required":["organization","activation-key","server-url","base-url","insights"],"type":"object"},"UploadRequest":{"properties":{"options":{"anyOf":[{"$ref":"#/components/schemas/AWSUploadRequestOptions"},{"$ref":"#/components/schemas/AWSS3UploadRequestOptions"},{"$ref":"#/components/schemas/GCPUploadRequestOptions"},{"$ref":"#/components/schemas/AzureUploadRequestOptions"}]},"type":{"$ref":"#/components/schemas/UploadTypes"}},"required":["type","options"],"type":"object"},"UploadStatus":{"properties":{"options":{"oneOf":[{"$ref":"#/components/schemas/AWSUploadStatus"},{"$ref":"#/components/schemas/AWSS3UploadStatus"},{"$ref":"#/components/schemas/GCPUploadStatus"},{"$ref":"#/components/schemas/AzureUploadStatus"}]},"status":{"enum":["success","failure","pending","running"],"type":"string"},"type":{"$ref":"#/components/schemas/UploadTypes"}},"required":["status","type","options"]},"UploadTypes":{"enum":["aws","gcp","azure","aws.s3"],"type":"string"},"User":{"properties":{"name":{"example":"user1","type":"string"},"ssh_key":{"example":"ssh-rsa AAAAB3NzaC1","type":"string"}},"required":["name","ssh_key"],"type":"object"},"Version":{"properties":{"version":{"type":"string"}},"required":["version"]}}},"info":{"description":"Service that relays image build requests","license":{"name":"Apache 2.0","url":"https://www.apache.org/licenses/LICENSE-2.0.html"},"title":"Image-builder service","version":"1.0"},"openapi":"3.0.1","paths":{"/architectures/{distribution}":{"get":{"operationId":"GetArchitectures","parameters":[{"description":"distribution for which to look up available architectures","example":"rhel-84","in":"path","name":"distribution","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Architectures"}}},"description":"a list of available architectures and their associated image types"}},"summary":"get the architectures and their image types available for a given distribution"}},"/clones/{id}":{"get":{"description":"status of a clone","operationId":"GetCloneStatus","parameters":[{"description":"Id of clone status to get","in":"path","name":"id","required":true,"schema":{"example":"123e4567-e89b-12d3-a456-426655440000","format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadStatus"}}},"description":"clone status"}},"summary":"get status of a compose clone"}},"/compose":{"post":{"description":"compose image","operationId":"ComposeImage","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComposeRequest"}}},"description":"details of image to be composed","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComposeResponse"}}},"description":"compose has started"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPErrorList"}}},"description":"the compose request is malformed"}},"summary":"compose image"}},"/composes":{"get":{"operationId":"GetComposes","parameters":[{"description":"max amount of composes, default 100","in":"query","name":"limit","schema":{"default":100,"maximum":100,"minimum":1,"type":"integer"}},{"description":"composes page offset, default 0","in":"query","name":"offset","schema":{"default":0,"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComposesResponse"}}},"description":"a list of composes"}},"summary":"get a collection of previous compose requests for the logged in user"}},"/composes/{composeId}":{"delete":{"description":"Deletes a compose, the compose will still count towards quota.\n","operationId":"DeleteCompose","responses":{"200":{"description":"OK"}},"summary":"delete a compose"},"get":{"description":"status of an image compose","operationId":"GetComposeStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComposeStatus"}}},"description":"compose status"}},"summary":"get status of an image compose"},"parameters":[{"description":"Id of compose","in":"path","name":"composeId","required":true,"schema":{"example":"123e4567-e89b-12d3-a456-426655440000","format":"uuid","type":"string"}}]},"/composes/{composeId}/clone":{"post":{"description":"Clones a compose. Only composes with the 'aws' image type currently support cloning.\n","operationId":"CloneCompose","parameters":[{"description":"Id of compose to clone","in":"path","name":"composeId","required":true,"schema":{"example":"123e4567-e89b-12d3-a456-426655440000","format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloneRequest"}}},"description":"details of the new clone","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloneResponse"}}},"description":"cloning has started"}},"summary":"clone a compose"}},"/composes/{composeId}/clones":{"get":{"description":"Returns a list of all the clones which were started for a compose\n","operationId":"GetComposeClones","parameters":[{"description":"Id of compose to get the clones of","in":"path","name":"composeId","required":true,"schema":{"example":"123e4567-e89b-12d3-a456-426655440000","format":"uuid","type":"string"}},{"description":"max amount of clones, default 100","in":"query","name":"limit","schema":{"default":100,"maximum":100,"minimum":1,"type":"integer"}},{"description":"clones page offset, default 0","in":"query","name":"offset","schema":{"default":0,"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClonesResponse"}}},"description":"compose clones"}},"summary":"get clones of a compose"}},"/composes/{composeId}/metadata":{"get":{"description":"metadata for an image compose","operationId":"GetComposeMetadata","parameters":[{"description":"Id of compose metadata to get","in":"path","name":"composeId","required":true,"schema":{"example":"123e4567-e89b-12d3-a456-426655440000","format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComposeMetadata"}}},"description":"compose metadata"}},"summary":"get metadata of an image compose"}},"/distributions":{"get":{"operationId":"GetDistributions","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DistributionsResponse"}}},"description":"a list of available distributions"}},"summary":"get the available distributions"}},"/openapi.json":{"get":{"operationId":"GetOpenapiJson","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"returns this document"}},"summary":"get the openapi json specification","tags":["meta"]}},"/packages":{"get":{"operationId":"GetPackages","parameters":[{"description":"distribution to look up packages for","in":"query","name":"distribution","required":true,"schema":{"$ref":"#/components/schemas/Distributions"}},{"description":"architecture to look up packages for","in":"query","name":"architecture","required":true,"schema":{"enum":["x86_64","aarch64"],"type":"string"}},{"description":"packages to look for","in":"query","name":"search","required":true,"schema":{"type":"string"}},{"description":"max amount of packages, default 100","in":"query","name":"limit","schema":{"default":100,"maximum":100,"minimum":1,"type":"integer"}},{"description":"packages page offset, default 0","in":"query","name":"offset","schema":{"default":0,"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackagesResponse"}}},"description":"a list of packages"}}}},"/ready":{"get":{"operationId":"GetReadiness","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Readiness"}}},"description":"readiness"}},"summary":"return the readiness"}},"/version":{"get":{"description":"get the service version","operationId":"GetVersion","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Version"}}},"description":"a service version"}},"summary":"get the service version"}}},"servers":[{"url":"/api/image-builder/v1"},{"url":"/api/image-builder/v1.0"},{"url":"/api/image-builder/v1.0"}]} +{"components":{"schemas":{"AWSEC2Clone":{"properties":{"region":{"description":"A region as described in\nhttps://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-regions\n","type":"string"},"share_with_accounts":{"description":"An array of AWS account IDs as described in\nhttps://docs.aws.amazon.com/IAM/latest/UserGuide/console_account-alias.html\n","example":["123456789012"],"items":{"pattern":"^[0-9]{12}$","type":"string"},"maxItems":100,"type":"array"},"share_with_sources":{"example":["12345"],"items":{"type":"string"},"type":"array","uniqueItems":true}},"required":["region"],"type":"object"},"AWSS3UploadRequestOptions":{"type":"object"},"AWSS3UploadStatus":{"properties":{"url":{"type":"string"}},"required":["url"],"type":"object"},"AWSUploadRequestOptions":{"properties":{"share_with_accounts":{"example":["123456789012"],"items":{"type":"string"},"type":"array","uniqueItems":true},"share_with_sources":{"example":["12345"],"items":{"type":"string"},"type":"array","uniqueItems":true}},"type":"object"},"AWSUploadStatus":{"properties":{"ami":{"example":"ami-0c830793775595d4b","type":"string"},"region":{"example":"eu-west-1","type":"string"}},"required":["ami","region"],"type":"object"},"ArchitectureItem":{"properties":{"arch":{"example":"x86_64","type":"string"},"image_types":{"items":{"example":"qcow2","type":"string"},"type":"array"},"repositories":{"description":"Base repositories for the given distribution and architecture.","items":{"$ref":"#/components/schemas/Repository"},"type":"array"}},"required":["arch","image_types","repositories"],"type":"object"},"Architectures":{"items":{"$ref":"#/components/schemas/ArchitectureItem"},"type":"array"},"AzureUploadRequestOptions":{"properties":{"image_name":{"description":"Name of the created image.\nMust begin with a letter or number, end with a letter, number or underscore, and may contain only letters, numbers, underscores, periods, or hyphens.\nThe total length is limited to 60 characters.\n","example":"LinuxImage","maxLength":60,"minLength":1,"pattern":"(^[a-zA-Z0-9]$)|(^[a-zA-Z0-9][a-zA-Z0-9_\\.-]*[a-zA-Z0-9_]$)","type":"string"},"resource_group":{"description":"Name of the resource group where the image should be uploaded.\n","example":"ToucanResourceGroup","type":"string"},"source_id":{"description":"ID of the source that will be used to resolve the tenant and subscription IDs.\nDo not provide a tenant_id or subscription_id when providing a source_id.\n","example":"12345","type":"string"},"subscription_id":{"description":"ID of subscription where the image should be uploaded.\nWhen providing a subscription_id, also be sure to provide a tenant_id and do not include a source_id.\n","example":"4e5d8b2c-ab24-4413-90c5-612306e809e2","type":"string"},"tenant_id":{"description":"ID of the tenant where the image should be uploaded. This link explains how\nto find it in the Azure Portal:\nhttps://docs.microsoft.com/en-us/azure/active-directory/fundamentals/active-directory-how-to-find-tenant\nWhen providing a tenant_id, also be sure to provide a subscription_id and do not include a source_id.\n","example":"5c7ef5b6-1c3f-4da0-a622-0b060239d7d7","type":"string"}},"required":["resource_group"],"type":"object"},"AzureUploadStatus":{"properties":{"image_name":{"example":"my-image","type":"string"}},"required":["image_name"],"type":"object"},"CloneRequest":{"oneOf":[{"$ref":"#/components/schemas/AWSEC2Clone"}]},"CloneResponse":{"properties":{"id":{"example":"123e4567-e89b-12d3-a456-426655440000","format":"uuid","type":"string"}},"required":["id"]},"ClonesResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ClonesResponseItem"},"type":"array"},"links":{"properties":{"first":{"example":"/api/image-builder/v1/composes?limit=10\u0026offset=0","type":"string"},"last":{"example":"/api/image-builder/v1/composes?limit=10\u0026offset=10","type":"string"}},"required":["first","last"],"type":"object"},"meta":{"properties":{"count":{"type":"integer"}},"required":["count"],"type":"object"}},"required":["meta","links","data"]},"ClonesResponseItem":{"properties":{"created_at":{"type":"string"},"id":{"format":"uuid","type":"string"},"request":{}},"required":["id","request","created_at"]},"ComposeMetadata":{"properties":{"ostree_commit":{"description":"ID (hash) of the built commit","type":"string"},"packages":{"description":"Package list including NEVRA","items":{"$ref":"#/components/schemas/PackageMetadata"},"type":"array"}},"type":"object"},"ComposeRequest":{"additionalProperties":false,"properties":{"customizations":{"$ref":"#/components/schemas/Customizations"},"distribution":{"$ref":"#/components/schemas/Distributions"},"image_name":{"example":"MyImageName","maxLength":100,"type":"string"},"image_requests":{"description":"Array of exactly one image request. Having more image requests in one compose is currently not supported.\n","items":{"$ref":"#/components/schemas/ImageRequest"},"maxItems":1,"minItems":1,"type":"array","uniqueItems":true}},"required":["distribution","image_requests"],"type":"object"},"ComposeResponse":{"properties":{"id":{"format":"uuid","type":"string"}},"required":["id"]},"ComposeStatus":{"properties":{"image_status":{"$ref":"#/components/schemas/ImageStatus"},"request":{"$ref":"#/components/schemas/ComposeRequest"}},"required":["image_status","request"]},"ComposeStatusError":{"properties":{"details":{},"id":{"type":"integer"},"reason":{"type":"string"}},"required":["id","reason"]},"ComposesResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ComposesResponseItem"},"type":"array"},"links":{"properties":{"first":{"example":"/api/image-builder/v1/composes?limit=10\u0026offset=0","type":"string"},"last":{"example":"/api/image-builder/v1/composes?limit=10\u0026offset=10","type":"string"}},"required":["first","last"],"type":"object"},"meta":{"properties":{"count":{"type":"integer"}},"required":["count"],"type":"object"}},"required":["meta","links","data"]},"ComposesResponseItem":{"properties":{"created_at":{"type":"string"},"id":{"format":"uuid","type":"string"},"image_name":{"type":"string"},"request":{}},"required":["id","request","created_at"]},"CustomRepository":{"description":"Repository configuration for custom repositories.\nAt least one of the 'baseurl', 'mirrorlist', 'metalink' properties must\nbe specified. If more of them are specified, the order of precedence is\nthe same as listed above. Id is required.\n","properties":{"baseurl":{"example":["https://cdn.redhat.com/content/dist/rhel8/8/x86_64/baseos/os/"],"items":{"format":"uri","type":"string"},"type":"array"},"check_gpg":{"type":"boolean"},"check_repo_gpg":{"type":"boolean"},"enabled":{"type":"boolean"},"filename":{"type":"string"},"gpgkey":{"description":"GPG key used to sign packages in this repository. Can be a gpg key or a URL","example":["-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBGAcScoBEADLf8YHkezJ6adlMYw7aGGIlJalt8Jj2x/B2K+hIfIuxGtpVj7e\nLRgDU76jaT5pVD5mFMJ3pkeneR/cTmqqQkNyQshX2oQXwEzUSb1CNMCfCGgkX8Q2\nzZkrIcCrF0Q2wrKblaudhU+iVanADsm18YEqsb5AU37dtUrM3QYdWg9R+XiPfV8R\nKBjT03vVBOdMSsY39LaCn6Ip1Ovp8IEo/IeEVY1qmCOPAaK0bJH3ufg4Cueks+TS\nwQWTeCLxuZL6OMXoOPKwvMQfxbg1XD8vuZ0Ktj/cNH2xau0xmsAu9HJpekvOPRxl\nyqtjyZfroVieFypwZgvQwtnnM8/gSEu/JVTrY052mEUT7Ccb74kcHFTFfMklnkG/\n0fU4ARa504H3xj0ktbe3vKcPXoPOuKBVsHSv00UGYAyPeuy+87cU/YEhM7k3SVKj\n6eIZgyiMO0wl1YGDRKculwks9A+ulkg1oTb4s3zmZvP07GoTxW42jaK5WS+NhZee\n860XoVhbc1KpS+jfZojsrEtZ8PbUZ+YvF8RprdWArjHbJk2JpRKAxThxsQAsBhG1\n0Lux2WaMB0g2I5PcMdJ/cqjo08ccrjBXuixWri5iu9MXp8qT/fSzNmsdIgn8/qZK\ni8Qulfu77uqhW/wt2btnitgRsqjhxMujYU4Zb4hktF8hKU/XX742qhL5KwARAQAB\ntDFGZWRvcmEgKDM1KSA8ZmVkb3JhLTM1LXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQJOBBMBCAA4FiEEeH6mrhFH7uVsQLMM20Y5cZhnxY8FAmAcScoCGw8FCwkI\nBwIGFQoJCAsCBBYCAwECHgECF4AACgkQ20Y5cZhnxY+NYA/7BYpglySAZYHhjyKh\n/+f6zPfVvbH20Eq3kI7OFBN0nLX+BU1muvS+qTuS3WLrB3m3GultpKREJKLtm5ED\n1rGzXAoT1yp9YI8LADdMCCOyjAjsoWU87YUuC+/bnjrTeR2LROCfyPC76W985iOV\nm5S+bsQDw7C2LrldAM4MDuoyZ1SitGaZ4KQLVt+TEa14isYSGCjzo7PY8V3JOk50\ngqWg82N/bm2EzS7T83WEDb1lvj4IlvxgIqKeg11zXYxmrYSZJJCfvzf+lNS6uxgH\njx/J0ylZ2LibGr6GAAyO9UWrAZSwSM0EcjT8wECnxkSDuyqmWwVvNBXuEIV8Oe3Y\nMiU1fJN8sd7DpsFx5M+XdnMnQS+HrjTPKD3mWrlAdnEThdYV8jZkpWhDys3/99eO\nhk0rLny0jNwkauf/iU8Oc6XvMkjLRMJg5U9VKyJuWWtzwXnjMN5WRFBqK4sZomMM\nftbTH1+5ybRW/A3vBbaxRW2t7UzNjczekSZEiaLN9L/HcJCIR1QF8682DdAlEF9d\nk2gQiYSQAaaJ0JJAzHvRkRJLLgK2YQYiHNVy2t3JyFfsram5wSCWOfhPeIyLBTZJ\nvrpNlPbefsT957Tf2BNIugzZrC5VxDSKkZgRh1VGvSIQnCyzkQy6EU2qPpiW59G/\nhPIXZrKocK3KLS9/izJQTRltjMA=\n=PfT7\n-----END PGP PUBLIC KEY BLOCK-----\n"],"items":{"type":"string"},"type":"array"},"id":{"type":"string"},"metalink":{"example":"https://mirrors.fedoraproject.org/metalink?repo=fedora-32\u0026arch=x86_64","format":"uri","type":"string"},"mirrorlist":{"example":"http://mirrorlist.centos.org/?release=8-stream\u0026arch=aarch64\u0026repo=BaseOS","format":"uri","type":"string"},"name":{"type":"string"},"priority":{"type":"integer"},"ssl_verify":{"type":"boolean"}},"required":["id"],"type":"object"},"Customizations":{"properties":{"custom_repositories":{"items":{"$ref":"#/components/schemas/CustomRepository"},"type":"array"},"filesystem":{"items":{"$ref":"#/components/schemas/Filesystem"},"maxItems":128,"type":"array"},"openscap":{"$ref":"#/components/schemas/OpenSCAP"},"packages":{"example":["postgresql"],"items":{"type":"string"},"maxItems":10000,"type":"array"},"payload_repositories":{"items":{"$ref":"#/components/schemas/Repository"},"type":"array"},"subscription":{"$ref":"#/components/schemas/Subscription"},"users":{"description":"list of users that a customer can add, also specifying their respective groups and SSH keys","items":{"$ref":"#/components/schemas/User"},"type":"array"}},"type":"object"},"DistributionItem":{"properties":{"description":{"example":"Red Hat Enterprise Linux (RHEL) 8.4","type":"string"},"name":{"example":"rhel-84","type":"string"}},"required":["name","description"],"type":"object"},"Distributions":{"enum":["rhel-8","rhel-8-nightly","rhel-84","rhel-85","rhel-86","rhel-87","rhel-88","rhel-9","rhel-9-nightly","rhel-90","rhel-91","rhel-92","centos-8","centos-9","fedora-37","fedora-38","fedora-39"],"type":"string"},"DistributionsResponse":{"items":{"$ref":"#/components/schemas/DistributionItem"},"type":"array"},"Filesystem":{"properties":{"min_size":{"example":1024,"x-go-type":"uint64"},"mountpoint":{"example":"/var","type":"string"}},"required":["mountpoint","min_size"],"type":"object"},"GCPUploadRequestOptions":{"properties":{"share_with_accounts":{"description":"List of valid Google accounts to share the imported Compute Node image with.\nEach string must contain a specifier of the account type. Valid formats are:\n - 'user:{emailid}': An email address that represents a specific\n Google account. For example, 'alice@example.com'.\n - 'serviceAccount:{emailid}': An email address that represents a\n service account. For example, 'my-other-app@appspot.gserviceaccount.com'.\n - 'group:{emailid}': An email address that represents a Google group.\n For example, 'admins@example.com'.\n - 'domain:{domain}': The G Suite domain (primary) that represents all\n the users of that domain. For example, 'google.com' or 'example.com'.\n If not specified, the imported Compute Node image is not shared with any\n account.\n","example":["user:alice@example.com","serviceAccount:my-other-app@appspot.gserviceaccount.com","group:admins@example.com","domain:example.com"],"items":{"type":"string"},"type":"array","uniqueItems":true}},"required":["share_with_accounts"],"type":"object"},"GCPUploadStatus":{"properties":{"image_name":{"example":"my-image","type":"string"},"project_id":{"example":"ascendant-braid-303513","type":"string"}},"required":["project_id","image_name"],"type":"object"},"HTTPError":{"properties":{"detail":{"type":"string"},"title":{"type":"string"}},"required":["title","detail"]},"HTTPErrorList":{"properties":{"errors":{"items":{"$ref":"#/components/schemas/HTTPError"},"type":"array"}},"required":["errors"]},"ImageRequest":{"additionalProperties":false,"properties":{"architecture":{"description":"CPU architecture of the image, x86_64 and aarch64 are currently supported.\n","enum":["x86_64","aarch64"],"type":"string"},"image_type":{"$ref":"#/components/schemas/ImageTypes"},"ostree":{"$ref":"#/components/schemas/OSTree"},"upload_request":{"$ref":"#/components/schemas/UploadRequest"}},"required":["architecture","image_type","upload_request"],"type":"object"},"ImageStatus":{"properties":{"error":{"$ref":"#/components/schemas/ComposeStatusError"},"status":{"enum":["success","failure","pending","building","uploading","registering"],"example":"success","type":"string"},"upload_status":{"$ref":"#/components/schemas/UploadStatus"}},"required":["status"]},"ImageTypes":{"enum":["aws","azure","edge-commit","edge-installer","gcp","guest-image","image-installer","vsphere","vsphere-ova","wsl","ami","rhel-edge-commit","rhel-edge-installer","vhd"],"type":"string"},"OSTree":{"properties":{"contenturl":{"description":"A URL which, if set, is used for fetching content. Implies that `url` is set as well,\nwhich will be used for metadata only.\n","type":"string"},"parent":{"description":"Can be either a commit (example: 02604b2da6e954bd34b8b82a835e5a77d2b60ffa), or a branch-like reference (example: rhel/8/x86_64/edge)\n","example":"rhel/8/x86_64/edge","type":"string"},"ref":{"example":"rhel/8/x86_64/edge","type":"string"},"rhsm":{"description":"Determines whether a valid subscription manager (candlepin) identity is required to\naccess this repository. Consumer certificates will be used as client certificates when\nfetching metadata and content.\n","type":"boolean"},"url":{"type":"string"}},"type":"object"},"OpenSCAP":{"properties":{"profile_id":{"example":"xccdf_org.ssgproject.content_profile_cis","type":"string"}},"required":["profile_id"],"type":"object"},"Package":{"properties":{"name":{"type":"string"},"summary":{"type":"string"}},"required":["name","summary"]},"PackageMetadata":{"properties":{"arch":{"type":"string"},"epoch":{"type":"string"},"name":{"type":"string"},"release":{"type":"string"},"sigmd5":{"type":"string"},"signature":{"type":"string"},"type":{"type":"string"},"version":{"type":"string"}},"required":["type","name","version","release","arch","sigmd5"]},"PackagesResponse":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Package"},"type":"array"},"links":{"properties":{"first":{"example":"/api/image-builder/v1/packages?limit=10\u0026offset=0\u0026distribution....","type":"string"},"last":{"example":"/api/image-builder/v1/packages?limit=10\u0026offset=10\u0026distribution....","type":"string"}},"required":["first","last"],"type":"object"},"meta":{"properties":{"count":{"type":"integer"}},"required":["count"],"type":"object"}},"required":["meta","links","data"],"type":"object"},"Readiness":{"properties":{"readiness":{"type":"string"}},"required":["readiness"],"type":"object"},"Repository":{"properties":{"baseurl":{"example":"https://cdn.redhat.com/content/dist/rhel8/8/x86_64/baseos/os/","format":"uri","type":"string"},"check_gpg":{"type":"boolean"},"check_repo_gpg":{"default":false,"description":"Enables gpg verification of the repository metadata\n","type":"boolean"},"gpgkey":{"type":"string"},"ignore_ssl":{"type":"boolean"},"metalink":{"example":"https://mirrors.fedoraproject.org/metalink?repo=fedora-32\u0026arch=x86_64","format":"uri","type":"string"},"mirrorlist":{"example":"http://mirrorlist.centos.org/?release=8-stream\u0026arch=aarch64\u0026repo=BaseOS","format":"uri","type":"string"},"rhsm":{"type":"boolean"}},"required":["rhsm"],"type":"object"},"Subscription":{"properties":{"activation-key":{"example":"my-secret-key","format":"password","type":"string"},"base-url":{"example":"http://cdn.redhat.com/","type":"string"},"insights":{"example":true,"type":"boolean"},"organization":{"example":2040324,"type":"integer"},"rhc":{"default":false,"description":"Optional flag to use rhc to register the system, which also always enables Insights.\n","example":true,"type":"boolean"},"server-url":{"example":"subscription.rhsm.redhat.com","type":"string"}},"required":["organization","activation-key","server-url","base-url","insights"],"type":"object"},"UploadRequest":{"properties":{"options":{"anyOf":[{"$ref":"#/components/schemas/AWSUploadRequestOptions"},{"$ref":"#/components/schemas/AWSS3UploadRequestOptions"},{"$ref":"#/components/schemas/GCPUploadRequestOptions"},{"$ref":"#/components/schemas/AzureUploadRequestOptions"}]},"type":{"$ref":"#/components/schemas/UploadTypes"}},"required":["type","options"],"type":"object"},"UploadStatus":{"properties":{"options":{"oneOf":[{"$ref":"#/components/schemas/AWSUploadStatus"},{"$ref":"#/components/schemas/AWSS3UploadStatus"},{"$ref":"#/components/schemas/GCPUploadStatus"},{"$ref":"#/components/schemas/AzureUploadStatus"}]},"status":{"enum":["success","failure","pending","running"],"type":"string"},"type":{"$ref":"#/components/schemas/UploadTypes"}},"required":["status","type","options"]},"UploadTypes":{"enum":["aws","gcp","azure","aws.s3"],"type":"string"},"User":{"properties":{"name":{"example":"user1","type":"string"},"ssh_key":{"example":"ssh-rsa AAAAB3NzaC1","type":"string"}},"required":["name","ssh_key"],"type":"object"},"Version":{"properties":{"version":{"type":"string"}},"required":["version"]}}},"info":{"description":"Service that relays image build requests","license":{"name":"Apache 2.0","url":"https://www.apache.org/licenses/LICENSE-2.0.html"},"title":"Image-builder service","version":"1.0"},"openapi":"3.0.1","paths":{"/architectures/{distribution}":{"get":{"operationId":"GetArchitectures","parameters":[{"description":"distribution for which to look up available architectures","example":"rhel-84","in":"path","name":"distribution","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Architectures"}}},"description":"a list of available architectures and their associated image types"}},"summary":"get the architectures and their image types available for a given distribution"}},"/clones/{id}":{"get":{"description":"status of a clone","operationId":"GetCloneStatus","parameters":[{"description":"Id of clone status to get","in":"path","name":"id","required":true,"schema":{"example":"123e4567-e89b-12d3-a456-426655440000","format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadStatus"}}},"description":"clone status"}},"summary":"get status of a compose clone"}},"/compose":{"post":{"description":"compose image","operationId":"ComposeImage","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComposeRequest"}}},"description":"details of image to be composed","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComposeResponse"}}},"description":"compose has started"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPErrorList"}}},"description":"the compose request is malformed"}},"summary":"compose image"}},"/composes":{"get":{"operationId":"GetComposes","parameters":[{"description":"max amount of composes, default 100","in":"query","name":"limit","schema":{"default":100,"maximum":100,"minimum":1,"type":"integer"}},{"description":"composes page offset, default 0","in":"query","name":"offset","schema":{"default":0,"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComposesResponse"}}},"description":"a list of composes"}},"summary":"get a collection of previous compose requests for the logged in user"}},"/composes/{composeId}":{"delete":{"description":"Deletes a compose, the compose will still count towards quota.\n","operationId":"DeleteCompose","responses":{"200":{"description":"OK"}},"summary":"delete a compose"},"get":{"description":"status of an image compose","operationId":"GetComposeStatus","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComposeStatus"}}},"description":"compose status"}},"summary":"get status of an image compose"},"parameters":[{"description":"Id of compose","in":"path","name":"composeId","required":true,"schema":{"example":"123e4567-e89b-12d3-a456-426655440000","format":"uuid","type":"string"}}]},"/composes/{composeId}/clone":{"post":{"description":"Clones a compose. Only composes with the 'aws' image type currently support cloning.\n","operationId":"CloneCompose","parameters":[{"description":"Id of compose to clone","in":"path","name":"composeId","required":true,"schema":{"example":"123e4567-e89b-12d3-a456-426655440000","format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloneRequest"}}},"description":"details of the new clone","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloneResponse"}}},"description":"cloning has started"}},"summary":"clone a compose"}},"/composes/{composeId}/clones":{"get":{"description":"Returns a list of all the clones which were started for a compose\n","operationId":"GetComposeClones","parameters":[{"description":"Id of compose to get the clones of","in":"path","name":"composeId","required":true,"schema":{"example":"123e4567-e89b-12d3-a456-426655440000","format":"uuid","type":"string"}},{"description":"max amount of clones, default 100","in":"query","name":"limit","schema":{"default":100,"maximum":100,"minimum":1,"type":"integer"}},{"description":"clones page offset, default 0","in":"query","name":"offset","schema":{"default":0,"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClonesResponse"}}},"description":"compose clones"}},"summary":"get clones of a compose"}},"/composes/{composeId}/metadata":{"get":{"description":"metadata for an image compose","operationId":"GetComposeMetadata","parameters":[{"description":"Id of compose metadata to get","in":"path","name":"composeId","required":true,"schema":{"example":"123e4567-e89b-12d3-a456-426655440000","format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComposeMetadata"}}},"description":"compose metadata"}},"summary":"get metadata of an image compose"}},"/distributions":{"get":{"operationId":"GetDistributions","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DistributionsResponse"}}},"description":"a list of available distributions"}},"summary":"get the available distributions"}},"/openapi.json":{"get":{"operationId":"GetOpenapiJson","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"returns this document"}},"summary":"get the openapi json specification","tags":["meta"]}},"/packages":{"get":{"operationId":"GetPackages","parameters":[{"description":"distribution to look up packages for","in":"query","name":"distribution","required":true,"schema":{"$ref":"#/components/schemas/Distributions"}},{"description":"architecture to look up packages for","in":"query","name":"architecture","required":true,"schema":{"enum":["x86_64","aarch64"],"type":"string"}},{"description":"packages to look for","in":"query","name":"search","required":true,"schema":{"type":"string"}},{"description":"max amount of packages, default 100","in":"query","name":"limit","schema":{"default":100,"maximum":100,"minimum":1,"type":"integer"}},{"description":"packages page offset, default 0","in":"query","name":"offset","schema":{"default":0,"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PackagesResponse"}}},"description":"a list of packages"}}}},"/ready":{"get":{"operationId":"GetReadiness","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Readiness"}}},"description":"readiness"}},"summary":"return the readiness"}},"/version":{"get":{"description":"get the service version","operationId":"GetVersion","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Version"}}},"description":"a service version"}},"summary":"get the service version"}}},"servers":[{"url":"/api/image-builder/v1"},{"url":"/api/image-builder/v1.0"},{"url":"/api/image-builder/v1.0"}]} diff --git a/src/Components/CreateImageWizard/CreateImageWizard.js b/src/Components/CreateImageWizard/CreateImageWizard.js index ad6c981d..1bdef8d6 100644 --- a/src/Components/CreateImageWizard/CreateImageWizard.js +++ b/src/Components/CreateImageWizard/CreateImageWizard.js @@ -268,6 +268,26 @@ const onSave = (values) => { requests.push(request); } + if (values['target-environment']?.wsl) { + const request = { + distribution: values.release, + image_name: values?.['image-name'], + image_description: values?.['image-description'], + image_requests: [ + { + architecture: 'x86_64', + image_type: 'wsl', + upload_request: { + type: 'aws.s3', + options: {}, + }, + }, + ], + customizations, + }; + requests.push(request); + } + return requests; }; diff --git a/src/Components/CreateImageWizard/formComponents/ImageOutputReleaseSelect.js b/src/Components/CreateImageWizard/formComponents/ImageOutputReleaseSelect.js index 36403d64..6f99289d 100644 --- a/src/Components/CreateImageWizard/formComponents/ImageOutputReleaseSelect.js +++ b/src/Components/CreateImageWizard/formComponents/ImageOutputReleaseSelect.js @@ -1,5 +1,6 @@ import React, { useState } from 'react'; +import { FormSpy } from '@data-driven-forms/react-form-renderer'; import useFieldApi from '@data-driven-forms/react-form-renderer/use-field-api'; import useFormApi from '@data-driven-forms/react-form-renderer/use-form-api'; import { @@ -52,24 +53,28 @@ const ImageOutputReleaseSelect = ({ label, isRequired, ...props }) => { }; return ( - - - + + {() => ( + + + + )} + ); }; diff --git a/src/Components/CreateImageWizard/formComponents/ReviewStep.js b/src/Components/CreateImageWizard/formComponents/ReviewStep.js index 82261bb2..da28e532 100644 --- a/src/Components/CreateImageWizard/formComponents/ReviewStep.js +++ b/src/Components/CreateImageWizard/formComponents/ReviewStep.js @@ -112,6 +112,14 @@ const ReviewStep = () => { )} + {getState()?.values?.['target-environment']?.wsl && ( + + + WSL - Windows Subsystem for Linux (.tar.gz) + + + + )} { const { getState, change } = useFormApi(); @@ -28,8 +30,11 @@ const TargetEnvironment = ({ label, isRequired, ...props }) => { vsphere: false, 'guest-image': false, 'image-installer': false, + wsl: false, }); const prefetchSources = provisioningApi.usePrefetch('getSourceList'); + const { isBeta } = useGetEnvironment(); + const release = getState()?.values?.release; useEffect(() => { if (getState()?.values?.[input.name]) { @@ -47,6 +52,11 @@ const TargetEnvironment = ({ label, isRequired, ...props }) => { return newEnv; }); + // hack, wsl isn't supported in el9, causes a rerender + if (environment.wsl && ![RHEL_8, CENTOS_8].includes(release)) { + handleSetEnvironment('wsl', false); + } + const handleKeyDown = (e, env, checked) => { if (e.key === ' ') { handleSetEnvironment(env, checked); @@ -237,6 +247,18 @@ const TargetEnvironment = ({ label, isRequired, ...props }) => { name="Bare metal installer" data-testid="checkbox-image-installer" /> + {[RHEL_8, CENTOS_8].includes(getState()?.values?.release) && + isBeta() && ( + handleSetEnvironment('wsl', checked)} + aria-label="windows subsystem for linux checkbox" + id="checkbox-wsl" + name="WSL" + data-testid="checkbox-wsl" + /> + )} ); diff --git a/src/Components/ImagesTable/ImageDetails.js b/src/Components/ImagesTable/ImageDetails.js index 8ebdab6d..12501a7e 100644 --- a/src/Components/ImagesTable/ImageDetails.js +++ b/src/Components/ImagesTable/ImageDetails.js @@ -338,6 +338,7 @@ const ImageDetails = ({ id }) => { )} {(compose.request.image_requests[0].image_type === 'guest-image' || compose.request.image_requests[0].image_type === 'image-installer' || + compose.request.image_requests[0].image_type === 'wsl' || compose.request.image_requests[0].image_type === 'vsphere' || compose.request.image_requests[0].image_type === 'vsphere-ova' || compose.request.image_requests[0].image_type === diff --git a/src/Components/ImagesTable/ImageLinkDirect.js b/src/Components/ImagesTable/ImageLinkDirect.js index f32037f3..16fa96f6 100644 --- a/src/Components/ImagesTable/ImageLinkDirect.js +++ b/src/Components/ImagesTable/ImageLinkDirect.js @@ -40,6 +40,7 @@ const ImageLinkDirect = ({ imageId, isExpired, isInClonesTable }) => { 'vsphere-ova': '.ova', 'guest-image': '.qcow2', 'image-installer': '.iso', + wsl: '.tar.gz', }; if (uploadStatus.type === 'aws') { diff --git a/src/Components/ImagesTable/Target.js b/src/Components/ImagesTable/Target.js index f1d394fa..c0888d1b 100644 --- a/src/Components/ImagesTable/Target.js +++ b/src/Components/ImagesTable/Target.js @@ -16,6 +16,7 @@ const Target = ({ composeId }) => { 'vsphere-ova': 'VMWare vSphere', 'guest-image': 'Virtualization - Guest image', 'image-installer': 'Bare metal - Installer', + wsl: 'Windows Subsystem for Linux', }; let target; diff --git a/src/store/imageBuilderApi.ts b/src/store/imageBuilderApi.ts index 57cb7d7b..7293846f 100644 --- a/src/store/imageBuilderApi.ts +++ b/src/store/imageBuilderApi.ts @@ -242,6 +242,7 @@ export type ImageTypes = | "image-installer" | "vsphere" | "vsphere-ova" + | "wsl" | "ami" | "rhel-edge-commit" | "rhel-edge-installer"