diff --git a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java index 06839ce0c..afdfcb584 100644 --- a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java +++ b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java @@ -573,6 +573,35 @@ public class PipelineYmlSchema implements YamlSchema { resourceTypes.def("docker-image", source, get, put); } + //registry_image + { + AbstractType source = f.ybean("RegistryImageSource"); + addProp(source, "repository", t_ne_string).isPrimary(true); + addProp(source, "tag", t_ne_string); + addProp(source, "username", t_ne_string); + addProp(source, "password", t_ne_string); + addProp(source, "debug", t_boolean); + { + AbstractType contentTrust = f.ybean("RegistryImageContentTrust"); + addProp(contentTrust, "server", t_ne_string); + addProp(contentTrust, "repository_key_id", t_ne_string).isRequired(true); + addProp(contentTrust, "repository_key", t_ne_string).isRequired(true); + addProp(contentTrust, "repository_passphrase", t_ne_string).isRequired(true); + addProp(contentTrust, "tls_key", t_ne_string); + addProp(contentTrust, "tls_cert", t_ne_string); + + addProp(source, "content_trust", contentTrust); + } + + AbstractType get = f.ybean("RegistryImageGetParams"); + addProp(get, "format", f.yenum("RegistryImageFormat", "rootfs", "oci")); + + AbstractType put = f.ybean("RegistryImagePutParams"); + addProp(put, "image", t_ne_string).isPrimary(true); + addProp(put, "additional_tags", t_ne_string); + + resourceTypes.def("registry-image", source, get, put); + } //s3 { YType t_canned_acl = f.yenum("S3CannedAcl", diff --git a/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageContentTrust/repository_key.md b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageContentTrust/repository_key.md new file mode 100644 index 000000000..63970e4d8 --- /dev/null +++ b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageContentTrust/repository_key.md @@ -0,0 +1 @@ + *Required.* Target key used to sign the trusted collection. diff --git a/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageContentTrust/repository_key_id.md b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageContentTrust/repository_key_id.md new file mode 100644 index 000000000..606c47d36 --- /dev/null +++ b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageContentTrust/repository_key_id.md @@ -0,0 +1 @@ +*Required.* Target key's ID used to sign the trusted collection, could be retrieved by `notary key list` diff --git a/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageContentTrust/repository_passphrase.md b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageContentTrust/repository_passphrase.md new file mode 100644 index 000000000..34ad4ad31 --- /dev/null +++ b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageContentTrust/repository_passphrase.md @@ -0,0 +1 @@ +*Required.* The passphrase of the signing/target key. (equal to `DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE`) diff --git a/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageContentTrust/server.md b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageContentTrust/server.md new file mode 100644 index 000000000..24656fd9c --- /dev/null +++ b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageContentTrust/server.md @@ -0,0 +1 @@ +*Optional.* URL for the notary server. (equal to `DOCKER_CONTENT_TRUST_SERVER`) diff --git a/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageContentTrust/tls_cert.md b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageContentTrust/tls_cert.md new file mode 100644 index 000000000..40ba9dfe4 --- /dev/null +++ b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageContentTrust/tls_cert.md @@ -0,0 +1 @@ +*Optional. Default `""`* TLS certificate for the notary server. diff --git a/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageContentTrust/tls_key.md b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageContentTrust/tls_key.md new file mode 100644 index 000000000..7de920971 --- /dev/null +++ b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageContentTrust/tls_key.md @@ -0,0 +1 @@ +*Optional. Default `""`* TLS key for the notary server. diff --git a/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageGetParams/format.md b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageGetParams/format.md new file mode 100644 index 000000000..dbe31ea64 --- /dev/null +++ b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageGetParams/format.md @@ -0,0 +1 @@ +*Optional. Default `rootfs`.* The format to fetch as. diff --git a/headless-services/concourse-language-server/src/main/resources/desc/RegistryImagePutParams/additional_tags.md b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImagePutParams/additional_tags.md new file mode 100644 index 000000000..470fa0e08 --- /dev/null +++ b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImagePutParams/additional_tags.md @@ -0,0 +1,3 @@ +*Optional.* The path to a file with whitespace-separated +list of tag values to tag the image with (in addition to the tag configured in +`source`). diff --git a/headless-services/concourse-language-server/src/main/resources/desc/RegistryImagePutParams/image.md b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImagePutParams/image.md new file mode 100644 index 000000000..04a56676d --- /dev/null +++ b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImagePutParams/image.md @@ -0,0 +1 @@ +*Required.* The path to the OCI image tarball to upload. diff --git a/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageSource/debug.md b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageSource/debug.md new file mode 100644 index 000000000..3851d7d1e --- /dev/null +++ b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageSource/debug.md @@ -0,0 +1,2 @@ +*Optional. Default `false`.* If set, progress bars will be disabled + and debugging output will be printed instead. diff --git a/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageSource/password.md b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageSource/password.md new file mode 100644 index 000000000..11807963f --- /dev/null +++ b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageSource/password.md @@ -0,0 +1,4 @@ +*Optional.* A password to use when + authenticating to the registry. Must be specified for private repos or when + using `put`. + diff --git a/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageSource/repository.md b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageSource/repository.md new file mode 100644 index 000000000..ce92c6efe --- /dev/null +++ b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageSource/repository.md @@ -0,0 +1 @@ +*Required*. The name of the repository, e.g. `alpine`. diff --git a/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageSource/tag.md b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageSource/tag.md new file mode 100644 index 000000000..29512039a --- /dev/null +++ b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageSource/tag.md @@ -0,0 +1 @@ +*Optional*. Default `latest`. The name of the tag to monitor and publish to. diff --git a/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageSource/username.md b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageSource/username.md new file mode 100644 index 000000000..d71c409b0 --- /dev/null +++ b/headless-services/concourse-language-server/src/main/resources/desc/RegistryImageSource/username.md @@ -0,0 +1,4 @@ +*Optional.* A username to use when + authenticating to the registry. Must be specified for private repos or when + using `put`. + diff --git a/headless-services/concourse-language-server/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java b/headless-services/concourse-language-server/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java index 1df109d77..3200b0edb 100644 --- a/headless-services/concourse-language-server/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java +++ b/headless-services/concourse-language-server/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java @@ -1929,7 +1929,7 @@ public class ConcourseEditorTest { ); editor.assertProblems(/*None*/); } - + @Test public void dockerImageResourceSourceReconcileAndHovers() throws Exception { Editor editor; @@ -2122,6 +2122,125 @@ public class ConcourseEditorTest { editor.assertHoverContains("load_bases", "Same as `load_base`, but takes an array"); editor.assertHoverContains("target_name", "Specify the name of the target build stage"); } + + @Test public void registryImageResourceeSourceReconcileAndHovers() throws Exception { + Editor editor; + + editor = harness.newEditor( + "resources:\n" + + "- name: my-docker-image\n" + + " type: registry-image\n" + + " source:\n" + + " tag: latest\n" + ); + editor.assertProblems( + "my-docker-image|Unused 'Resource'", + "source|'repository' is required" + ); + + editor = harness.newEditor( + "resources:\n" + + "- name: my-docker-image\n" + + " type: registry-image\n" + + " source:\n" + + " repository: kdvolder/sts4-build-env\n" + + " tag: latest\n" + + " username: kdvolder\n" + + " password: {{docker_password}}\n" + + " debug: no-bool\n" + + " content_trust: {}\n" + ); + editor.assertProblems( + "my-docker-image|Unused 'Resource'", + "no-bool|boolean", + "content_trust|Properties [repository_key, repository_key_id, repository_passphrase] are required" + ); + + editor.assertHoverContains("repository", "The name of the repository"); + editor.assertHoverContains("tag", "name of the tag"); + editor.assertHoverContains("username", "username to use"); + editor.assertHoverContains("password", "password to use"); + editor.assertHoverContains("debug", "debugging output will be printed"); + + editor = harness.newEditor( + "resources:\n" + + "- name: my-docker-image\n" + + " type: registry-image\n" + + " source:\n" + + " repository: kdvolder/sts4-build-env\n" + + " content_trust:\n"+ + " server: notary.server\n" + + " repository_key: repokey\n" + + " repository_key_id: keyid\n" + + " repository_passphrase: Secret phrase\n" + + " tls_key: tlskey\n" + + " tls_cert: tlscert\n" + + " bogus_prop:\n" + ); + editor.assertProblems( + "my-docker-image|Unused 'Resource'", + "bogus_prop|Unknown property" + ); + editor.assertHoverContains("server", "URL for the notary server"); + editor.assertHoverContains("repository_key_id", "ID used to sign the trusted collection"); + editor.assertHoverContains("repository_key", "Target key used to sign"); + editor.assertHoverContains("repository_passphrase", "passphrase of the signing/target key"); + editor.assertHoverContains("tls_key", "TLS key for the notary server"); + editor.assertHoverContains("tls_cert", "TLS certificate for the notary server"); + } + + @Test public void registryImageResourceGetParamsReconcileAndHovers() throws Exception { + Editor editor; + + editor = harness.newEditor( + "resources:\n" + + "- name: my-docker-image\n" + + " type: registry-image\n" + + "jobs:\n" + + "- name: a-job\n" + + " plan:\n" + + " - get: my-docker-image\n" + + " params:\n" + + " format: bad-format\n" + + " bogus: bad" + ); + + editor.assertProblems( + "bad-format|Valid values are: [oci, rootfs]", + "bogus|Unknown property" + ); + + editor.assertHoverContains("format", "The format to fetch as"); + } + + @Test public void registryImageResourcePutParamsReconcileAndHovers() throws Exception { + Editor editor; + + editor = harness.newEditor( + "resources:\n" + + "- name: my-docker-image\n" + + " type: registry-image\n" + + "jobs:\n" + + "- name: a-job\n" + + " plan:\n" + + " - put: my-docker-image\n" + + " params:\n" + + " image: path/to/image/tarball\n" + + " additional_tags: path/to/tagsfiles\n" + + " bogus: bad\n" + + " get_params:\n" + + " format: bad-format\n" + ); + + editor.assertProblems( + "bogus|Unknown property", + "bad-format|Valid values are: [oci, rootfs]" + ); + + editor.assertHoverContains("image", 4, "path to the OCI image tarball"); + editor.assertHoverContains("additional_tags", "list of tag values"); + editor.assertHoverContains("format", "The format to fetch as"); + } @Test public void s3ResourceSourceInitialResourceImplications() throws Exception { Editor editor;