agentendpoint/agentendpoint_beta.go (77 lines of code) (raw):

// Copyright 2019 Google Inc. All Rights Reserved. // // 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 // // http://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 agentendpoint import ( "context" "fmt" "sync" "time" agentendpoint "cloud.google.com/go/osconfig/agentendpoint/apiv1beta" "github.com/GoogleCloudPlatform/osconfig/agentconfig" "github.com/GoogleCloudPlatform/osconfig/clog" "github.com/GoogleCloudPlatform/osconfig/osinfo" "github.com/GoogleCloudPlatform/osconfig/pretty" "github.com/GoogleCloudPlatform/osconfig/retryutil" "google.golang.org/api/option" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "cloud.google.com/go/osconfig/agentendpoint/apiv1beta/agentendpointpb" ) // BetaClient is a an agentendpoint client. type BetaClient struct { raw *agentendpoint.Client cancel context.CancelFunc noti chan struct{} closed bool mx sync.Mutex } // NewBetaClient a new agentendpoint Client. func NewBetaClient(ctx context.Context) (*BetaClient, error) { opts := []option.ClientOption{ option.WithoutAuthentication(), // Do not use oauth. option.WithGRPCDialOption(grpc.WithTransportCredentials(credentials.NewTLS(nil))), // Because we disabled Auth we need to specifically enable TLS. option.WithEndpoint(agentconfig.SvcEndpoint()), option.WithUserAgent(agentconfig.UserAgent()), } clog.Debugf(ctx, "Creating new agentendpoint beta client.") c, err := agentendpoint.NewClient(ctx, opts...) if err != nil { return nil, err } return &BetaClient{raw: c, noti: make(chan struct{}, 1)}, nil } // Close cancels WaitForTaskNotification and closes the underlying ClientConn. func (c *BetaClient) Close() error { // Lock so nothing can use the client while we are closing. c.mx.Lock() if c.cancel != nil { c.cancel() } c.closed = true return c.raw.Close() } // Closed reports whether the Client has been closed. func (c *BetaClient) Closed() bool { return c.closed } // LookupEffectiveGuestPolicies calls the agentendpoint service LookupEffectiveGuestPolicies. func (c *BetaClient) LookupEffectiveGuestPolicies(ctx context.Context) (res *agentendpointpb.EffectiveGuestPolicy, err error) { info, err := osinfo.Get() if err != nil { return nil, err } req := &agentendpointpb.LookupEffectiveGuestPolicyRequest{ OsShortName: info.ShortName, OsVersion: info.Version, OsArchitecture: info.Architecture, } token, err := agentconfig.IDToken() if err != nil { return nil, err } clog.Debugf(ctx, "Calling LookupEffectiveGuestPolicies with request:\n%s", pretty.Format(req)) req.InstanceIdToken = token // Only retry up to 30s for LookupEffectiveGuestPolicies in order to not hang up local configs. if err := retryutil.RetryAPICall(ctx, 30*time.Second, "LookupEffectiveGuestPolicies", func() error { res, err = c.raw.LookupEffectiveGuestPolicy(ctx, req) if err != nil { return err } clog.Debugf(ctx, "LookupEffectiveGuestPolicies response:\n%s", pretty.Format(res)) return nil }); err != nil { return nil, fmt.Errorf("error calling LookupEffectiveGuestPolicies: %w", err) } return res, nil }