From 0d44cfb1ba08d00258a7b8c0747d8ee992f3a638 Mon Sep 17 00:00:00 2001 From: Mengqi Yu Date: Wed, 19 Dec 2018 10:12:31 -0800 Subject: [PATCH] :sparkles: update vendor --- Gopkg.lock | 18 ++++--- .../controller-runtime/example/main.go | 4 +- .../controller-runtime/pkg/envtest/server.go | 2 +- .../pkg/internal/controller/controller.go | 9 +++- .../internal/controller/metrics/metrics.go | 16 ++++-- .../pkg/webhook/admission/http.go | 27 +++++++--- .../pkg/webhook/admission/webhook.go | 22 +++++++- .../pkg/webhook/bootstrap.go | 11 ++++ .../pkg/webhook/internal/metrics/metrics.go | 51 ++++++++++++++++++ .../cmd/controller-gen/main.go | 4 +- .../pkg/apis/fun/v1alpha1/toy_types.go | 32 ++++++++--- .../controller-tools/pkg/generate/doc.go | 18 ------- .../pkg/internal/codegen/parse/crd.go | 40 +++++++++----- .../pkg/internal/codegen/parse/util.go | 14 +++++ .../pkg/{generate => }/rbac/manifests.go | 0 .../pkg/{generate => }/rbac/parser.go | 0 .../{generate => }/webhook/internal/client.go | 0 .../webhook/internal/manager.go | 0 .../pkg/{generate => }/webhook/manifests.go | 2 +- .../pkg/{generate => }/webhook/parser.go | 0 .../integration/addr/manager.go | 24 +++++++++ .../integration/apiserver.go | 12 +++++ .../integration/internal/address_manager.go | 53 ------------------- .../integration/internal/apiserver.go | 2 +- .../integration/internal/process.go | 5 +- 25 files changed, 245 insertions(+), 121 deletions(-) create mode 100644 vendor/sigs.k8s.io/controller-runtime/pkg/webhook/internal/metrics/metrics.go delete mode 100644 vendor/sigs.k8s.io/controller-tools/pkg/generate/doc.go rename vendor/sigs.k8s.io/controller-tools/pkg/{generate => }/rbac/manifests.go (100%) rename vendor/sigs.k8s.io/controller-tools/pkg/{generate => }/rbac/parser.go (100%) rename vendor/sigs.k8s.io/controller-tools/pkg/{generate => }/webhook/internal/client.go (100%) rename vendor/sigs.k8s.io/controller-tools/pkg/{generate => }/webhook/internal/manager.go (100%) rename vendor/sigs.k8s.io/controller-tools/pkg/{generate => }/webhook/manifests.go (98%) rename vendor/sigs.k8s.io/controller-tools/pkg/{generate => }/webhook/parser.go (100%) create mode 100644 vendor/sigs.k8s.io/testing_frameworks/integration/addr/manager.go delete mode 100644 vendor/sigs.k8s.io/testing_frameworks/integration/internal/address_manager.go diff --git a/Gopkg.lock b/Gopkg.lock index 907e1ef20f9..80b64fe2e4a 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -876,7 +876,7 @@ revision = "9dfdf9be683f61f82cda12362c44c784e0778b56" [[projects]] - digest = "1:e03ddaf9f31bccbbb8c33eabad2c85025a95ca98905649fd744e0a54c630a064" + digest = "1:576aa0abec4807e7a87b3d235c6e1b4a8dde240c7dcaa0f5a14429c59afd71a8" name = "sigs.k8s.io/controller-runtime" packages = [ "pkg/cache", @@ -914,30 +914,32 @@ "pkg/webhook/internal/cert/generator", "pkg/webhook/internal/cert/writer", "pkg/webhook/internal/cert/writer/atomic", + "pkg/webhook/internal/metrics", "pkg/webhook/types", ] pruneopts = "NT" - revision = "c63ebda0bf4be5f0a8abd4003e4ea546032545ba" - version = "v0.1.8" + revision = "f6f0bc9611363b43664d08fb097ab13243ef621d" + version = "v0.1.9" [[projects]] branch = "master" - digest = "1:c7f15878bf35af16f41aa37df0d13e3d7a162499506e48a3822b569d7e68bc18" + digest = "1:0a14ea9a2647d064bb9d48b2de78306e74b196681efd7b654eb0b518d90c2e8d" name = "sigs.k8s.io/controller-tools" packages = ["pkg/util"] pruneopts = "NT" - revision = "b072ef59824b16023b0e12c94d0040d99059a961" + revision = "950a0e88e4effb864253b3c7504b326cc83b9d11" [[projects]] - branch = "master" - digest = "1:0c967d0a07a1320a079e56154a912528728446295136ed8fc7595d8548445965" + digest = "1:1b357310eaf2f448295aa077aaf077b56170bda56d2425f1d5d097ee4ff1c1ac" name = "sigs.k8s.io/testing_frameworks" packages = [ "integration", + "integration/addr", "integration/internal", ] pruneopts = "NT" - revision = "5818a3a284a11812aaed11d5ca0bcadec2c50e83" + revision = "d348cb12705b516376e0c323bacca72b00a78425" + version = "v0.1.1" [solve-meta] analyzer-name = "dep" diff --git a/vendor/sigs.k8s.io/controller-runtime/example/main.go b/vendor/sigs.k8s.io/controller-runtime/example/main.go index f68a094225e..fa3b52b89a2 100644 --- a/vendor/sigs.k8s.io/controller-runtime/example/main.go +++ b/vendor/sigs.k8s.io/controller-runtime/example/main.go @@ -108,8 +108,8 @@ func main() { entryLog.Info("setting up webhook server") as, err := webhook.NewServer("foo-admission-server", mgr, webhook.ServerOptions{ - Port: 9876, - CertDir: "/tmp/cert", + Port: 9876, + CertDir: "/tmp/cert", DisableWebhookConfigInstaller: &disableWebhookConfigInstaller, BootstrapOptions: &webhook.BootstrapOptions{ Secret: &apitypes.NamespacedName{ diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/envtest/server.go b/vendor/sigs.k8s.io/controller-runtime/pkg/envtest/server.go index 6756dae5458..30cc18a2334 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/envtest/server.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/envtest/server.go @@ -59,7 +59,7 @@ var DefaultKubeAPIServerFlags = []string{ "--cert-dir={{ .CertDir }}", "--insecure-port={{ if .URL }}{{ .URL.Port }}{{ end }}", "--insecure-bind-address={{ if .URL }}{{ .URL.Hostname }}{{ end }}", - "--secure-port=0", + "--secure-port={{ if .SecurePort }}{{ .SecurePort }}{{ end }}", "--admission-control=AlwaysAdmit", } diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller/controller.go b/vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller/controller.go index 4d6f80f6c72..6a44ea9fc3e 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller/controller.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller/controller.go @@ -175,7 +175,9 @@ func (c *Controller) processNextWorkItem() bool { // Update metrics after processing each item reconcileStartTS := time.Now() - defer c.updateMetrics(time.Now().Sub(reconcileStartTS)) + defer func() { + c.updateMetrics(time.Now().Sub(reconcileStartTS)) + }() obj, shutdown := c.Queue.Get() if obj == nil { @@ -214,13 +216,15 @@ func (c *Controller) processNextWorkItem() bool { c.Queue.AddRateLimited(req) log.Error(err, "Reconciler error", "controller", c.Name, "request", req) ctrlmetrics.ReconcileErrors.WithLabelValues(c.Name).Inc() - + ctrlmetrics.ReconcileTotal.WithLabelValues(c.Name, "error").Inc() return false } else if result.RequeueAfter > 0 { c.Queue.AddAfter(req, result.RequeueAfter) + ctrlmetrics.ReconcileTotal.WithLabelValues(c.Name, "requeue_after").Inc() return true } else if result.Requeue { c.Queue.AddRateLimited(req) + ctrlmetrics.ReconcileTotal.WithLabelValues(c.Name, "requeue").Inc() return true } @@ -231,6 +235,7 @@ func (c *Controller) processNextWorkItem() bool { // TODO(directxman12): What does 1 mean? Do we want level constants? Do we want levels at all? log.V(1).Info("Successfully Reconciled", "controller", c.Name, "request", req) + ctrlmetrics.ReconcileTotal.WithLabelValues(c.Name, "success").Inc() // Return true, don't take a break return true } diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller/metrics/metrics.go b/vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller/metrics/metrics.go index 944ca8e0353..1411a8d846f 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller/metrics/metrics.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller/metrics/metrics.go @@ -29,24 +29,34 @@ var ( Help: "Length of reconcile queue per controller", }, []string{"controller"}) + // ReconcileTotal is a prometheus counter metrics which holds the total + // number of reconciliations per controller. It has two labels. controller label refers + // to the controller name and result label refers to the reconcile result i.e + // success, error, requeue, requeue_after + ReconcileTotal = prometheus.NewCounterVec(prometheus.CounterOpts{ + Name: "controller_runtime_reconcile_total", + Help: "Total number of reconciliations per controller", + }, []string{"controller", "result"}) + // ReconcileErrors is a prometheus counter metrics which holds the total // number of errors from the Reconciler ReconcileErrors = prometheus.NewCounterVec(prometheus.CounterOpts{ Name: "controller_runtime_reconcile_errors_total", - Help: "Total number of reconcile errors per controller", + Help: "Total number of reconciliation errors per controller", }, []string{"controller"}) // ReconcileTime is a prometheus metric which keeps track of the duration - // of reconciles + // of reconciliations ReconcileTime = prometheus.NewHistogramVec(prometheus.HistogramOpts{ Name: "controller_runtime_reconcile_time_seconds", - Help: "Length of time per reconcile per controller", + Help: "Length of time per reconciliation per controller", }, []string{"controller"}) ) func init() { metrics.Registry.MustRegister( QueueLength, + ReconcileTotal, ReconcileErrors, ReconcileTime, // expose process metrics like CPU, Memory, file descriptor usage etc. diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/admission/http.go b/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/admission/http.go index 824b6af063e..5b91ad2b508 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/admission/http.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/admission/http.go @@ -24,6 +24,7 @@ import ( "io" "io/ioutil" "net/http" + "time" "k8s.io/api/admission/v1beta1" admissionv1beta1 "k8s.io/api/admission/v1beta1" @@ -31,6 +32,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/serializer" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "sigs.k8s.io/controller-runtime/pkg/webhook/admission/types" + "sigs.k8s.io/controller-runtime/pkg/webhook/internal/metrics" ) var admissionv1beta1scheme = runtime.NewScheme() @@ -47,6 +49,9 @@ func addToScheme(scheme *runtime.Scheme) { var _ http.Handler = &Webhook{} func (wh *Webhook) ServeHTTP(w http.ResponseWriter, r *http.Request) { + startTS := time.Now() + defer metrics.RequestLatency.WithLabelValues(wh.Name).Observe(time.Now().Sub(startTS).Seconds()) + var body []byte var err error @@ -55,14 +60,14 @@ func (wh *Webhook) ServeHTTP(w http.ResponseWriter, r *http.Request) { if body, err = ioutil.ReadAll(r.Body); err != nil { log.Error(err, "unable to read the body from the incoming request") reviewResponse = ErrorResponse(http.StatusBadRequest, err) - writeResponse(w, reviewResponse) + wh.writeResponse(w, reviewResponse) return } } else { err = errors.New("request body is empty") log.Error(err, "bad request") reviewResponse = ErrorResponse(http.StatusBadRequest, err) - writeResponse(w, reviewResponse) + wh.writeResponse(w, reviewResponse) return } @@ -72,7 +77,7 @@ func (wh *Webhook) ServeHTTP(w http.ResponseWriter, r *http.Request) { err = fmt.Errorf("contentType=%s, expect application/json", contentType) log.Error(err, "unable to process a request with an unknown content type", "content type", contentType) reviewResponse = ErrorResponse(http.StatusBadRequest, err) - writeResponse(w, reviewResponse) + wh.writeResponse(w, reviewResponse) return } @@ -80,16 +85,24 @@ func (wh *Webhook) ServeHTTP(w http.ResponseWriter, r *http.Request) { if _, _, err := admissionv1beta1schemecodecs.UniversalDeserializer().Decode(body, nil, &ar); err != nil { log.Error(err, "unable to decode the request") reviewResponse = ErrorResponse(http.StatusBadRequest, err) - writeResponse(w, reviewResponse) + wh.writeResponse(w, reviewResponse) return } // TODO: add panic-recovery for Handle reviewResponse = wh.Handle(context.Background(), types.Request{AdmissionRequest: ar.Request}) - writeResponse(w, reviewResponse) + wh.writeResponse(w, reviewResponse) } -func writeResponse(w io.Writer, response types.Response) { +func (wh *Webhook) writeResponse(w io.Writer, response types.Response) { + if response.Response.Result.Code != 0 { + if response.Response.Result.Code == http.StatusOK { + metrics.TotalRequests.WithLabelValues(wh.Name, "true").Inc() + } else { + metrics.TotalRequests.WithLabelValues(wh.Name, "false").Inc() + } + } + encoder := json.NewEncoder(w) responseAdmissionReview := v1beta1.AdmissionReview{ Response: response.Response, @@ -97,6 +110,6 @@ func writeResponse(w io.Writer, response types.Response) { err := encoder.Encode(responseAdmissionReview) if err != nil { log.Error(err, "unable to encode the response") - writeResponse(w, ErrorResponse(http.StatusInternalServerError, err)) + wh.writeResponse(w, ErrorResponse(http.StatusInternalServerError, err)) } } diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/admission/webhook.go b/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/admission/webhook.go index 0ae7a94177f..ad908b4a541 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/admission/webhook.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/admission/webhook.go @@ -132,6 +132,7 @@ func (w *Webhook) handleMutating(ctx context.Context, req atypes.Request) atypes for _, handler := range w.Handlers { resp := handler.Handle(ctx, req) if !resp.Response.Allowed { + setStatusOKInAdmissionResponse(resp.Response) return resp } if resp.Response.PatchType != nil && *resp.Response.PatchType != admissionv1beta1.PatchTypeJSONPatch { @@ -148,7 +149,10 @@ func (w *Webhook) handleMutating(ctx context.Context, req atypes.Request) atypes } return atypes.Response{ Response: &admissionv1beta1.AdmissionResponse{ - Allowed: true, + Allowed: true, + Result: &metav1.Status{ + Code: http.StatusOK, + }, Patch: marshaledPatch, PatchType: func() *admissionv1beta1.PatchType { pt := admissionv1beta1.PatchTypeJSONPatch; return &pt }(), }, @@ -159,16 +163,32 @@ func (w *Webhook) handleValidating(ctx context.Context, req atypes.Request) atyp for _, handler := range w.Handlers { resp := handler.Handle(ctx, req) if !resp.Response.Allowed { + setStatusOKInAdmissionResponse(resp.Response) return resp } } return atypes.Response{ Response: &admissionv1beta1.AdmissionResponse{ Allowed: true, + Result: &metav1.Status{ + Code: http.StatusOK, + }, }, } } +func setStatusOKInAdmissionResponse(resp *admissionv1beta1.AdmissionResponse) { + if resp == nil { + return + } + if resp.Result == nil { + resp.Result = &metav1.Status{} + } + if resp.Result.Code == 0 { + resp.Result.Code = http.StatusOK + } +} + // GetName returns the name of the webhook. func (w *Webhook) GetName() string { w.once.Do(w.setDefaults) diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/bootstrap.go b/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/bootstrap.go index f0ac9425e3d..b789c053151 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/bootstrap.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/bootstrap.go @@ -297,6 +297,17 @@ func (s *Server) validatingWHConfigs() (runtime.Object, error) { } func (s *Server) admissionWebhook(path string, wh *admission.Webhook) (*admissionregistration.Webhook, error) { + if wh.NamespaceSelector == nil && len(s.Service.Namespace) > 0 { + wh.NamespaceSelector = &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{ + { + Key: "control-plane", + Operator: metav1.LabelSelectorOpDoesNotExist, + }, + }, + } + } + webhook := &admissionregistration.Webhook{ Name: wh.GetName(), Rules: wh.Rules, diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/internal/metrics/metrics.go b/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/internal/metrics/metrics.go new file mode 100644 index 00000000000..ff82c10d8d3 --- /dev/null +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/internal/metrics/metrics.go @@ -0,0 +1,51 @@ +/* +Copyright 2018 The Kubernetes Authors. + +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 metrics + +import ( + "github.com/prometheus/client_golang/prometheus" + + "sigs.k8s.io/controller-runtime/pkg/metrics" +) + +var ( + // TotalRequests is a prometheus metric which counts the total number of requests that + // the webhook server has received. + TotalRequests = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "controller_runtime_webhook_requests_total", + Help: "Total number of admission requests", + }, + []string{"webhook", "succeeded"}, + ) + + // RequestLatency is a prometheus metric which is a histogram of the latency + // of processing admission requests. + RequestLatency = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Name: "controller_runtime_webhook_latency_seconds", + Help: "Histogram of the latency of processing admission requests", + }, + []string{"webhook"}, + ) +) + +func init() { + metrics.Registry.MustRegister( + TotalRequests, + RequestLatency) +} diff --git a/vendor/sigs.k8s.io/controller-tools/cmd/controller-gen/main.go b/vendor/sigs.k8s.io/controller-tools/cmd/controller-gen/main.go index b83db912f2d..6be7df13e24 100644 --- a/vendor/sigs.k8s.io/controller-tools/cmd/controller-gen/main.go +++ b/vendor/sigs.k8s.io/controller-tools/cmd/controller-gen/main.go @@ -23,8 +23,8 @@ import ( "github.com/spf13/cobra" crdgenerator "sigs.k8s.io/controller-tools/pkg/crd/generator" - "sigs.k8s.io/controller-tools/pkg/generate/rbac" - "sigs.k8s.io/controller-tools/pkg/generate/webhook" + "sigs.k8s.io/controller-tools/pkg/rbac" + "sigs.k8s.io/controller-tools/pkg/webhook" ) func main() { diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/crd/generator/testData/pkg/apis/fun/v1alpha1/toy_types.go b/vendor/sigs.k8s.io/controller-tools/pkg/crd/generator/testData/pkg/apis/fun/v1alpha1/toy_types.go index c83ba758017..391c73a1903 100644 --- a/vendor/sigs.k8s.io/controller-tools/pkg/crd/generator/testData/pkg/apis/fun/v1alpha1/toy_types.go +++ b/vendor/sigs.k8s.io/controller-tools/pkg/crd/generator/testData/pkg/apis/fun/v1alpha1/toy_types.go @@ -32,34 +32,54 @@ type ToySpec struct { // +kubebuilder:validation:Maximum=100 // +kubebuilder:validation:Minimum=1 // +kubebuilder:validation:ExclusiveMinimum=true - Power float32 `json:"power,omitempty"` - Bricks int32 `json:"bricks,omitempty"` + Power float32 `json:"power,omitempty"` + + Bricks int32 `json:"bricks,omitempty"` + // +kubebuilder:validation:MaxLength=15 // +kubebuilder:validation:MinLength=1 Name string `json:"name,omitempty"` + + // This is a comment on an array field. // +kubebuilder:validation:MaxItems=500 // +kubebuilder:validation:MinItems=1 // +kubebuilder:validation:UniqueItems=false Knights []string `json:"knights,omitempty"` - Winner bool `json:"winner,omitempty"` + + // This is a comment on a boolean field. + Winner bool `json:"winner,omitempty"` + // +kubebuilder:validation:Enum=Lion,Wolf,Dragon Alias string `json:"alias,omitempty"` + // +kubebuilder:validation:Enum=1,2,3 - Rank int `json:"rank"` + Rank int `json:"rank"` + Comment []byte `json:"comment,omitempty"` - Template v1.PodTemplateSpec `json:"template"` - Claim v1.PersistentVolumeClaim `json:"claim,omitempty"` + // This is a comment on an object field. + Template v1.PodTemplateSpec `json:"template"` + + Claim v1.PersistentVolumeClaim `json:"claim,omitempty"` + //This is a dummy comment. + // Just checking if the multi-line comments are working or not. Replicas *int32 `json:"replicas"` + // This is a newly added field. + // Using this for testing purpose. Rook *intstr.IntOrString `json:"rook"` + + // This is a comment on a map field. + Location map[string]string `json:"location"` } // ToyStatus defines the observed state of Toy type ToyStatus struct { // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster // Important: Run "make" to regenerate code after modifying this file + + // It tracks the number of replicas. Replicas int32 `json:"replicas"` } diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/generate/doc.go b/vendor/sigs.k8s.io/controller-tools/pkg/generate/doc.go deleted file mode 100644 index 94960f03109..00000000000 --- a/vendor/sigs.k8s.io/controller-tools/pkg/generate/doc.go +++ /dev/null @@ -1,18 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -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 generate contains libraries for generating code to use with controller-runtime -package generate diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/crd.go b/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/crd.go index e0fadd127dd..0e079e209cf 100644 --- a/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/crd.go +++ b/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/crd.go @@ -153,16 +153,19 @@ func (b *APIs) typeToJSONSchemaProps(t *types.Type, found sets.String, comments switch t.Name { case time: return v1beta1.JSONSchemaProps{ - Type: "string", - Format: "date-time", + Type: "string", + Format: "date-time", + Description: parseDescription(comments), }, b.getTime() case meta: return v1beta1.JSONSchemaProps{ - Type: "object", + Type: "object", + Description: parseDescription(comments), }, b.objSchema() case unstructured: return v1beta1.JSONSchemaProps{ - Type: "object", + Type: "object", + Description: parseDescription(comments), }, b.objSchema() case intOrString: return v1beta1.JSONSchemaProps{ @@ -174,6 +177,7 @@ func (b *APIs) typeToJSONSchemaProps(t *types.Type, found sets.String, comments Type: "integer", }, }, + Description: parseDescription(comments), }, b.objSchema() } @@ -205,9 +209,10 @@ var jsonRegex = regexp.MustCompile("json:\"([a-zA-Z,]+)\"") type primitiveTemplateArgs struct { v1beta1.JSONSchemaProps - Value string - Format string - EnumValue string // TODO check type of enum value to match the type of field + Value string + Format string + EnumValue string // TODO check type of enum value to match the type of field + Description string } var primitiveTemplate = template.Must(template.New("map-template").Parse( @@ -254,7 +259,7 @@ func (b *APIs) parsePrimitiveValidation(t *types.Type, found sets.String, commen buff := &bytes.Buffer{} - var n, f, s string + var n, f, s, d string switch t.Name.Name { case "int", "int64", "uint64": n = "integer" @@ -278,11 +283,13 @@ func (b *APIs) parsePrimitiveValidation(t *types.Type, found sets.String, commen if props.Enum != nil { s = parseEnumToString(props.Enum) } - if err := primitiveTemplate.Execute(buff, primitiveTemplateArgs{props, n, f, s}); err != nil { + d = parseDescription(comments) + if err := primitiveTemplate.Execute(buff, primitiveTemplateArgs{props, n, f, s, d}); err != nil { log.Fatalf("%v", err) } props.Type = n props.Format = f + props.Description = d return props, buff.String() } @@ -304,8 +311,10 @@ var mapTemplate = template.Must(template.New("map-template").Parse( // Go that describe the validations for the given map type. func (b *APIs) parseMapValidation(t *types.Type, found sets.String, comments []string) (v1beta1.JSONSchemaProps, string) { additionalProps, result := b.typeToJSONSchemaProps(t.Elem, found, comments, false) + additionalProps.Description = "" props := v1beta1.JSONSchemaProps{ - Type: "object", + Type: "object", + Description: parseDescription(comments), } parseOption := b.arguments.CustomArgs.(*Options) if !parseOption.SkipMapValidation { @@ -313,7 +322,6 @@ func (b *APIs) parseMapValidation(t *types.Type, found sets.String, comments []s Allows: true, Schema: &additionalProps} } - buff := &bytes.Buffer{} if err := mapTemplate.Execute(buff, mapTempateArgs{Result: result, SkipMapValidation: parseOption.SkipMapValidation}); err != nil { log.Fatalf("%v", err) @@ -352,9 +360,11 @@ type arrayTemplateArgs struct { // Go that describe the validations for the given array type. func (b *APIs) parseArrayValidation(t *types.Type, found sets.String, comments []string) (v1beta1.JSONSchemaProps, string) { items, result := b.typeToJSONSchemaProps(t.Elem, found, comments, false) + items.Description = "" props := v1beta1.JSONSchemaProps{ - Type: "array", - Items: &v1beta1.JSONSchemaPropsOrArray{Schema: &items}, + Type: "array", + Items: &v1beta1.JSONSchemaPropsOrArray{Schema: &items}, + Description: parseDescription(comments), } // To represent byte arrays in the generated code, the property of the OpenAPI definition // should have string as its type and byte as its format. @@ -362,6 +372,7 @@ func (b *APIs) parseArrayValidation(t *types.Type, found sets.String, comments [ props.Type = "string" props.Format = "byte" props.Items = nil + props.Description = parseDescription(comments) } for _, l := range comments { getValidation(l, &props) @@ -402,7 +413,8 @@ var objectTemplate = template.Must(template.New("object-template").Parse( func (b *APIs) parseObjectValidation(t *types.Type, found sets.String, comments []string, isRoot bool) (v1beta1.JSONSchemaProps, string) { buff := &bytes.Buffer{} props := v1beta1.JSONSchemaProps{ - Type: "object", + Type: "object", + Description: parseDescription(comments), } if strings.HasPrefix(t.Name.String(), "k8s.io/api") { diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/util.go b/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/util.go index 10935d56eb8..eb9dfa35a8b 100644 --- a/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/util.go +++ b/vendor/sigs.k8s.io/controller-tools/pkg/internal/codegen/parse/util.go @@ -334,6 +334,20 @@ func parseByteValue(b []byte) string { return elem } +// parseDescription parse comments above each field in the type definition. +func parseDescription(res []string) string { + var temp strings.Builder + var desc string + for _, comment := range res { + if !(strings.Contains(comment, "+kubebuilder") || strings.Contains(comment, "+optional")) { + temp.WriteString(comment) + temp.WriteString(" ") + desc = strings.TrimRight(temp.String(), " ") + } + } + return desc +} + // parseEnumToString returns a representive validated go format string from JSONSchemaProps schema func parseEnumToString(value []v1beta1.JSON) string { res := "[]v1beta1.JSON{" diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/generate/rbac/manifests.go b/vendor/sigs.k8s.io/controller-tools/pkg/rbac/manifests.go similarity index 100% rename from vendor/sigs.k8s.io/controller-tools/pkg/generate/rbac/manifests.go rename to vendor/sigs.k8s.io/controller-tools/pkg/rbac/manifests.go diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/generate/rbac/parser.go b/vendor/sigs.k8s.io/controller-tools/pkg/rbac/parser.go similarity index 100% rename from vendor/sigs.k8s.io/controller-tools/pkg/generate/rbac/parser.go rename to vendor/sigs.k8s.io/controller-tools/pkg/rbac/parser.go diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/generate/webhook/internal/client.go b/vendor/sigs.k8s.io/controller-tools/pkg/webhook/internal/client.go similarity index 100% rename from vendor/sigs.k8s.io/controller-tools/pkg/generate/webhook/internal/client.go rename to vendor/sigs.k8s.io/controller-tools/pkg/webhook/internal/client.go diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/generate/webhook/internal/manager.go b/vendor/sigs.k8s.io/controller-tools/pkg/webhook/internal/manager.go similarity index 100% rename from vendor/sigs.k8s.io/controller-tools/pkg/generate/webhook/internal/manager.go rename to vendor/sigs.k8s.io/controller-tools/pkg/webhook/internal/manager.go diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/generate/webhook/manifests.go b/vendor/sigs.k8s.io/controller-tools/pkg/webhook/manifests.go similarity index 98% rename from vendor/sigs.k8s.io/controller-tools/pkg/generate/webhook/manifests.go rename to vendor/sigs.k8s.io/controller-tools/pkg/webhook/manifests.go index 86abadf6ade..dc6c57a5802 100644 --- a/vendor/sigs.k8s.io/controller-tools/pkg/generate/webhook/manifests.go +++ b/vendor/sigs.k8s.io/controller-tools/pkg/webhook/manifests.go @@ -29,8 +29,8 @@ import ( "github.com/ghodss/yaml" "sigs.k8s.io/controller-runtime/pkg/webhook" - "sigs.k8s.io/controller-tools/pkg/generate/webhook/internal" generateinteral "sigs.k8s.io/controller-tools/pkg/internal/general" + "sigs.k8s.io/controller-tools/pkg/webhook/internal" ) // ManifestOptions represent options for generating the webhook manifests. diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/generate/webhook/parser.go b/vendor/sigs.k8s.io/controller-tools/pkg/webhook/parser.go similarity index 100% rename from vendor/sigs.k8s.io/controller-tools/pkg/generate/webhook/parser.go rename to vendor/sigs.k8s.io/controller-tools/pkg/webhook/parser.go diff --git a/vendor/sigs.k8s.io/testing_frameworks/integration/addr/manager.go b/vendor/sigs.k8s.io/testing_frameworks/integration/addr/manager.go new file mode 100644 index 00000000000..7523ce860c3 --- /dev/null +++ b/vendor/sigs.k8s.io/testing_frameworks/integration/addr/manager.go @@ -0,0 +1,24 @@ +package addr + +import ( + "net" +) + +// Suggest suggests a address a process can listen on. It returns +// a tuple consisting of a free port and the hostname resolved to its IP. +func Suggest() (port int, resolvedHost string, err error) { + addr, err := net.ResolveTCPAddr("tcp", "localhost:0") + if err != nil { + return + } + l, err := net.ListenTCP("tcp", addr) + if err != nil { + return + } + port = l.Addr().(*net.TCPAddr).Port + defer func() { + err = l.Close() + }() + resolvedHost = addr.IP.String() + return +} diff --git a/vendor/sigs.k8s.io/testing_frameworks/integration/apiserver.go b/vendor/sigs.k8s.io/testing_frameworks/integration/apiserver.go index 9a59893410f..4f1e28267d1 100644 --- a/vendor/sigs.k8s.io/testing_frameworks/integration/apiserver.go +++ b/vendor/sigs.k8s.io/testing_frameworks/integration/apiserver.go @@ -6,6 +6,7 @@ import ( "net/url" "time" + "sigs.k8s.io/testing_frameworks/integration/addr" "sigs.k8s.io/testing_frameworks/integration/internal" ) @@ -16,6 +17,9 @@ type APIServer struct { // If this is not specified, we default to a random free port on localhost. URL *url.URL + // SecurePort is the additional secure port that the APIServer should listen on. + SecurePort int + // Path is the path to the apiserver binary. // // If this is left as the empty string, we will attempt to locate a binary, @@ -87,6 +91,14 @@ func (s *APIServer) Start() error { return err } + // Defaulting the secure port + if s.SecurePort == 0 { + s.SecurePort, _, err = addr.Suggest() + if err != nil { + return err + } + } + s.processState.HealthCheckEndpoint = "/healthz" s.URL = &s.processState.URL diff --git a/vendor/sigs.k8s.io/testing_frameworks/integration/internal/address_manager.go b/vendor/sigs.k8s.io/testing_frameworks/integration/internal/address_manager.go deleted file mode 100644 index 7ad4ab7eaad..00000000000 --- a/vendor/sigs.k8s.io/testing_frameworks/integration/internal/address_manager.go +++ /dev/null @@ -1,53 +0,0 @@ -package internal - -import ( - "fmt" - "net" -) - -// AddressManager allocates a new address (interface & port) a process -// can bind and keeps track of that. -type AddressManager struct { - port int - host string -} - -// Initialize returns a address a process can listen on. It returns -// a tuple consisting of a free port and the hostname resolved to its IP. -func (d *AddressManager) Initialize() (port int, resolvedHost string, err error) { - if d.port != 0 { - return 0, "", fmt.Errorf("this AddressManager is already initialized") - } - addr, err := net.ResolveTCPAddr("tcp", "localhost:0") - if err != nil { - return - } - l, err := net.ListenTCP("tcp", addr) - if err != nil { - return - } - d.port = l.Addr().(*net.TCPAddr).Port - defer func() { - err = l.Close() - }() - d.host = addr.IP.String() - return d.port, d.host, nil -} - -// Port returns the port that this AddressManager is managing. Port returns an -// error if this AddressManager has not yet been initialized. -func (d *AddressManager) Port() (int, error) { - if d.port == 0 { - return 0, fmt.Errorf("this AdressManager is not initialized yet") - } - return d.port, nil -} - -// Host returns the host that this AddressManager is managing. Host returns an -// error if this AddressManager has not yet been initialized. -func (d *AddressManager) Host() (string, error) { - if d.host == "" { - return "", fmt.Errorf("this AdressManager is not initialized yet") - } - return d.host, nil -} diff --git a/vendor/sigs.k8s.io/testing_frameworks/integration/internal/apiserver.go b/vendor/sigs.k8s.io/testing_frameworks/integration/internal/apiserver.go index a5256aee08e..68a54dc7515 100644 --- a/vendor/sigs.k8s.io/testing_frameworks/integration/internal/apiserver.go +++ b/vendor/sigs.k8s.io/testing_frameworks/integration/internal/apiserver.go @@ -5,7 +5,7 @@ var APIServerDefaultArgs = []string{ "--cert-dir={{ .CertDir }}", "--insecure-port={{ if .URL }}{{ .URL.Port }}{{ end }}", "--insecure-bind-address={{ if .URL }}{{ .URL.Hostname }}{{ end }}", - "--secure-port=0", + "--secure-port={{ if .SecurePort }}{{ .SecurePort }}{{ end }}", } func DoAPIServerArgDefaulting(args []string) []string { diff --git a/vendor/sigs.k8s.io/testing_frameworks/integration/internal/process.go b/vendor/sigs.k8s.io/testing_frameworks/integration/internal/process.go index 620c6a99c57..d7a0885668a 100644 --- a/vendor/sigs.k8s.io/testing_frameworks/integration/internal/process.go +++ b/vendor/sigs.k8s.io/testing_frameworks/integration/internal/process.go @@ -13,6 +13,8 @@ import ( "github.com/onsi/gomega/gbytes" "github.com/onsi/gomega/gexec" + + "sigs.k8s.io/testing_frameworks/integration/addr" ) type ProcessState struct { @@ -63,8 +65,7 @@ func DoDefaulting( } if listenUrl == nil { - am := &AddressManager{} - port, host, err := am.Initialize() + port, host, err := addr.Suggest() if err != nil { return DefaultedProcessInput{}, err }