From 2cd437941a045c6ac535bf8bb887dbdf198a7297 Mon Sep 17 00:00:00 2001 From: Richard Carson Derr Date: Tue, 5 Nov 2024 22:54:26 -0500 Subject: [PATCH 1/6] feat(issue-51): build griot as oci image --- MODULE.bazel | 14 ++++++++++---- MODULE.bazel.lock | 38 +++++++++++++++++++------------------- cmd/griot/BUILD.bazel | 16 ++++++++++++++++ 3 files changed, 45 insertions(+), 23 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 85a5a10..518a45a 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -29,6 +29,7 @@ use_repo( "com_github_spf13_cobra", "com_github_spf13_pflag", "com_github_stretchr_testify", + "com_github_swaggest_openapi_go", "com_github_z5labs_bedrock", "com_github_z5labs_humus", "io_opentelemetry_go_contrib_instrumentation_net_http_otelhttp", @@ -40,12 +41,17 @@ use_repo( oci = use_extension("@rules_oci//oci:extensions.bzl", "oci") oci.pull( - name = "distroless_base", - digest = "sha256:ccaef5ee2f1850270d453fdf700a5392534f8d1a8ca2acda391fbb6a06b81c86", - image = "gcr.io/distroless/base", + name = "distroless_static", + digest = "sha256:cc226ca14d17d01d4b278d9489da930a0dd11150df10ae95829d13e6d00fbdbf", + image = "gcr.io/distroless/static", platforms = [ "linux/amd64", "linux/arm64", ], ) -use_repo(oci, "distroless_base", "distroless_base_linux_amd64", "distroless_base_linux_arm64") +use_repo( + oci, + "distroless_static", + "distroless_static_linux_amd64", + "distroless_static_linux_arm64", +) diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 11d6a07..f6daef0 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -614,51 +614,51 @@ "@@rules_oci~//oci:extensions.bzl%oci": { "general": { "bzlTransitiveDigest": "hnn4URp35TJanShVM/sAVr9OPxb2jedn9VKMxicRg+w=", - "usagesDigest": "4T/9WIAiMEEUB1m0pFRls1F/wPKLVrmNgCZxc+LFscM=", + "usagesDigest": "oXC6TYKNuPq6LRJgce3d8HEIGoPUmz8mtFuwL0Ei6yg=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, "generatedRepoSpecs": { - "distroless_base_linux_amd64": { + "distroless_static_linux_amd64": { "bzlFile": "@@rules_oci~//oci/private:pull.bzl", "ruleClassName": "oci_pull", "attributes": { "scheme": "https", "registry": "gcr.io", - "repository": "distroless/base", - "identifier": "sha256:ccaef5ee2f1850270d453fdf700a5392534f8d1a8ca2acda391fbb6a06b81c86", + "repository": "distroless/static", + "identifier": "sha256:cc226ca14d17d01d4b278d9489da930a0dd11150df10ae95829d13e6d00fbdbf", "platform": "linux/amd64", - "target_name": "distroless_base_linux_amd64", + "target_name": "distroless_static_linux_amd64", "bazel_tags": [] } }, - "distroless_base_linux_arm64": { + "distroless_static_linux_arm64": { "bzlFile": "@@rules_oci~//oci/private:pull.bzl", "ruleClassName": "oci_pull", "attributes": { "scheme": "https", "registry": "gcr.io", - "repository": "distroless/base", - "identifier": "sha256:ccaef5ee2f1850270d453fdf700a5392534f8d1a8ca2acda391fbb6a06b81c86", + "repository": "distroless/static", + "identifier": "sha256:cc226ca14d17d01d4b278d9489da930a0dd11150df10ae95829d13e6d00fbdbf", "platform": "linux/arm64", - "target_name": "distroless_base_linux_arm64", + "target_name": "distroless_static_linux_arm64", "bazel_tags": [] } }, - "distroless_base": { + "distroless_static": { "bzlFile": "@@rules_oci~//oci/private:pull.bzl", "ruleClassName": "oci_alias", "attributes": { - "target_name": "distroless_base", + "target_name": "distroless_static", "scheme": "https", "registry": "gcr.io", - "repository": "distroless/base", - "identifier": "sha256:ccaef5ee2f1850270d453fdf700a5392534f8d1a8ca2acda391fbb6a06b81c86", + "repository": "distroless/static", + "identifier": "sha256:cc226ca14d17d01d4b278d9489da930a0dd11150df10ae95829d13e6d00fbdbf", "platforms": { - "@@platforms//cpu:x86_64": "@distroless_base_linux_amd64", - "@@platforms//cpu:arm64": "@distroless_base_linux_arm64" + "@@platforms//cpu:x86_64": "@distroless_static_linux_amd64", + "@@platforms//cpu:arm64": "@distroless_static_linux_arm64" }, - "bzlmod_repository": "distroless_base", + "bzlmod_repository": "distroless_static", "reproducible": true } }, @@ -1047,9 +1047,9 @@ }, "moduleExtensionMetadata": { "explicitRootModuleDirectDeps": [ - "distroless_base", - "distroless_base_linux_amd64", - "distroless_base_linux_arm64" + "distroless_static", + "distroless_static_linux_amd64", + "distroless_static_linux_arm64" ], "explicitRootModuleDirectDevDeps": [], "useAllRepos": "NO", diff --git a/cmd/griot/BUILD.bazel b/cmd/griot/BUILD.bazel index b12a006..03ed561 100644 --- a/cmd/griot/BUILD.bazel +++ b/cmd/griot/BUILD.bazel @@ -1,4 +1,6 @@ load("@rules_go//go:def.bzl", "go_binary", "go_library") +load("@rules_oci//oci:defs.bzl", "oci_image") +load("@rules_pkg//pkg:tar.bzl", "pkg_tar") go_library( name = "griot_lib", @@ -15,5 +17,19 @@ go_library( go_binary( name = "griot", embed = [":griot_lib"], + pure = "on", + static = "on", visibility = ["//visibility:public"], ) + +pkg_tar( + name = "tar", + srcs = [":griot"], +) + +oci_image( + name = "image", + base = "@distroless_static", + entrypoint = ["/griot"], + tars = [":tar"], +) From 91171f7b182e33c5865bf5fb7fe50a134f963231 Mon Sep 17 00:00:00 2001 From: Richard Carson Derr Date: Tue, 5 Nov 2024 22:56:21 -0500 Subject: [PATCH 2/6] feat(issue-51): rough out upload content api --- go.mod | 7 +- go.sum | 52 +++----------- services/content/BUILD.bazel | 7 +- services/content/app.go | 66 +++++++++++++++++ services/content/cmd/content/BUILD.bazel | 31 ++++++++ services/content/cmd/content/main.go | 21 ++++++ services/content/config.yaml | 14 ++++ services/content/endpoint/BUILD.bazel | 14 ++++ .../content/endpoint/upload_content_v1.go | 70 +++++++++++++++++++ 9 files changed, 233 insertions(+), 49 deletions(-) create mode 100644 services/content/app.go create mode 100644 services/content/cmd/content/BUILD.bazel create mode 100644 services/content/cmd/content/main.go create mode 100644 services/content/config.yaml create mode 100644 services/content/endpoint/BUILD.bazel create mode 100644 services/content/endpoint/upload_content_v1.go diff --git a/go.mod b/go.mod index b14b174..5487c81 100644 --- a/go.mod +++ b/go.mod @@ -7,8 +7,9 @@ require ( github.com/spf13/cobra v1.8.1 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.9.0 + github.com/swaggest/openapi-go v0.2.54 github.com/z5labs/bedrock v0.12.2 - github.com/z5labs/humus v0.3.0 + github.com/z5labs/humus v0.4.0 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 go.opentelemetry.io/otel v1.31.0 go.opentelemetry.io/otel/metric v1.31.0 @@ -23,11 +24,10 @@ require ( github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/swaggest/jsonschema-go v0.3.72 // indirect - github.com/swaggest/openapi-go v0.2.54 // indirect github.com/swaggest/refl v1.3.0 // indirect go.opentelemetry.io/contrib/bridges/otelslog v0.6.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.7.0 // indirect @@ -35,7 +35,6 @@ require ( go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 // indirect - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 // indirect go.opentelemetry.io/otel/log v0.7.0 // indirect go.opentelemetry.io/otel/sdk v1.31.0 // indirect go.opentelemetry.io/otel/sdk/log v0.7.0 // indirect diff --git a/go.sum b/go.sum index b7c6a5d..8c4a3ea 100644 --- a/go.sum +++ b/go.sum @@ -22,6 +22,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= github.com/iancoleman/orderedmap v0.3.0 h1:5cbR2grmZR/DiVt+VJopEhtVs9YGInGIxAoMJn+Ichc= github.com/iancoleman/orderedmap v0.3.0/go.mod h1:XuLcCUkdL5owUCQeF2Ue9uuw1EptkJDkXXS7VoV7XGE= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -32,8 +34,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= @@ -55,64 +57,40 @@ github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCO github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/z5labs/bedrock v0.12.0 h1:mv5EQfYXfInlO++IRqsxcPcGCbKPcWKC6oTDP9VMm4E= -github.com/z5labs/bedrock v0.12.0/go.mod h1:IdEKPA+TgqDFsSVD6L+elp9eJGmSL3xQ61bC7UjNmQA= github.com/z5labs/bedrock v0.12.2 h1:B7W8RtfsJXul/NhJpftRD29HL3LCIwq8uKy+kRV+Dy4= github.com/z5labs/bedrock v0.12.2/go.mod h1:zZO69k7KOw8Whms4euhxBbD2N4p2PQ3NVLI0MpqrkLM= -github.com/z5labs/humus v0.2.0 h1:v/gCV2qo3leP7PuYxwmFz8qhS8hboN163PCQtm4WMMQ= -github.com/z5labs/humus v0.2.0/go.mod h1:ypGTw5pq4tlo1yFk1vWYdrUWjqx9aGKUJ0JcpJnp8ps= -github.com/z5labs/humus v0.2.1 h1:ChFLWyXRTauqdccRVOpksaesB+0xSFYE2Q2N+5GOggM= -github.com/z5labs/humus v0.2.1/go.mod h1:2Fw/MjBF3NX7CwzuMPoIQ/1dxK842kVVFnTT2UKaPEs= github.com/z5labs/humus v0.3.0 h1:PrphrbKkYzncL647CeGgLB7cj+hIXPZBfljJKK14W5I= github.com/z5labs/humus v0.3.0/go.mod h1:2Fw/MjBF3NX7CwzuMPoIQ/1dxK842kVVFnTT2UKaPEs= -go.opentelemetry.io/contrib/bridges/otelslog v0.5.0 h1:lU3F57OSLK5mQ1PDBVAfDDaKCPv37MrEbCfTzsF4bz0= -go.opentelemetry.io/contrib/bridges/otelslog v0.5.0/go.mod h1:I84u06zJFr8T5D73fslEUbnRBimVVSBhuVw8L8I92AU= +github.com/z5labs/humus v0.4.0 h1:YnPlbIBBHSljWCyENnwZp6jcCv6Sf5csUf1amBsJzpg= +github.com/z5labs/humus v0.4.0/go.mod h1:2Fw/MjBF3NX7CwzuMPoIQ/1dxK842kVVFnTT2UKaPEs= go.opentelemetry.io/contrib/bridges/otelslog v0.6.0 h1:V/XtFJ8mMisAO2E0tXcgwi40wJUxbiz8I2/RtgaZ8AU= go.opentelemetry.io/contrib/bridges/otelslog v0.6.0/go.mod h1:g7kkoEznNXb0li+YvlwPWoqxTbpC3BtmZtZutB39G4M= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 h1:ZIg3ZT/aQ7AfKqdwp7ECpOK6vHqquXXuyTjIO8ZdmPs= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0/go.mod h1:DQAwmETtZV00skUwgD6+0U89g80NKsJE3DCKeLLPQMI= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.6.0 h1:WYsDPt0fM4KZaMhLvY+x6TVXd85P/KNl3Ez3t+0+kGs= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.6.0/go.mod h1:vfY4arMmvljeXPNJOE0idEwuoPMjAPCWmBMmj6R5Ksw= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.7.0 h1:iNba3cIZTDPB2+IAbVY/3TUN+pCCLrNYo2GaGtsKBak= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.7.0/go.mod h1:l5BDPiZ9FbeejzWTAX6BowMzQOM/GeaUQ6lr3sOcSkc= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.30.0 h1:WypxHH02KX2poqqbaadmkMYalGyy/vil4HE4PM4nRJc= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.30.0/go.mod h1:U79SV99vtvGSEBeeHnpgGJfTsnsdkWLpPN/CcHAzBSI= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.31.0 h1:FZ6ei8GFW7kyPYdxJaV2rgI6M+4tvZzhYsQ2wgyVC08= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.31.0/go.mod h1:MdEu/mC6j3D+tTEfvI15b5Ci2Fn7NneJ71YMoiS3tpI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0 h1:K0XaT3DwHAcV4nKLzcQvwAgSyisUghWoY20I7huthMk= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.31.0/go.mod h1:B5Ki776z/MBnVha1Nzwp5arlzBbE3+1jk+pGmaP5HME= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0 h1:m0yTiGDLUvVYaTFbAvCkVYIYcvwKt3G7OLoN77NUs/8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0/go.mod h1:wBQbT4UekBfegL2nx0Xk1vBcnzyBPsIVm9hRG4fYcr4= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0 h1:FFeLy03iVTXP6ffeN2iXrxfGsZGCjVx0/4KlizjyBwU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.31.0/go.mod h1:TMu73/k1CP8nBUpDLc71Wj/Kf7ZS9FK5b53VapRsP9o= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.6.0 h1:bZHOb8k/CwwSt0DgvgaoOhBXWNdWqFWaIsGTtg1H3KE= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.6.0/go.mod h1:XlV163j81kDdIt5b5BXCjdqVfqJFy/LJrHA697SorvQ= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0 h1:TwmL3O3fRR80m8EshBrd8YydEZMcUCsZXzOUlnFohwM= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.7.0/go.mod h1:tH98dDv5KPmPThswbXA0fr0Lwfs+OhK8HgaCo7PjRrk= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.30.0 h1:IyFlqNsi8VT/nwYlLJfdM0y1gavxGpEvnf6FtVfZ6X4= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.30.0/go.mod h1:bxiX8eUeKoAEQmbq/ecUT8UqZwCjZW52yJrXJUSozsk= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.31.0 h1:HZgBIps9wH0RDrwjrmNa3DVbNRW60HEhdzqZFyAp3fI= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.31.0/go.mod h1:RDRhvt6TDG0eIXmonAx5bd9IcwpqCkziwkOClzWKwAQ= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0 h1:UGZ1QwZWY67Z6BmckTU+9Rxn04m2bD3gD6Mk0OIOCPk= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.31.0/go.mod h1:fcwWuDuaObkkChiDlhEpSq9+X1C0omv+s5mBtToAQ64= -go.opentelemetry.io/otel/log v0.6.0 h1:nH66tr+dmEgW5y+F9LanGJUBYPrRgP4g2EkmPE3LeK8= -go.opentelemetry.io/otel/log v0.6.0/go.mod h1:KdySypjQHhP069JX0z/t26VHwa8vSwzgaKmXtIB3fJM= go.opentelemetry.io/otel/log v0.7.0 h1:d1abJc0b1QQZADKvfe9JqqrfmPYQCz2tUSO+0XZmuV4= go.opentelemetry.io/otel/log v0.7.0/go.mod h1:2jf2z7uVfnzDNknKTO9G+ahcOAyWcp1fJmk/wJjULRo= go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= -go.opentelemetry.io/otel/sdk/log v0.6.0 h1:4J8BwXY4EeDE9Mowg+CyhWVBhTSLXVXodiXxS/+PGqI= -go.opentelemetry.io/otel/sdk/log v0.6.0/go.mod h1:L1DN8RMAduKkrwRAFDEX3E3TLOq46+XMGSbUfHU/+vE= go.opentelemetry.io/otel/sdk/log v0.7.0 h1:dXkeI2S0MLc5g0/AwxTZv6EUEjctiH8aG14Am56NTmQ= go.opentelemetry.io/otel/sdk/log v0.7.0/go.mod h1:oIRXpW+WD6M8BuGj5rtS0aRu/86cbDV/dAfNaZBIjYM= -go.opentelemetry.io/otel/sdk/metric v1.30.0 h1:QJLT8Pe11jyHBHfSAgYH7kEmT24eX792jZO1bo4BXkM= -go.opentelemetry.io/otel/sdk/metric v1.30.0/go.mod h1:waS6P3YqFNzeP01kuo/MBBYqaoBJl7efRQHOaydhy1Y= go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= @@ -121,32 +99,18 @@ go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeX go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= -golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= -golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= -google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= -google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= -google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9 h1:T6rh4haD3GVYsgEfWExoCZA2o2FmbNyKpTuAxbEFPTg= -google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:wp2WsuBYj6j8wUdo3ToZsdxxixbvQNAHqVJrTgi5E5M= google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 h1:2oV8dfuIkM1Ti7DwXc0BJfnwr9csz4TDXI9EmiI+Rbw= google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38/go.mod h1:vuAjtvlwkDKF6L1GQ0SokiRLCGFfeBUXWr/aFFkHACc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 h1:zciRKQ4kBpFgpfC5QQCVtnnNAcLIqweL7plyZRQHVpI= google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= -google.golang.org/grpc v1.66.1 h1:hO5qAXR19+/Z44hmvIM4dQFMSYX9XcWsByfoxutBpAM= -google.golang.org/grpc v1.66.1/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= diff --git a/services/content/BUILD.bazel b/services/content/BUILD.bazel index ca498d2..acc7cfb 100644 --- a/services/content/BUILD.bazel +++ b/services/content/BUILD.bazel @@ -2,11 +2,16 @@ load("@rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "content", - srcs = ["client.go"], + srcs = [ + "app.go", + "client.go", + ], + embedsrcs = ["config.yaml"], importpath = "github.com/z5labs/griot/services/content", visibility = ["//visibility:public"], deps = [ "//services/content/contentpb", + "//services/content/endpoint", "@com_github_z5labs_humus//humuspb", "@com_github_z5labs_humus//rest", "@io_opentelemetry_go_otel//:otel", diff --git a/services/content/app.go b/services/content/app.go new file mode 100644 index 0000000..1fba319 --- /dev/null +++ b/services/content/app.go @@ -0,0 +1,66 @@ +// Copyright 2024 Z5Labs and Contributors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package content + +import ( + "bytes" + "context" + _ "embed" + + "github.com/z5labs/griot/services/content/endpoint" + + "github.com/z5labs/humus/rest" +) + +//go:embed config.yaml +var ConfigBytes []byte + +func Run(f func(context.Context, AppConfig) (*App, error)) { + rest.Run(bytes.NewReader(ConfigBytes), func(ctx context.Context, cfg AppConfig) (*rest.App, error) { + app, err := f(ctx, cfg) + if err != nil { + return nil, err + } + return app.rest, nil + }) +} + +type AppConfig struct { + rest.Config `config:",squash"` +} + +type App struct { + rest *rest.App +} + +func InitApp(ctx context.Context, cfg AppConfig) (*App, error) { + ra := rest.New( + rest.ListenOn(cfg.Http.Port), + rest.Title(cfg.OpenApi.Title), + rest.Version(cfg.OpenApi.Version), + rest.Readiness(nil), + rest.Liveness(nil), + rest.RegisterEndpoint(endpoint.UploadContentV1()), + ) + + a := &App{ + rest: ra, + } + return a, nil +} + +func (a *App) Run(ctx context.Context) error { + return a.rest.Run(ctx) +} diff --git a/services/content/cmd/content/BUILD.bazel b/services/content/cmd/content/BUILD.bazel new file mode 100644 index 0000000..360f18e --- /dev/null +++ b/services/content/cmd/content/BUILD.bazel @@ -0,0 +1,31 @@ +load("@rules_go//go:def.bzl", "go_binary", "go_library") +load("@rules_oci//oci:defs.bzl", "oci_image") +load("@rules_pkg//pkg:tar.bzl", "pkg_tar") + +go_library( + name = "content_lib", + srcs = ["main.go"], + importpath = "github.com/z5labs/griot/services/content/cmd/content", + visibility = ["//visibility:private"], + deps = ["//services/content"], +) + +go_binary( + name = "content", + embed = [":content_lib"], + pure = "on", + static = "on", + visibility = ["//visibility:public"], +) + +pkg_tar( + name = "tar", + srcs = [":content"], +) + +oci_image( + name = "image", + base = "@distroless_static", + entrypoint = ["/content"], + tars = [":tar"], +) diff --git a/services/content/cmd/content/main.go b/services/content/cmd/content/main.go new file mode 100644 index 0000000..aec2812 --- /dev/null +++ b/services/content/cmd/content/main.go @@ -0,0 +1,21 @@ +// Copyright 2024 Z5Labs and Contributors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import "github.com/z5labs/griot/services/content" + +func main() { + content.Run(content.InitApp) +} diff --git a/services/content/config.yaml b/services/content/config.yaml new file mode 100644 index 0000000..4092d8e --- /dev/null +++ b/services/content/config.yaml @@ -0,0 +1,14 @@ +# Copyright 2024 Z5Labs and Contributors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + diff --git a/services/content/endpoint/BUILD.bazel b/services/content/endpoint/BUILD.bazel new file mode 100644 index 0000000..30de7a1 --- /dev/null +++ b/services/content/endpoint/BUILD.bazel @@ -0,0 +1,14 @@ +load("@rules_go//go:def.bzl", "go_library") + +go_library( + name = "endpoint", + srcs = ["upload_content_v1.go"], + importpath = "github.com/z5labs/griot/services/content/endpoint", + visibility = ["//visibility:public"], + deps = [ + "//internal/ptr", + "//services/content/contentpb", + "@com_github_swaggest_openapi_go//openapi3", + "@com_github_z5labs_humus//rest", + ], +) diff --git a/services/content/endpoint/upload_content_v1.go b/services/content/endpoint/upload_content_v1.go new file mode 100644 index 0000000..a6fd5af --- /dev/null +++ b/services/content/endpoint/upload_content_v1.go @@ -0,0 +1,70 @@ +// Copyright 2024 Z5Labs and Contributors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package endpoint + +import ( + "context" + "mime/multipart" + "net/http" + + "github.com/z5labs/griot/internal/ptr" + "github.com/z5labs/griot/services/content/contentpb" + + "github.com/swaggest/openapi-go/openapi3" + "github.com/z5labs/humus/rest" +) + +type uploadContentV1Handler struct{} + +func UploadContentV1() rest.Endpoint { + h := &uploadContentV1Handler{} + + return rest.NewEndpoint( + http.MethodPost, + "/content/upload", + rest.ConsumesMultipartFormData[UploadContentV1Schema]( + rest.ProducesProto(h), + ), + ) +} + +type UploadContentV1Schema struct{} + +func (UploadContentV1Schema) OpenApiV3Schema() (*openapi3.Schema, error) { + var req rest.ProtoRequest[contentpb.Metadata, *contentpb.Metadata] + metadataSchema, err := req.OpenApiV3Schema() + if err != nil { + return nil, err + } + + var schema openapi3.Schema + schema.WithType(openapi3.SchemaTypeObject) + schema.WithProperties(map[string]openapi3.SchemaOrRef{ + "metadata": { + Schema: metadataSchema, + }, + "content": { + Schema: &openapi3.Schema{ + Type: ptr.Ref(openapi3.SchemaTypeString), + Format: ptr.Ref("binary"), + }, + }, + }) + return &schema, nil +} + +func (h *uploadContentV1Handler) Handle(ctx context.Context, req *multipart.Reader) (*contentpb.UploadContentV1Response, error) { + return nil, nil +} From 214ce6d7b224ec2a235f0c7ade90077d781907da Mon Sep 17 00:00:00 2001 From: Richard Carson Derr Date: Tue, 5 Nov 2024 22:59:52 -0500 Subject: [PATCH 3/6] fix(issue-51): updated humus usage --- internal/command/command.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/internal/command/command.go b/internal/command/command.go index 3b6afde..c52ddb8 100644 --- a/internal/command/command.go +++ b/internal/command/command.go @@ -135,13 +135,15 @@ func NewApp(name string, opts ...Option) *App { } func Run[T any](r io.Reader, f func(context.Context, T) (*App, error)) { - humus.Run(r, func(ctx context.Context, cfg T) (humus.App, error) { - app, err := f(ctx, cfg) - if err != nil { - return nil, err - } - return app, nil - }) + humus.Run( + func(ctx context.Context, cfg T) (humus.App, error) { + app, err := f(ctx, cfg) + if err != nil { + return nil, err + } + return app, nil + }, + ) } func (a *App) Run(ctx context.Context) error { From 1566804bb6dba9a8e515139c40a6325252ecbbf6 Mon Sep 17 00:00:00 2001 From: Richard Carson Derr Date: Sat, 9 Nov 2024 00:02:22 -0500 Subject: [PATCH 4/6] feat(issue-51): add targets for local loading and pushing container images --- .github/workflows/ci.yaml | 12 +++---- .github/workflows/release.yaml | 18 +++------- MODULE.bazel.lock | 2 +- cmd/griot/BUILD.bazel | 46 +++++++++++++++++++++++- go.sum | 4 --- services/content/cmd/content/BUILD.bazel | 46 +++++++++++++++++++++++- 6 files changed, 102 insertions(+), 26 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 6139c23..65846b2 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -65,9 +65,9 @@ jobs: - name: Build Container Images run: | - tarballTargets=$(bazel query "kind(filegroup, //...)" | grep ".tar$") - while IFS=';' read -ra tarballs; do - for tarball in "${tarballs[@]}"; do - bazel build $tarball - done - done <<< "$tarballTargets" \ No newline at end of file + imageTargets=$(bazel query "kind(oci_image, //...)" | grep ".tar$") + while IFS=';' read -ra targets; do + for target in "${targets[@]}"; do + bazel build $target + done + done <<< "$imageTargets" \ No newline at end of file diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 8294889..d3e8187 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -44,17 +44,9 @@ jobs: - name: Build and publish images run: | - tarballTargets=$(bazel query "kind(filegroup, //...)" | grep ".tar$") - while IFS=';' read -ra tarballs; do - for tarball in "${tarballs[@]}"; do - bazel build $tarball - tarFiles=$(bazel cquery --noshow_progress --ui_event_filters=-info,-stderr --output=files $tarball) - img=$(docker load -q --input $tarFiles) - imgWithTag=${img#"Loaded image: "} - imgAndTag=(${imgWithTag//:/ }) - img=${imgAndTag[0]} - tag=${imgAndTag[1]} - docker tag $imgWithTag "$img:${{ github.event.release.tag_name }}" - docker push -a $img + pushTargets=$(bazel query "kind(oci_push, //...)") + while IFS=';' read -ra targets; do + for target in "${targets[@]}"; do + bazel run --stamp --embed_label ${{ github.event.release.tag_name }} $target done - done <<< "$tarballTargets" \ No newline at end of file + done <<< "$pushTargets" \ No newline at end of file diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index f6daef0..cbb002f 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -614,7 +614,7 @@ "@@rules_oci~//oci:extensions.bzl%oci": { "general": { "bzlTransitiveDigest": "hnn4URp35TJanShVM/sAVr9OPxb2jedn9VKMxicRg+w=", - "usagesDigest": "oXC6TYKNuPq6LRJgce3d8HEIGoPUmz8mtFuwL0Ei6yg=", + "usagesDigest": "1+QvxWOxBcPXe14d1F45p+s7AassK0mCIL9jhXPTVTI=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, diff --git a/cmd/griot/BUILD.bazel b/cmd/griot/BUILD.bazel index 03ed561..1820ce2 100644 --- a/cmd/griot/BUILD.bazel +++ b/cmd/griot/BUILD.bazel @@ -1,5 +1,6 @@ +load("@aspect_bazel_lib//lib:expand_template.bzl", "expand_template") load("@rules_go//go:def.bzl", "go_binary", "go_library") -load("@rules_oci//oci:defs.bzl", "oci_image") +load("@rules_oci//oci:defs.bzl", "oci_image", "oci_load", "oci_push") load("@rules_pkg//pkg:tar.bzl", "pkg_tar") go_library( @@ -27,9 +28,52 @@ pkg_tar( srcs = [":griot"], ) +expand_template( + name = "labels", + out = "_stamped.labels.txt", + stamp_substitutions = { + "0.0.0": "{{BUILD_EMBED_LABEL}}", + "CREATED_TIMESTAMP": "{{BUILD_TIMESTAMP}}", + }, + template = [ + "org.opencontainers.image.created=CREATED_TIMESTAMP", + "org.opencontainers.image.source=https://github.com/z5labs/griot", + "org.opencontainers.image.version=0.0.0", + "org.opencontainers.image.licenses=Apache-2.0", + "org.opencontainers.image.base.name=gcr.io/distroless/static", + "org.opencontainers.image.base.digest=sha256:cc226ca14d17d01d4b278d9489da930a0dd11150df10ae95829d13e6d00fbdbf", + ], +) + oci_image( name = "image", base = "@distroless_static", entrypoint = ["/griot"], + labels = ":labels", tars = [":tar"], ) + +oci_load( + name = "load", + image = ":image", + repo_tags = ["ghcr.io/z5labs/griot/griot:latest"], +) + +expand_template( + name = "remote_tags", + out = "_stamped.remote_tags.txt", + stamp_substitutions = { + "0.0.0": "{{BUILD_EMBED_LABEL}}", + }, + template = [ + "latest", + "0.0.0", + ], +) + +oci_push( + name = "push", + image = ":image", + remote_tags = ":remote_tags", + repository = "ghcr.io/z5labs/griot/griot", +) diff --git a/go.sum b/go.sum index 8c4a3ea..34dc99c 100644 --- a/go.sum +++ b/go.sum @@ -20,8 +20,6 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU= github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0= github.com/iancoleman/orderedmap v0.3.0 h1:5cbR2grmZR/DiVt+VJopEhtVs9YGInGIxAoMJn+Ichc= @@ -59,8 +57,6 @@ github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3Ifn github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= github.com/z5labs/bedrock v0.12.2 h1:B7W8RtfsJXul/NhJpftRD29HL3LCIwq8uKy+kRV+Dy4= github.com/z5labs/bedrock v0.12.2/go.mod h1:zZO69k7KOw8Whms4euhxBbD2N4p2PQ3NVLI0MpqrkLM= -github.com/z5labs/humus v0.3.0 h1:PrphrbKkYzncL647CeGgLB7cj+hIXPZBfljJKK14W5I= -github.com/z5labs/humus v0.3.0/go.mod h1:2Fw/MjBF3NX7CwzuMPoIQ/1dxK842kVVFnTT2UKaPEs= github.com/z5labs/humus v0.4.0 h1:YnPlbIBBHSljWCyENnwZp6jcCv6Sf5csUf1amBsJzpg= github.com/z5labs/humus v0.4.0/go.mod h1:2Fw/MjBF3NX7CwzuMPoIQ/1dxK842kVVFnTT2UKaPEs= go.opentelemetry.io/contrib/bridges/otelslog v0.6.0 h1:V/XtFJ8mMisAO2E0tXcgwi40wJUxbiz8I2/RtgaZ8AU= diff --git a/services/content/cmd/content/BUILD.bazel b/services/content/cmd/content/BUILD.bazel index 360f18e..41f4dda 100644 --- a/services/content/cmd/content/BUILD.bazel +++ b/services/content/cmd/content/BUILD.bazel @@ -1,5 +1,6 @@ +load("@aspect_bazel_lib//lib:expand_template.bzl", "expand_template") load("@rules_go//go:def.bzl", "go_binary", "go_library") -load("@rules_oci//oci:defs.bzl", "oci_image") +load("@rules_oci//oci:defs.bzl", "oci_image", "oci_load", "oci_push") load("@rules_pkg//pkg:tar.bzl", "pkg_tar") go_library( @@ -23,9 +24,52 @@ pkg_tar( srcs = [":content"], ) +expand_template( + name = "labels", + out = "_stamped.labels.txt", + stamp_substitutions = { + "0.0.0": "{{BUILD_EMBED_LABEL}}", + "CREATED_TIMESTAMP": "{{BUILD_TIMESTAMP}}", + }, + template = [ + "org.opencontainers.image.created=CREATED_TIMESTAMP", + "org.opencontainers.image.source=https://github.com/z5labs/griot", + "org.opencontainers.image.version=0.0.0", + "org.opencontainers.image.licenses=Apache-2.0", + "org.opencontainers.image.base.name=gcr.io/distroless/static", + "org.opencontainers.image.base.digest=sha256:cc226ca14d17d01d4b278d9489da930a0dd11150df10ae95829d13e6d00fbdbf", + ], +) + oci_image( name = "image", base = "@distroless_static", entrypoint = ["/content"], + labels = ":labels", tars = [":tar"], ) + +oci_load( + name = "load", + image = ":image", + repo_tags = ["ghcr.io/z5labs/griot/content:latest"], +) + +expand_template( + name = "remote_tags", + out = "_stamped.remote_tags.txt", + stamp_substitutions = { + "0.0.0": "{{BUILD_EMBED_LABEL}}", + }, + template = [ + "latest", + "0.0.0", + ], +) + +oci_push( + name = "push", + image = ":image", + remote_tags = ":remote_tags", + repository = "ghcr.io/z5labs/griot/content", +) From 235be2a84084bcb25f517dbdef08f96b11ba0c83 Mon Sep 17 00:00:00 2001 From: Richard Carson Derr Date: Sat, 9 Nov 2024 00:09:08 -0500 Subject: [PATCH 5/6] build(issue-51): forgot to remove unecessary grep --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 65846b2..cfacd13 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -65,7 +65,7 @@ jobs: - name: Build Container Images run: | - imageTargets=$(bazel query "kind(oci_image, //...)" | grep ".tar$") + imageTargets=$(bazel query "kind(oci_image, //...)") while IFS=';' read -ra targets; do for target in "${targets[@]}"; do bazel build $target From e65fc564e7672aa9b40211b78b3b2268f5713ff7 Mon Sep 17 00:00:00 2001 From: Richard Carson Derr Date: Sat, 9 Nov 2024 15:01:33 -0500 Subject: [PATCH 6/6] refactor(issue-51): adopt slightly different package layout --- services/content/BUILD.bazel | 7 +--- services/content/app/BUILD.bazel | 12 ++++++ services/content/{ => app}/app.go | 37 ++----------------- services/content/cmd/content/BUILD.bazel | 6 ++- .../content/{ => cmd/content}/config.yaml | 0 services/content/cmd/content/main.go | 14 ++++++- 6 files changed, 34 insertions(+), 42 deletions(-) create mode 100644 services/content/app/BUILD.bazel rename services/content/{ => app}/app.go (59%) rename services/content/{ => cmd/content}/config.yaml (100%) diff --git a/services/content/BUILD.bazel b/services/content/BUILD.bazel index acc7cfb..ca498d2 100644 --- a/services/content/BUILD.bazel +++ b/services/content/BUILD.bazel @@ -2,16 +2,11 @@ load("@rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "content", - srcs = [ - "app.go", - "client.go", - ], - embedsrcs = ["config.yaml"], + srcs = ["client.go"], importpath = "github.com/z5labs/griot/services/content", visibility = ["//visibility:public"], deps = [ "//services/content/contentpb", - "//services/content/endpoint", "@com_github_z5labs_humus//humuspb", "@com_github_z5labs_humus//rest", "@io_opentelemetry_go_otel//:otel", diff --git a/services/content/app/BUILD.bazel b/services/content/app/BUILD.bazel new file mode 100644 index 0000000..edc87c0 --- /dev/null +++ b/services/content/app/BUILD.bazel @@ -0,0 +1,12 @@ +load("@rules_go//go:def.bzl", "go_library") + +go_library( + name = "app", + srcs = ["app.go"], + importpath = "github.com/z5labs/griot/services/content/app", + visibility = ["//visibility:public"], + deps = [ + "//services/content/endpoint", + "@com_github_z5labs_humus//rest", + ], +) diff --git a/services/content/app.go b/services/content/app/app.go similarity index 59% rename from services/content/app.go rename to services/content/app/app.go index 1fba319..7fd4582 100644 --- a/services/content/app.go +++ b/services/content/app/app.go @@ -12,55 +12,26 @@ // See the License for the specific language governing permissions and // limitations under the License. -package content +package app import ( - "bytes" "context" - _ "embed" "github.com/z5labs/griot/services/content/endpoint" "github.com/z5labs/humus/rest" ) -//go:embed config.yaml -var ConfigBytes []byte - -func Run(f func(context.Context, AppConfig) (*App, error)) { - rest.Run(bytes.NewReader(ConfigBytes), func(ctx context.Context, cfg AppConfig) (*rest.App, error) { - app, err := f(ctx, cfg) - if err != nil { - return nil, err - } - return app.rest, nil - }) -} - -type AppConfig struct { +type Config struct { rest.Config `config:",squash"` } -type App struct { - rest *rest.App -} - -func InitApp(ctx context.Context, cfg AppConfig) (*App, error) { +func Init(ctx context.Context, cfg Config) (*rest.App, error) { ra := rest.New( rest.ListenOn(cfg.Http.Port), rest.Title(cfg.OpenApi.Title), rest.Version(cfg.OpenApi.Version), - rest.Readiness(nil), - rest.Liveness(nil), rest.RegisterEndpoint(endpoint.UploadContentV1()), ) - - a := &App{ - rest: ra, - } - return a, nil -} - -func (a *App) Run(ctx context.Context) error { - return a.rest.Run(ctx) + return ra, nil } diff --git a/services/content/cmd/content/BUILD.bazel b/services/content/cmd/content/BUILD.bazel index 41f4dda..def1b1f 100644 --- a/services/content/cmd/content/BUILD.bazel +++ b/services/content/cmd/content/BUILD.bazel @@ -6,9 +6,13 @@ load("@rules_pkg//pkg:tar.bzl", "pkg_tar") go_library( name = "content_lib", srcs = ["main.go"], + embedsrcs = ["config.yaml"], importpath = "github.com/z5labs/griot/services/content/cmd/content", visibility = ["//visibility:private"], - deps = ["//services/content"], + deps = [ + "//services/content/app", + "@com_github_z5labs_humus//rest", + ], ) go_binary( diff --git a/services/content/config.yaml b/services/content/cmd/content/config.yaml similarity index 100% rename from services/content/config.yaml rename to services/content/cmd/content/config.yaml diff --git a/services/content/cmd/content/main.go b/services/content/cmd/content/main.go index aec2812..8b6606b 100644 --- a/services/content/cmd/content/main.go +++ b/services/content/cmd/content/main.go @@ -14,8 +14,18 @@ package main -import "github.com/z5labs/griot/services/content" +import ( + "bytes" + _ "embed" + + "github.com/z5labs/griot/services/content/app" + + "github.com/z5labs/humus/rest" +) + +//go:embed config.yaml +var configBytes []byte func main() { - content.Run(content.InitApp) + rest.Run(bytes.NewReader(configBytes), app.Init) }