I have been putting together a Go gRPC client for Cloud Run to use for an application that I am working on. I am able to perform LIST operations on services(and other objects), but not CREATE, REPLACE, DELETE or GET.
I have verified, using tcpdump, that the requests from the client are going to the intended regional endpoint and not to the global endpoint which I am aware only supports LIST.
The error I get is "rpc error: code = NotFound desc = Requested entity was not found." It is unclear to me from this error message being returned what specific entity was not found.
Is it the case that ALL RPC endpoints only support LIST operations currently? I can think of no other explanation for this behaviour. Thanks in advance!
Here is my code:
package main
import (
"context"
"fmt"
runclient "github.com/cristian-radu/cloud-run-grpc/pkg/client"
runpb "github.com/cristian-radu/cloud-run-grpc/pkg/pb"
"google.golang.org/api/option"
)
func main() {
ctx := context.Background()
servicesClient, err := runclient.NewServicesClient(ctx, option.WithEndpoint("us-central1-run.googleapis.com:443"))
if err != nil {
fmt.Println(err)
}
service := runpb.Service{
ApiVersion: "serving.knative.dev/v1",
Kind: "Service",
Metadata: &runpb.ObjectMeta{
Name: "namespaces/{project-id}/services/test",
Namespace: "{project-id}",
Annotations: map[string]string{
"run.googleapis.com/ingress": "all",
},
},
Spec: &runpb.ServiceSpec{
Template: &runpb.RevisionTemplate{
Metadata: &runpb.ObjectMeta{
Annotations: map[string]string{
"autoscaling.knative.dev/maxScale": "10",
},
},
Spec: &runpb.RevisionSpec{
ServiceAccountName: "{service-account}@{project-id}.iam.gserviceaccount.com",
Containers: []*runpb.Container{
{
Image: "us-docker.pkg.dev/cloudrun/container/hello",
Ports: []*runpb.ContainerPort{
{
ContainerPort: 8080,
},
},
},
},
},
},
Traffic: []*runpb.TrafficTarget{
{
Percent: 100,
LatestRevision: true,
},
},
},
}
req := runpb.CreateServiceRequest{
Parent: "namespaces/{project-id}",
Service: &service,
}
_, err = servicesClient.CreateService(ctx, &req)
if err != nil {
fmt.Println(err)
}
authorizedDomainsClient, err := runclient.NewAuthorizedDomainsClient(ctx, option.WithEndpoint("us-central1-run.googleapis.com:443"))
if err != nil {
fmt.Println(err)
}
listAuthorizedDomains := runpb.ListAuthorizedDomainsRequest{Parent: "namespaces/{project-id}"}
authorizedDomainsIterator := authorizedDomainsClient.ListAuthorizedDomains(ctx, &listAuthorizedDomains)
fmt.Printf("Authorized Domains: %v \n\n", authorizedDomainsIterator.Response)
configurationsClient, err := runclient.NewConfigurationsClient(ctx, option.WithEndpoint("us-central1-run.googleapis.com:443"))
if err != nil {
fmt.Println(err)
}
listConfigurations := runpb.ListConfigurationsRequest{Parent: "namespaces/{project-id}"}
configurationsResp, err := configurationsClient.ListConfigurations(ctx, &listConfigurations)
if err != nil {
fmt.Println(err)
}
fmt.Printf("Configurations: %v \n\n", configurationsResp)
domainMappingsClient, err := runclient.NewDomainMappingsClient(ctx, option.WithEndpoint("us-central1-run.googleapis.com:443"))
if err != nil {
fmt.Println(err)
}
listDomainMappings := runpb.ListDomainMappingsRequest{Parent: "namespaces/{project-id}"}
domainMappingsResp, err := domainMappingsClient.ListDomainMappings(ctx, &listDomainMappings)
if err != nil {
fmt.Println(err)
}
fmt.Printf("Domain Mappings: %v \n\n", domainMappingsResp)
revisionsClient, err := runclient.NewRevisionsClient(ctx, option.WithEndpoint("us-central1-run.googleapis.com:443"))
if err != nil {
fmt.Println(err)
}
revisions := runpb.ListRevisionsRequest{Parent: "namespaces/{project-id}"}
revisionsResp, err := revisionsClient.ListRevisions(ctx, &revisions)
if err != nil {
fmt.Println(err)
}
fmt.Printf("Revisions: %v \n\n", revisionsResp)
routesClient, err := runclient.NewRoutesClient(ctx, option.WithEndpoint("us-central1-run.googleapis.com:443"))
if err != nil {
fmt.Println(err)
}
routes := runpb.ListRoutesRequest{Parent: "namespaces/{project-id}"}
routesResp, err := routesClient.ListRoutes(ctx, &routes)
if err != nil {
fmt.Println(err)
}
fmt.Printf("Routes: %v \n\n", routesResp)
}
The output I get:
rpc error: code = NotFound desc = Requested entity was not found.
Authorized Domains: <nil>
Configurations: api_version:"serving.knative.dev/v1" kind:"ConfigurationList" items:{api_version:"serving.knative.dev/v1" kind:"Configuration" metadata:{name:"test-1" namespace:"{project-number}" self_link:"/apis/serving.knative.dev/v1/namespaces/{project-number}/configurations/test-1" uid:"90cc5b51-c40e-4692-871f-f9beb8ab6bd2" resource_version:"AAXFqFkSE1k" generation:2 create_time:{seconds:1624114599 nanos:280472000} labels:{key:"cloud.googleapis.com/location" value:"us-central1"} labels:{key:"serving.knative.dev/route" value:"test-1"} labels:{key:"serving.knative.dev/service" value:"test-1"} labels:{key:"serving.knative.dev/serviceUid" value:"1bf35167-9557-41a1-8a83-fb6b9cc4f3ec"} annotations:{key:"client.knative.dev/user-image" value:"us-docker.pkg.dev/cloudrun/container/hello"} annotations:{key:"run.googleapis.com/client-name" value:"cloud-console"} annotations:{key:"serving.knative.dev/creator" value:"{service-account}@{project-id}.iam.gserviceaccount.com"} annotations:{key:"serving.knative.dev/lastModifier" value:"me@example.com"} owner_references:{api_version:"Service" name:"test-1" uid:"1bf35167-9557-41a1-8a83-fb6b9cc4f3ec" block_owner_deletion:true 5:"serving.knative.dev/v1" 7:1}} spec:{template:{metadata:{name:"test-1-00002-mer" annotations:{key:"autoscaling.knative.dev/maxScale" value:"100"} annotations:{key:"run.googleapis.com/client-name" value:"cloud-console"} annotations:{key:"run.googleapis.com/sandbox" value:"gvisor"}} spec:{container_concurrency:80 timeout_seconds:300 service_account_name:"{service-account}@{project-id}.iam.gserviceaccount.com" containers:{image:"us-docker.pkg.dev/cloudrun/container/hello" resources:{3:8080} ports:{name:"\n\x06memory\x12\x05512Mi"}}}}} status:{observed_generation:2 latest_created_revision_name:"test-1-00002-mer" latest_ready_revision_name:"test-1-00002-mer" conditions:{type:"Ready" status:"True" last_transition_time:{seconds:1624115077 nanos:363769000}}}} unreachable:"asia-east1" unreachable:"asia-east2" unreachable:"asia-northeast1" unreachable:"asia-northeast2" unreachable:"asia-northeast3" unreachable:"asia-south1" unreachable:"asia-south2" unreachable:"asia-southeast1" unreachable:"asia-southeast2" unreachable:"australia-southeast1" unreachable:"australia-southeast2" unreachable:"europe-central2" unreachable:"europe-north1" unreachable:"europe-west1" unreachable:"europe-west2" unreachable:"europe-west3" unreachable:"europe-west4" unreachable:"europe-west6" unreachable:"northamerica-northeast1" unreachable:"southamerica-east1" unreachable:"us-east1" unreachable:"us-east4" unreachable:"us-west1" unreachable:"us-west2" unreachable:"us-west3" unreachable:"us-west4"
Domain Mappings: api_version:"domains.cloudrun.com/v1" kind:"DomainMappingList" 6:"asia-east1" 6:"asia-east2" 6:"asia-northeast1" 6:"asia-northeast2" 6:"asia-northeast3" 6:"asia-south1" 6:"asia-south2" 6:"asia-southeast1" 6:"asia-southeast2" 6:"australia-southeast1" 6:"australia-southeast2" 6:"europe-central2" 6:"europe-north1" 6:"europe-west1" 6:"europe-west2" 6:"europe-west3" 6:"europe-west4" 6:"europe-west6" 6:"northamerica-northeast1" 6:"southamerica-east1" 6:"us-east1" 6:"us-east4" 6:"us-west1" 6:"us-west2" 6:"us-west3" 6:"us-west4"
Revisions: api_version:"serving.knative.dev/v1" kind:"RevisionList" items:{api_version:"serving.knative.dev/v1" kind:"Revision" metadata:{name:"test-1-00002-mer" namespace:"{project-number}" self_link:"/apis/serving.knative.dev/v1/namespaces/{project-number}/revisions/test-1-00002-mer" uid:"a9baacff-d6f8-48ac-bbdc-98ceff612292" resource_version:"AAXFH+YLhiQ" generation:1 create_time:{seconds:1624115070 nanos:453178000} labels:{key:"cloud.googleapis.com/location" value:"us-central1"} labels:{key:"serving.knative.dev/configuration" value:"test-1"} labels:{key:"serving.knative.dev/configurationGeneration" value:"2"} labels:{key:"serving.knative.dev/route" value:"test-1"} labels:{key:"serving.knative.dev/service" value:"test-1"} labels:{key:"serving.knative.dev/serviceUid" value:"1bf35167-9557-41a1-8a83-fb6b9cc4f3ec"} annotations:{key:"autoscaling.knative.dev/maxScale" value:"100"} annotations:{key:"run.googleapis.com/client-name" value:"cloud-console"} annotations:{key:"run.googleapis.com/sandbox" value:"gvisor"} annotations:{key:"serving.knative.dev/creator" value:"me@example.com"} owner_references:{api_version:"Configuration" name:"test-1" uid:"90cc5b51-c40e-4692-871f-f9beb8ab6bd2" block_owner_deletion:true 5:"serving.knative.dev/v1" 7:1}} spec:{container_concurrency:80 timeout_seconds:300 service_account_name:"{service-account}@{project-id}.iam.gserviceaccount.com" containers:{image:"us-docker.pkg.dev/cloudrun/container/hello" resources:{3:8080} ports:{name:"\n\x06memory\x12\x05512Mi"}}} status:{observed_generation:1 conditions:{type:"Ready" status:"True" last_transition_time:{seconds:1624115077 nanos:320431000}} conditions:{type:"Active" status:"True" last_transition_time:{seconds:1624115082 nanos:217762000} severity:"Info"} conditions:{type:"ContainerHealthy" status:"True" last_transition_time:{seconds:1624115077 nanos:320431000}} conditions:{type:"ResourcesAvailable" status:"True" last_transition_time:{seconds:1624115076 nanos:732413000}} log_url:"https://console.cloud.google.com/logs/viewer?project={project-id}&resource=cloud_run_revision/service_name/test-1/revision_name/test-1-00002-mer&advancedFilter=resource.type%3D%22cloud_run_revision%22%0Aresource.labels.service_name%3D%22test-1%22%0Aresource.labels.revision_name%3D%22test-1-00002-mer%22" image_digest:"us-docker.pkg.dev/cloudrun/container/hello@sha256:244fd3d0268aa56777020d0bd1b9c0b828f2f0a8f403dbcd26eba5610a450e2c"}} unreachable:"asia-east1" unreachable:"asia-east2" unreachable:"asia-northeast1" unreachable:"asia-northeast2" unreachable:"asia-northeast3" unreachable:"asia-south1" unreachable:"asia-south2" unreachable:"asia-southeast1" unreachable:"asia-southeast2" unreachable:"australia-southeast1" unreachable:"australia-southeast2" unreachable:"europe-central2" unreachable:"europe-north1" unreachable:"europe-west1" unreachable:"europe-west2" unreachable:"europe-west3" unreachable:"europe-west4" unreachable:"europe-west6" unreachable:"northamerica-northeast1" unreachable:"southamerica-east1" unreachable:"us-east1" unreachable:"us-east4" unreachable:"us-west1" unreachable:"us-west2" unreachable:"us-west3" unreachable:"us-west4"
Routes: api_version:"serving.knative.dev/v1" kind:"RouteList" items:{api_version:"serving.knative.dev/v1" kind:"Route" metadata:{name:"test-1" namespace:"{project-number}" self_link:"/apis/serving.knative.dev/v1/namespaces/{project-number}/routes/test-1" uid:"d9ce0d4d-2477-4d14-9920-2a26728c9b6e" resource_version:"AAXFIQRxbns" generation:1 create_time:{seconds:1624114599 nanos:247571000} labels:{key:"cloud.googleapis.com/location" value:"us-central1"} labels:{key:"serving.knative.dev/service" value:"test-1"} labels:{key:"serving.knative.dev/serviceUid" value:"1bf35167-9557-41a1-8a83-fb6b9cc4f3ec"} annotations:{key:"client.knative.dev/user-image" value:"us-docker.pkg.dev/cloudrun/container/hello"} annotations:{key:"run.googleapis.com/client-name" value:"cloud-console"} annotations:{key:"run.googleapis.com/ingress" value:"all"} annotations:{key:"run.googleapis.com/ingress-status" value:"all"} annotations:{key:"serving.knative.dev/creator" value:"{service-account}@{project-id}.iam.gserviceaccount.com"} annotations:{key:"serving.knative.dev/lastModifier" value:"me@example.com"} owner_references:{api_version:"Service" name:"test-1" uid:"1bf35167-9557-41a1-8a83-fb6b9cc4f3ec" block_owner_deletion:true 5:"serving.knative.dev/v1" 7:1}} spec:{target:{configuration_name:"test-1" percent:100}} status:{observed_generation:1 conditions:{type:"Ready" status:"True" last_transition_time:{seconds:1624115082 nanos:399315000}} traffic:{revision_name:"test-1-00002-mer" percent:100 latest_revision:true} url:"https://test-1-azcqr7ym2a-uc.a.run.app" address:{url:"https://test-1-azcqr7ym2a-uc.a.run.app"}}} unreachable:"asia-east1" unreachable:"asia-east2" unreachable:"asia-northeast1" unreachable:"asia-northeast2" unreachable:"asia-northeast3" unreachable:"asia-south1" unreachable:"asia-south2" unreachable:"asia-southeast1" unreachable:"asia-southeast2" unreachable:"australia-southeast1" unreachable:"australia-southeast2" unreachable:"europe-central2" unreachable:"europe-north1" unreachable:"europe-west1" unreachable:"europe-west2" unreachable:"europe-west3" unreachable:"europe-west4" unreachable:"europe-west6" unreachable:"northamerica-northeast1" unreachable:"southamerica-east1" unreachable:"us-east1" unreachable:"us-east4" unreachable:"us-west1" unreachable:"us-west2" unreachable:"us-west3" unreachable:"us-west4"