gcloud Admin API — создание контейнера для запуска в облаке

# #go #gcloud

#Вперед #gcloud

Вопрос:

Я пытаюсь использовать go api для gcloud для создания контейнера.

У меня настроен проект:

 $ gcloud projects list
PROJECT_ID          NAME         PROJECT_NUMBER
sql-manager-293118  sql-manager  789332021319
  

Также настроены учетные данные моего приложения по умолчанию.

Приведенный ниже код работает нормально, но при вызове для создания службы я получаю приведенную ниже ошибку:

 <p>The requested URL <code>/v1alpha1/projects/sql-manager-293118/services?alt=jsonamp;amp;prettyPrint=false</code> was not found on this server.  <ins>That’s all we know.</ins>
  

Я также выполнял более простые запросы с использованием api (например, перечисляя все доступные местоположения для данной службы) и смог выполнить повторную обработку данных без проблем.

Любые рекомендации приветствуются.

 package main

import (
    "context"
    "fmt"
    // "sort"

    "google.golang.org/api/option"
    "google.golang.org/api/run/v1alpha1"
)

const (
    createDefaultClientFlag = true
    scopes = run.CloudPlatformScope
    // List the Cloud Run services in this location
    serviceName = "test"
    locationsId = "us-central1"
    projectId = "sql-manager-293118"
    imageName = "gcr.io/cloudrun/hello"
)

func createDefaultClient(ctx context.Context) (*run.APIService, error) {
    return run.NewService(ctx)
}

func main() {
    // https://godoc.org/google.golang.org/api/run/v1#NewService
    var err error = nil
    var runService *run.APIService = nil

    ctx := context.Background()
    runService, err = createDefaultClient(ctx)

    if err != nil {
        fmt.Println("Error:", err)
        return
    }

    projectsLocationsService := *run.NewProjectsLocationsService(runService)

    // Define the service to deploy
    tmpservice := amp;run.Service{
        ApiVersion: "serving.knative.dev/v1alpha1",
        Kind:       "Service",
        Metadata: amp;run.ObjectMeta{
            Name:      serviceName,
            Namespace: projectId,
        },
        Spec: amp;run.ServiceSpec{
            RunLatest: amp;run.ServiceSpecRunLatest{
                Configuration: amp;run.ConfigurationSpec{
                    RevisionTemplate: amp;run.RevisionTemplate{
                        Metadata: amp;run.ObjectMeta{
                            DeletionGracePeriodSeconds: 0,
                        },
                        Spec: amp;run.RevisionSpec{
                            Container: amp;run.Container{
                                Image: imageName,
                                Resources: amp;run.ResourceRequirements{
                                    Limits: map[string]string{"memory": "256Mi"},
                                },
                                Stdin:     false,
                                StdinOnce: false,
                                Tty:       false,
                            },
                            ContainerConcurrency: 80,
                            TimeoutSeconds:       300,
                        },
                    },
                },
            },
        },
    }

    createCall := projectsLocationsService.Services.Create("projects/"   projectId, tmpservice)
    service, err := createCall.Do()
    fmt.Println(service, err)
    if err != nil {
        fmt.Printf("Error creating new locationservice: %s", err)
    }

    fmt.Printf("%#v", service.Spec)
}
  

Комментарии:

1. Я думаю, что в документах есть ошибка. Просмотр документа об обнаружении сервиса ( ссылка ) и grep v1alpha1/{ parent}/services предполагает, что parent строка должна быть "^projects/[^/] /locations/[^/] $" , т. Е. /projects/${PROJECT}/locations/us-central1/ . Это дало мне 400 (а не 404). Я предполагаю (!?), Что в моем amp;run.Service тоже есть ошибка.

Ответ №1:

ДазВилкин был прав, я должен был использовать /projects/${PROJECT}/locations/us-central1/