internal/cloudrunci/platform.go (83 lines of code) (raw):

// Copyright 2019 Google LLC // // 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 cloudrunci import ( "errors" "fmt" "net/http" ) // Platform describes how platforms are defined. type Platform interface { Name() string CommandFlags() []string Validate() error NewRequest(method, url string) (*http.Request, error) } type platformBase struct{} func (p platformBase) NewRequest(method, url string) (*http.Request, error) { return http.NewRequest(method, url, nil) } // ManagedPlatform defines the Cloud Run (fully managed) hosting platform. type ManagedPlatform struct { platformBase Region string } // Name retrieves the ID for the full managed platform. func (p ManagedPlatform) Name() string { return "managed" } // Validate confirms required properties are set. func (p ManagedPlatform) Validate() error { if p.Region == "" { return errors.New("Region missing") } return nil } // CommandFlags retrieves the common gcloud flags for targeting the full managed platform in a given region. func (p ManagedPlatform) CommandFlags() []string { return []string{"--platform", "managed", "--region", p.Region} } // NewRequest creates an HTTP request for a URL on the platform. func (p ManagedPlatform) NewRequest(method, url string) (*http.Request, error) { req, err := p.platformBase.NewRequest(method, url) if err == nil { token, err := CreateIDToken(url) if err != nil { return req, err } req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token)) } return req, err } // GKEPlatform defines the GKE platform for Cloud Run services. type GKEPlatform struct { platformBase Cluster string ClusterLocation string } // Name retrieves the ID for the GKE platform. func (p GKEPlatform) Name() string { return "gke" } // Validate confirms required properties are set. func (p GKEPlatform) Validate() error { if p.Cluster == "" { return errors.New("Cluster missing") } if p.ClusterLocation == "" { return errors.New("Cluster Location missing") } return nil } // CommandFlags retrieves the common gcloud flags for targeting a GKE cluster. func (p GKEPlatform) CommandFlags() []string { return []string{"--platform", "gke", "--cluster", p.Cluster, "--cluster-location", p.ClusterLocation} } // KubernetesPlatform defines use of a knative-compatible kubernetes cluster beyond GKE. type KubernetesPlatform struct { platformBase Kubeconfig string Context string } // Name retrieves the ID for the Kubernetes platform. func (p KubernetesPlatform) Name() string { return "kubernetes" } // Validate confirms required properties are set. func (p KubernetesPlatform) Validate() error { if p.Kubeconfig == "" { return errors.New("kubeconfig missing") } if p.Context == "" { return errors.New("context missing") } return nil } // CommandFlags retrieves the common gcloud flags for targeting a Kubernetes cluster. func (p KubernetesPlatform) CommandFlags() []string { return []string{"--platform", "gke", "--kubeconfig", p.Kubeconfig, "--context", p.Context} }