github.com/google/cloudprober@v0.11.3/rds/server/server.go (about) 1 // Copyright 2018 The Cloudprober Authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 /* 16 Package server provides a ResourceDiscovery gRPC server implementation. It can 17 either be used a standalone server, using the binary in the "cmd" subdirectory, 18 or it can run as a part of the cloudprober binary. 19 */ 20 package server 21 22 import ( 23 "context" 24 "fmt" 25 26 "github.com/google/cloudprober/logger" 27 "github.com/google/cloudprober/rds/file" 28 "github.com/google/cloudprober/rds/gcp" 29 "github.com/google/cloudprober/rds/kubernetes" 30 pb "github.com/google/cloudprober/rds/proto" 31 spb "github.com/google/cloudprober/rds/proto" 32 configpb "github.com/google/cloudprober/rds/server/proto" 33 "google.golang.org/grpc" 34 ) 35 36 // Server implements a ResourceDiscovery gRPC server. 37 type Server struct { 38 providers map[string]Provider 39 l *logger.Logger 40 } 41 42 // Provider is a resource provider, e.g. GCP provider. 43 type Provider interface { 44 ListResources(req *pb.ListResourcesRequest) (*pb.ListResourcesResponse, error) 45 } 46 47 // ListResources implements the ListResources method of the ResourceDiscovery 48 // service. 49 func (s *Server) ListResources(ctx context.Context, req *pb.ListResourcesRequest) (*pb.ListResourcesResponse, error) { 50 p := s.providers[req.GetProvider()] 51 if p == nil { 52 return nil, fmt.Errorf("provider %s is not supported", req.GetProvider()) 53 } 54 return p.ListResources(req) 55 } 56 57 func (s *Server) initProviders(c *configpb.ServerConf) error { 58 var p Provider 59 var err error 60 for _, pc := range c.GetProvider() { 61 id := pc.GetId() 62 switch pc.Config.(type) { 63 case *configpb.Provider_FileConfig: 64 if id == "" { 65 id = file.DefaultProviderID 66 } 67 s.l.Infof("rds.server: adding file provider with id: %s", id) 68 if p, err = file.New(pc.GetFileConfig(), s.l); err != nil { 69 return err 70 } 71 case *configpb.Provider_GcpConfig: 72 if id == "" { 73 id = gcp.DefaultProviderID 74 } 75 s.l.Infof("rds.server: adding GCP provider with id: %s", id) 76 if p, err = gcp.New(pc.GetGcpConfig(), s.l); err != nil { 77 return err 78 } 79 case *configpb.Provider_KubernetesConfig: 80 if id == "" { 81 id = kubernetes.DefaultProviderID 82 } 83 s.l.Infof("rds.server: adding Kubernetes provider with id: %s", id) 84 if p, err = kubernetes.New(pc.GetKubernetesConfig(), s.l); err != nil { 85 return err 86 } 87 } 88 s.providers[id] = p 89 } 90 return nil 91 } 92 93 // New creates a new instance of the ResourceDiscovery Server using the server 94 // conf. 95 func New(initCtx context.Context, c *configpb.ServerConf, providers map[string]Provider, l *logger.Logger) (*Server, error) { 96 srv := &Server{ 97 providers: make(map[string]Provider), 98 l: l, 99 } 100 101 var err error 102 103 if err = srv.initProviders(c); err != nil { 104 return nil, err 105 } 106 107 // If providers are not nil. This option is mainly for testing. 108 if providers != nil { 109 for prefix, p := range providers { 110 srv.providers[prefix] = p 111 } 112 } 113 114 return srv, nil 115 } 116 117 // RegisterWithGRPC registers the RDS servers with the given gRPC server. 118 func (s *Server) RegisterWithGRPC(grpcServer *grpc.Server) { 119 spb.RegisterResourceDiscoveryServer(grpcServer, s) 120 }