11package stub
22
33import (
4- "bytes"
5- "crypto/tls"
6- "crypto/x509"
7- b64 "encoding/base64"
8- "encoding/json"
9- "fmt"
10- "io/ioutil"
11- "mime/multipart"
12- "net/http"
13- "os"
14- "os/exec"
15- "path"
16- "strconv"
17- "strings"
18- "time"
19-
20- uuid "github.com/satori/go.uuid"
21-
22- "github.com/sap/infrabox/src/services/gcp/pkg/apis/gcp/v1alpha1"
23- "github.com/sap/infrabox/src/services/gcp/pkg/stub/cleaner"
24-
25- goerrors "errors"
26-
27- "k8s.io/client-go/discovery"
28- "k8s.io/client-go/discovery/cached"
29- "k8s.io/client-go/dynamic"
30- "k8s.io/client-go/kubernetes"
31- _ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
32- "k8s.io/client-go/rest"
33- "k8s.io/client-go/tools/clientcmd"
34- clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
35-
36- "github.com/operator-framework/operator-sdk/pkg/sdk/action"
37- "github.com/operator-framework/operator-sdk/pkg/sdk/handler"
38- "github.com/operator-framework/operator-sdk/pkg/sdk/types"
39- "github.com/operator-framework/operator-sdk/pkg/util/k8sutil"
40-
41- "github.com/sirupsen/logrus"
42-
43- appsv1 "k8s.io/api/apps/v1"
44- v1 "k8s.io/api/core/v1"
45- rbacv1 "k8s.io/api/rbac/v1"
46- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
47-
48- "k8s.io/apimachinery/pkg/api/errors"
49- "k8s.io/apimachinery/pkg/api/meta"
50- "k8s.io/apimachinery/pkg/api/resource"
51- "k8s.io/apimachinery/pkg/runtime/schema"
52- "k8s.io/apimachinery/pkg/util/intstr"
53-
54- "github.com/mholt/archiver"
4+ "bytes"
5+ "crypto/tls"
6+ "crypto/x509"
7+ b64 "encoding/base64"
8+ "encoding/json"
9+ "fmt"
10+ "io/ioutil"
11+ "mime/multipart"
12+ "net/http"
13+ "os"
14+ "os/exec"
15+ "path"
16+ "strconv"
17+ "strings"
18+ "time"
19+
20+ uuid "github.com/satori/go.uuid"
21+
22+ "github.com/sap/infrabox/src/services/gcp/pkg/apis/gcp/v1alpha1"
23+ "github.com/sap/infrabox/src/services/gcp/pkg/stub/cleaner"
24+
25+ goerrors "errors"
26+
27+ "k8s.io/client-go/discovery"
28+ "k8s.io/client-go/discovery/cached"
29+ "k8s.io/client-go/dynamic"
30+ "k8s.io/client-go/kubernetes"
31+ _ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
32+ "k8s.io/client-go/rest"
33+ "k8s.io/client-go/tools/clientcmd"
34+ clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
35+
36+ "github.com/operator-framework/operator-sdk/pkg/sdk/action"
37+ "github.com/operator-framework/operator-sdk/pkg/sdk/handler"
38+ "github.com/operator-framework/operator-sdk/pkg/sdk/types"
39+ "github.com/operator-framework/operator-sdk/pkg/util/k8sutil"
40+
41+ "github.com/sirupsen/logrus"
42+
43+ appsv1 "k8s.io/api/apps/v1"
44+ v1 "k8s.io/api/core/v1"
45+ rbacv1 "k8s.io/api/rbac/v1"
46+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
47+
48+ "k8s.io/apimachinery/pkg/api/errors"
49+ "k8s.io/apimachinery/pkg/api/meta"
50+ "k8s.io/apimachinery/pkg/api/resource"
51+ "k8s.io/apimachinery/pkg/runtime/schema"
52+ "k8s.io/apimachinery/pkg/util/intstr"
53+
54+ "github.com/mholt/archiver"
5555)
5656
5757const adminSAName = "admin"
@@ -66,11 +66,12 @@ type MasterAuth struct {
6666}
6767
6868type RemoteCluster struct {
69- Name string
70- Status string
71- Zone string
72- Endpoint string
73- MasterAuth MasterAuth
69+ Name string
70+ Status string
71+ Zone string
72+ Endpoint string
73+ PrivateClusterConfig map [string ]interface {}
74+ MasterAuth MasterAuth
7475}
7576
7677func NewHandler () handler.Handler {
@@ -95,15 +96,13 @@ func setClusterName(cr *v1alpha1.GKECluster, log *logrus.Entry) error {
9596func createCluster (cr * v1alpha1.GKECluster , log * logrus.Entry ) (* v1alpha1.GKEClusterStatus , error ) {
9697 limit := os .Getenv ("MAX_NUM_CLUSTERS" )
9798 status := cr .Status
98-
99- if limit != "" {
10099 gkeclusters , err := getRemoteClusters (log )
101100 if err != nil && ! errors .IsNotFound (err ) {
102101 err = fmt .Errorf ("could not get GKE Clusters: %v" , err )
103102 log .Error (err )
104103 return nil , err
105104 }
106-
105+ if limit != "" {
107106 l , err := strconv .Atoi (limit )
108107
109108 if err != nil {
@@ -118,6 +117,24 @@ func createCluster(cr *v1alpha1.GKECluster, log *logrus.Entry) (*v1alpha1.GKEClu
118117 return & status , nil
119118 }
120119 }
120+ masterIPv4CIRDs := getExistingMasterIPv4CIRDs (gkeclusters )
121+ finalCIDR := ""
122+ log .Debugf ("existng ipv4 cidr: %s" , masterIPv4CIRDs )
123+ for {
124+ cidr , err := getRandomIPv4CIRD ()
125+ log .Infof ("generate master ipv4 cidr: %s" , cidr )
126+ if err != nil {
127+ err = fmt .Errorf ("err while getting CIDR for Cluster %s: %s" , cr .Status .ClusterName , err )
128+ log .Error (err )
129+ return nil , err
130+ } else {
131+ log .Debugf ("check if %s in %s" , cidr , masterIPv4CIRDs )
132+ if ! contains (masterIPv4CIRDs , cidr ) {
133+ finalCIDR = cidr
134+ break
135+ }
136+ }
137+ }
121138
122139 log .Infof ("Create GKE cluster %s" , cr .Status .ClusterName )
123140 args := []string {"container" , "clusters" ,
@@ -202,7 +219,11 @@ func createCluster(cr *v1alpha1.GKECluster, log *logrus.Entry) (*v1alpha1.GKEClu
202219 args = append (args , "--services-ipv4-cidr" , cr .Spec .ServiceCidr )
203220 }
204221
205-
222+ args = append (args , "--no-enable-legacy-authorization" )
223+ args = append (args , "--enable-private-nodes" )
224+ args = append (args , "--master-ipv4-cidr" , finalCIDR )
225+ args = append (args , "--enable-master-authorized-networks" )
226+ args = append (args , "--master-authorized-networks" , "0.0.0.0/0" )
206227 cmd := exec .Command ("gcloud" , args ... )
207228 out , err := cmd .CombinedOutput ()
208229
@@ -847,6 +868,36 @@ func getOutdatedClusters(maxAge string, log *logrus.Entry) ([]RemoteCluster, err
847868 return gkeclusters , nil
848869}
849870
871+ func getExistingMasterIPv4CIRDs (gkeclusters []RemoteCluster ) []string {
872+ var allMasterIPv4CIRSs = make ([]string , 0 )
873+ for _ , gkecluster := range gkeclusters {
874+ masterIpv4CidrBlock , ok := gkecluster .PrivateClusterConfig ["masterIpv4CidrBlock" ].(string )
875+ if ok && masterIpv4CidrBlock != "" {
876+ allMasterIPv4CIRSs = append (allMasterIPv4CIRSs , masterIpv4CidrBlock )
877+ }
878+ }
879+ return allMasterIPv4CIRSs
880+ }
881+
882+ func getRandomIPv4CIRD () (string , error ) {
883+ cmd := exec .Command ("python3" , "/app/subnet_fetcher.py" )
884+ out , err := cmd .CombinedOutput ()
885+ if err != nil {
886+ return "" , err
887+ }
888+ result := strings .ReplaceAll (string (out ), "\n " , "" )
889+ return result , nil
890+ }
891+
892+ func contains (s []string , e string ) bool {
893+ for _ , a := range s {
894+ if a == e {
895+ return true
896+ }
897+ }
898+ return false
899+ }
900+
850901func generateKubeconfig (c * RemoteCluster ) []byte {
851902 caCrt , _ := b64 .StdEncoding .DecodeString (c .MasterAuth .ClusterCaCertificate )
852903 clusters := make (map [string ]* clientcmdapi.Cluster )
@@ -1488,4 +1539,4 @@ func newCollectorDaemonSet() *appsv1.DaemonSet {
14881539 },
14891540 },
14901541 }
1491- }
1542+ }
0 commit comments