diff --git a/go.mod b/go.mod index 379aabc03..24ab6cca9 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/gogo/protobuf v1.3.1 // indirect github.com/gonum/graph v0.0.0-20170401004347-50b27dea7ebb github.com/jteeuwen/go-bindata v3.0.8-0.20151023091102-a0ff2567cfb7+incompatible - github.com/openshift/api v0.0.0-20200109182645-c3cf38ec5571 + github.com/openshift/api v0.0.0-20200115130134-f472aa214b03 github.com/openshift/client-go v0.0.0-20200109173103-2763c6378941 github.com/openshift/library-go v0.0.0-20200114124611-9ace650367d2 github.com/pkg/errors v0.8.1 diff --git a/go.sum b/go.sum index 6bd1a867d..58aceb3be 100644 --- a/go.sum +++ b/go.sum @@ -308,6 +308,8 @@ github.com/openshift/api v0.0.0-20191217141120-791af96035a5/go.mod h1:dOo9oLY4le github.com/openshift/api v0.0.0-20200109154256-35a64c701b10/go.mod h1:dv+J0b/HWai0QnMVb37/H0v36klkLBi2TNpPeWDxX10= github.com/openshift/api v0.0.0-20200109182645-c3cf38ec5571 h1:cREUBoPv0hEFnWvSg12TVjjsYcEfNqglyE12Ody4gJk= github.com/openshift/api v0.0.0-20200109182645-c3cf38ec5571/go.mod h1:N1jYLqdomc/eHHrU/wphMsZBzRvxv5FBc7ATIdSQelI= +github.com/openshift/api v0.0.0-20200115130134-f472aa214b03 h1:FH/0yrv+sii6Z9fU9x4G/eClVMs7yN9jtYOArzuIFzs= +github.com/openshift/api v0.0.0-20200115130134-f472aa214b03/go.mod h1:WKvUfsZJ454fpKTZ2V+R+4/DI0pT4g9aDIizmZMkRto= github.com/openshift/client-go v0.0.0-20191216194936-57f413491e9e/go.mod h1:nLJaHFCQ5Mavh98g2ejEnWYFWBMGVdphrKNjLErOn/w= github.com/openshift/client-go v0.0.0-20200109173103-2763c6378941 h1:r9oaIRvM0JRem87eHGTCIJCWqRjRhZHcA0uc3cdc+mY= github.com/openshift/client-go v0.0.0-20200109173103-2763c6378941/go.mod h1:zMqD3jZrS8UB+n7ZBz/PtyFvkbKExD8i/Dfye5wgFqE= @@ -502,6 +504,8 @@ golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72 h1:bw9doJza/SFBEweII/rHQh3 golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200108203644-89082a384178 h1:f5gMxb6FbpY48csegk9UPd7IAHVrBD013CU7N4pWzoE= golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200115044656-831fdb1e1868 h1:6VZw2h4iwEB4GwgQU3Jvcsm8l9+yReTrErAEK1k6AC4= +golang.org/x/tools v0.0.0-20200115044656-831fdb1e1868/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/pkg/operator/apiservercontrollerset/apiservercontrollerset.go b/pkg/operator/apiservercontrollerset/apiservercontrollerset.go index b3fdb6c1b..c2563ae13 100644 --- a/pkg/operator/apiservercontrollerset/apiservercontrollerset.go +++ b/pkg/operator/apiservercontrollerset/apiservercontrollerset.go @@ -3,7 +3,6 @@ package apiservercontrollerset import ( "context" "fmt" - configv1 "github.com/openshift/api/config/v1" configv1client "github.com/openshift/client-go/config/clientset/versioned/typed/config/v1" configv1informers "github.com/openshift/client-go/config/informers/externalversions/config/v1" @@ -18,7 +17,6 @@ import ( kubeinformers "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes" corev1client "k8s.io/client-go/kubernetes/typed/core/v1" - apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1" apiregistrationv1client "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1" apiregistrationinformers "k8s.io/kube-aggregator/pkg/client/informers/externalversions" ) @@ -123,7 +121,7 @@ func (cs *APIServerControllerSet) WithoutClusterOperatorStatusController() *APIS func (cs *APIServerControllerSet) WithAPIServiceController( controllerName string, - apiServices []*apiregistrationv1.APIService, + getAPIServicesToManageFn apiservicecontroller.GetAPIServicesToMangeFunc, apiregistrationInformers apiregistrationinformers.SharedInformerFactory, apiregistrationv1Client apiregistrationv1client.ApiregistrationV1Interface, kubeInformersForTargetNamesace kubeinformers.SharedInformerFactory, @@ -131,7 +129,7 @@ func (cs *APIServerControllerSet) WithAPIServiceController( ) *APIServerControllerSet { cs.apiServiceController.controller = apiservicecontroller.NewAPIServiceController( controllerName, - apiServices, + getAPIServicesToManageFn, cs.operatorClient, apiregistrationInformers, apiregistrationv1Client, diff --git a/pkg/operator/apiservicecontroller/apigroup.go b/pkg/operator/apiservicecontroller/apigroup.go index d325f73db..fe555a896 100644 --- a/pkg/operator/apiservicecontroller/apigroup.go +++ b/pkg/operator/apiservicecontroller/apigroup.go @@ -5,13 +5,12 @@ import ( "net/http" "github.com/openshift/library-go/pkg/operator/events" - "k8s.io/apimachinery/pkg/util/wait" kubeinformers "k8s.io/client-go/informers" "k8s.io/client-go/rest" apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1" ) -func NewEndpointPrecondition(kubeInformers kubeinformers.SharedInformerFactory, apiServices []*apiregistrationv1.APIService) wait.ConditionFunc { +func newEndpointPrecondition(kubeInformers kubeinformers.SharedInformerFactory) func(apiServices []*apiregistrationv1.APIService) (bool, error) { // this is outside the func so it always registers before the informers start endpointsLister := kubeInformers.Core().V1().Endpoints().Lister() @@ -19,22 +18,24 @@ func NewEndpointPrecondition(kubeInformers kubeinformers.SharedInformerFactory, namespace string name string } - coordinates := []coordinate{} - for _, apiService := range apiServices { - curr := coordinate{namespace: apiService.Spec.Service.Namespace, name: apiService.Spec.Service.Name} - exists := false - for _, j := range coordinates { - if j == curr { - exists = true - break + + return func(apiServices []*apiregistrationv1.APIService) (bool, error) { + + coordinates := []coordinate{} + for _, apiService := range apiServices { + curr := coordinate{namespace: apiService.Spec.Service.Namespace, name: apiService.Spec.Service.Name} + exists := false + for _, j := range coordinates { + if j == curr { + exists = true + break + } + } + if !exists { + coordinates = append(coordinates, curr) } } - if !exists { - coordinates = append(coordinates, curr) - } - } - return func() (bool, error) { for _, curr := range coordinates { endpoints, err := endpointsLister.Endpoints(curr.namespace).Get(curr.name) if err != nil { diff --git a/pkg/operator/apiservicecontroller/apiservice_controller.go b/pkg/operator/apiservicecontroller/apiservice_controller.go index e825bd01f..252216330 100644 --- a/pkg/operator/apiservicecontroller/apiservice_controller.go +++ b/pkg/operator/apiservicecontroller/apiservice_controller.go @@ -7,14 +7,10 @@ import ( "strings" "time" - operatorsv1 "github.com/openshift/api/operator/v1" - operatorv1 "github.com/openshift/api/operator/v1" - "github.com/openshift/library-go/pkg/operator/events" - "github.com/openshift/library-go/pkg/operator/resource/resourceapply" - "github.com/openshift/library-go/pkg/operator/status" - "github.com/openshift/library-go/pkg/operator/v1helpers" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/errors" utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" kubeinformers "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes" @@ -24,19 +20,28 @@ import ( apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1" apiregistrationv1client "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1" apiregistrationinformers "k8s.io/kube-aggregator/pkg/client/informers/externalversions" + + operatorsv1 "github.com/openshift/api/operator/v1" + operatorv1 "github.com/openshift/api/operator/v1" + operatorlistersv1 "github.com/openshift/client-go/operator/listers/operator/v1" + "github.com/openshift/library-go/pkg/operator/events" + "github.com/openshift/library-go/pkg/operator/resource/resourceapply" + "github.com/openshift/library-go/pkg/operator/v1helpers" ) const ( workQueueKey = "key" ) +type GetAPIServicesToMangeFunc func() ([]*apiregistrationv1.APIService, error) +type apiServicesPreconditionFuncType func([]*apiregistrationv1.APIService) (bool, error) + type APIServiceController struct { - name string - apiServices []*apiregistrationv1.APIService + name string + getAPIServicesToManageFn GetAPIServicesToMangeFunc // precondition must return true before the apiservices will be created - precondition wait.ConditionFunc + precondition apiServicesPreconditionFuncType - versionRecorder status.VersionGetter operatorClient v1helpers.OperatorClient kubeClient kubernetes.Interface apiregistrationv1Client apiregistrationv1client.ApiregistrationV1Interface @@ -48,7 +53,7 @@ type APIServiceController struct { func NewAPIServiceController( name string, - apiServices []*apiregistrationv1.APIService, + getAPIServicesToManageFunc GetAPIServicesToMangeFunc, operatorClient v1helpers.OperatorClient, apiregistrationInformers apiregistrationinformers.SharedInformerFactory, apiregistrationv1Client apiregistrationv1client.ApiregistrationV1Interface, @@ -58,9 +63,9 @@ func NewAPIServiceController( ) *APIServiceController { fullname := "APIServiceController_" + name c := &APIServiceController{ - name: fullname, - apiServices: apiServices, - precondition: NewEndpointPrecondition(kubeInformersForOperandNamespace, apiServices), + name: fullname, + precondition: newEndpointPrecondition(kubeInformersForOperandNamespace), + getAPIServicesToManageFn: getAPIServicesToManageFunc, operatorClient: operatorClient, apiregistrationv1Client: apiregistrationv1Client, @@ -89,7 +94,12 @@ func (c *APIServiceController) sync() error { return nil case operatorsv1.Removed: errs := []error{} - for _, apiService := range c.apiServices { + apiServices, err := c.getAPIServicesToManageFn() + if err != nil { + errs = append(errs, err) + return errors.NewAggregate(errs) + } + for _, apiService := range apiServices { if err := c.apiregistrationv1Client.APIServices().Delete(apiService.Name, nil); err != nil { errs = append(errs, err) } @@ -100,7 +110,11 @@ func (c *APIServiceController) sync() error { return nil } - ready, err := c.precondition() + apiServices, err := c.getAPIServicesToManageFn() + if err != nil { + return err + } + ready, err := c.precondition(apiServices) if err != nil { v1helpers.UpdateStatus(c.operatorClient, v1helpers.UpdateConditionFn(operatorv1.OperatorCondition{ Type: "APIServicesAvailable", @@ -120,7 +134,7 @@ func (c *APIServiceController) sync() error { return err } - err = c.syncAPIServices() + err = c.syncAPIServices(apiServices) // update failing condition cond := operatorv1.OperatorCondition{ @@ -141,11 +155,11 @@ func (c *APIServiceController) sync() error { return err } -func (c *APIServiceController) syncAPIServices() error { +func (c *APIServiceController) syncAPIServices(apiServices []*apiregistrationv1.APIService) error { errs := []error{} var availableConditionMessages []string - for _, apiService := range c.apiServices { + for _, apiService := range apiServices { apiregistrationv1.SetDefaults_ServiceReference(apiService.Spec.Service) apiService, _, err := resourceapply.ApplyAPIService(c.apiregistrationv1Client, c.eventRecorder, apiService) if err != nil { @@ -173,7 +187,7 @@ func (c *APIServiceController) syncAPIServices() error { // if the apiservices themselves check out ok, try to actually hit the discovery endpoints. We have a history in clusterup // of something delaying them. This isn't perfect because of round-robining, but let's see if we get an improvement if c.kubeClient.Discovery().RESTClient() != nil { - missingAPIMessages := checkDiscoveryForByAPIServices(c.eventRecorder, c.kubeClient.Discovery().RESTClient(), c.apiServices) + missingAPIMessages := checkDiscoveryForByAPIServices(c.eventRecorder, c.kubeClient.Discovery().RESTClient(), apiServices) availableConditionMessages = append(availableConditionMessages, missingAPIMessages...) } @@ -232,3 +246,100 @@ func (c *APIServiceController) eventHandler() cache.ResourceEventHandler { DeleteFunc: func(obj interface{}) { c.queue.Add(workQueueKey) }, } } + +// APIServicesToMange preserve state and clients required to return an authoritative list of API services this operate must manage +type APIServicesToManage struct { + authOperatorLister operatorlistersv1.AuthenticationLister + apiregistrationv1Client apiregistrationv1client.ApiregistrationV1Interface + allPossibleAPIServices []*apiregistrationv1.APIService + eventRecorder events.Recorder + apiGroupsManagedByExternalServer sets.String + apiGroupsManagedByExternalServerAnnotation string + currentAPIServicesToManage []*apiregistrationv1.APIService +} + +// NewAPIServicesToManage returns an object that knows how to construct an authoritative list of API services this operate must manage +func NewAPIServicesToManage(apiregistrationv1Client apiregistrationv1client.ApiregistrationV1Interface, + authOperatorLister operatorlistersv1.AuthenticationLister, + allPossibleAPIServices []*apiregistrationv1.APIService, + eventRecorder events.Recorder, + apiGroupsManagedByExternalServer sets.String, + apiGroupsManagedByExternalServerAnnotation string) *APIServicesToManage { + return &APIServicesToManage{ + authOperatorLister: authOperatorLister, + apiregistrationv1Client: apiregistrationv1Client, + allPossibleAPIServices: allPossibleAPIServices, + eventRecorder: eventRecorder, + apiGroupsManagedByExternalServer: apiGroupsManagedByExternalServer, + apiGroupsManagedByExternalServerAnnotation: apiGroupsManagedByExternalServerAnnotation, + currentAPIServicesToManage: allPossibleAPIServices, + } +} + +// GetAPIServicesToManage returns the desired list of API Services that will be managed by this operator +// note that some services might be managed by an external operators/servers +func (a *APIServicesToManage) GetAPIServicesToManage() ([]*apiregistrationv1.APIService, error) { + if externalOperatorPreconditionErr := a.externalOperatorPrecondition(); externalOperatorPreconditionErr != nil { + klog.V(4).Infof("unable to determine if an external operator should take OAuth APIs over due to %v, returning authoritative/initial API Services list", externalOperatorPreconditionErr) + return a.allPossibleAPIServices, nil + } + + newAPIServicesToManage := []*apiregistrationv1.APIService{} + for _, apiService := range a.allPossibleAPIServices { + if a.apiGroupsManagedByExternalServer.Has(apiService.Name) && a.isAPIServiceAnnotatedByExternalServer(apiService) { + continue + } + newAPIServicesToManage = append(newAPIServicesToManage, apiService) + } + + if changed, newAPIServicesSet := apiServicesChanged(a.currentAPIServicesToManage, newAPIServicesToManage); changed { + a.eventRecorder.Eventf("APIServicesToManageChanged", "The new API Services list this operator will manage is %v", newAPIServicesSet.List()) + } + + a.currentAPIServicesToManage = newAPIServicesToManage + return a.currentAPIServicesToManage, nil +} + +func (a *APIServicesToManage) isAPIServiceAnnotatedByExternalServer(apiService *apiregistrationv1.APIService) bool { + existingApiService, err := a.apiregistrationv1Client.APIServices().Get(apiService.Name, metav1.GetOptions{}) + if err != nil { + a.eventRecorder.Warningf("APIServicesToManageAnnotation", "unable to determine if the following API Service %s was annotated by an external operator (it should be) due to %v", apiService.Name, err) + return false + } + + if _, ok := existingApiService.Annotations[a.apiGroupsManagedByExternalServerAnnotation]; ok { + return true + + } + return false +} + +// externalOperatorPrecondition checks whether authentication operator will manage OAuth API Resources by checking ManagingOAuthAPIServer status field +func (a *APIServicesToManage) externalOperatorPrecondition() error { + authOperator, err := a.authOperatorLister.Get("cluster") + if err != nil { + return err + } + + if !authOperator.Status.ManagingOAuthAPIServer { + return fmt.Errorf("%q status field set to false", "ManagingOAuthAPIServer") + } + + return nil +} + +func apiServicesChanged(old []*apiregistrationv1.APIService, new []*apiregistrationv1.APIService) (bool, sets.String) { + oldSet := sets.String{} + for _, oldService := range old { + oldSet.Insert(oldService.Name) + } + + newSet := sets.String{} + for _, newService := range new { + newSet.Insert(newService.Name) + } + + removed := oldSet.Difference(newSet).List() + added := newSet.Difference(oldSet).List() + return len(removed) > 0 || len(added) > 0, newSet +} diff --git a/pkg/operator/apiservicecontroller/apiservice_controller_test.go b/pkg/operator/apiservicecontroller/apiservice_controller_test.go index cafdca572..1cf404d55 100644 --- a/pkg/operator/apiservicecontroller/apiservice_controller_test.go +++ b/pkg/operator/apiservicecontroller/apiservice_controller_test.go @@ -1,28 +1,357 @@ package apiservicecontroller import ( + "fmt" + "github.com/pkg/errors" + "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/client-go/tools/cache" "sort" "strings" "testing" - operatorv1 "github.com/openshift/api/operator/v1" - "github.com/openshift/cluster-openshift-apiserver-operator/pkg/operator/operatorclient" - "github.com/openshift/library-go/pkg/operator/events" - "github.com/openshift/library-go/pkg/operator/status" - operatorv1helpers "github.com/openshift/library-go/pkg/operator/v1helpers" - "github.com/pkg/errors" "k8s.io/apimachinery/pkg/api/equality" + "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/diff" "k8s.io/client-go/kubernetes/fake" + clientgotesting "k8s.io/client-go/testing" kubetesting "k8s.io/client-go/testing" apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1" kubeaggregatorfake "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/fake" + + operatorv1 "github.com/openshift/api/operator/v1" + operatorlistersv1 "github.com/openshift/client-go/operator/listers/operator/v1" + "github.com/openshift/cluster-openshift-apiserver-operator/pkg/operator/operatorclient" + "github.com/openshift/library-go/pkg/operator/events" + operatorv1helpers "github.com/openshift/library-go/pkg/operator/v1helpers" ) +func TestDiffAPIServices(t *testing.T) { + testCases := []struct { + name string + oldAPIServices []*apiregistrationv1.APIService + newAPIServices []*apiregistrationv1.APIService + resultList []string + resultListChanged bool + }{ + // scenario 1 + { + name: "oauth removed", + oldAPIServices: []*apiregistrationv1.APIService{ + newAPIService("authorization.openshift.io", "v1"), + newAPIService("build.openshift.io", "v1"), + newAPIService("image.openshift.io", "v1"), + newAPIService("oauth.openshift.io", "v1"), + newAPIService("route.openshift.io", "v1"), + newAPIService("template.openshift.io", "v1"), + newAPIService("user.openshift.io", "v1"), + }, + newAPIServices: []*apiregistrationv1.APIService{ + newAPIService("authorization.openshift.io", "v1"), + newAPIService("build.openshift.io", "v1"), + newAPIService("image.openshift.io", "v1"), + newAPIService("route.openshift.io", "v1"), + newAPIService("template.openshift.io", "v1"), + newAPIService("user.openshift.io", "v1"), + }, + resultList: []string{ + "v1.authorization.openshift.io", + "v1.build.openshift.io", + "v1.image.openshift.io", + "v1.route.openshift.io", + "v1.template.openshift.io", + "v1.user.openshift.io", + }, + resultListChanged: true, + }, + // scenario 2 + { + name: "oauth added", + oldAPIServices: []*apiregistrationv1.APIService{ + newAPIService("authorization.openshift.io", "v1"), + newAPIService("build.openshift.io", "v1"), + newAPIService("image.openshift.io", "v1"), + newAPIService("route.openshift.io", "v1"), + newAPIService("template.openshift.io", "v1"), + newAPIService("user.openshift.io", "v1"), + }, + newAPIServices: []*apiregistrationv1.APIService{ + newAPIService("authorization.openshift.io", "v1"), + newAPIService("build.openshift.io", "v1"), + newAPIService("image.openshift.io", "v1"), + newAPIService("oauth.openshift.io", "v1"), + newAPIService("route.openshift.io", "v1"), + newAPIService("template.openshift.io", "v1"), + newAPIService("user.openshift.io", "v1"), + }, + resultList: []string{ + "v1.authorization.openshift.io", + "v1.build.openshift.io", + "v1.image.openshift.io", + "v1.oauth.openshift.io", + "v1.route.openshift.io", + "v1.template.openshift.io", + "v1.user.openshift.io", + }, + resultListChanged: true, + }, + // scenario 3 + { + name: "oauth added, user removed", + oldAPIServices: []*apiregistrationv1.APIService{ + newAPIService("authorization.openshift.io", "v1"), + newAPIService("build.openshift.io", "v1"), + newAPIService("image.openshift.io", "v1"), + newAPIService("route.openshift.io", "v1"), + newAPIService("template.openshift.io", "v1"), + newAPIService("user.openshift.io", "v1"), + }, + newAPIServices: []*apiregistrationv1.APIService{ + newAPIService("authorization.openshift.io", "v1"), + newAPIService("build.openshift.io", "v1"), + newAPIService("image.openshift.io", "v1"), + newAPIService("oauth.openshift.io", "v1"), + newAPIService("route.openshift.io", "v1"), + newAPIService("template.openshift.io", "v1"), + }, + resultList: []string{ + "v1.authorization.openshift.io", + "v1.build.openshift.io", + "v1.image.openshift.io", + "v1.oauth.openshift.io", + "v1.route.openshift.io", + "v1.template.openshift.io", + }, + resultListChanged: true, + }, + // scenario 4 + { + name: "no diff", + oldAPIServices: []*apiregistrationv1.APIService{ + newAPIService("authorization.openshift.io", "v1"), + newAPIService("build.openshift.io", "v1"), + newAPIService("image.openshift.io", "v1"), + newAPIService("oauth.openshift.io", "v1"), + newAPIService("route.openshift.io", "v1"), + newAPIService("template.openshift.io", "v1"), + newAPIService("user.openshift.io", "v1"), + }, + newAPIServices: []*apiregistrationv1.APIService{ + newAPIService("authorization.openshift.io", "v1"), + newAPIService("build.openshift.io", "v1"), + newAPIService("image.openshift.io", "v1"), + newAPIService("oauth.openshift.io", "v1"), + newAPIService("route.openshift.io", "v1"), + newAPIService("template.openshift.io", "v1"), + newAPIService("user.openshift.io", "v1"), + }, + resultList: []string{ + "v1.authorization.openshift.io", + "v1.build.openshift.io", + "v1.image.openshift.io", + "v1.oauth.openshift.io", + "v1.route.openshift.io", + "v1.template.openshift.io", + "v1.user.openshift.io", + }, + resultListChanged: false, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + changed, newAPIServicesSet := apiServicesChanged(tc.oldAPIServices, tc.newAPIServices) + + if changed != tc.resultListChanged { + t.Errorf("result list chaned = %v, expected it to change = %v", changed, tc.resultListChanged) + } + + if !equality.Semantic.DeepEqual(tc.resultList, newAPIServicesSet.List()) { + t.Errorf("incorect api services list returned: %s", diff.ObjectDiff(tc.resultList, newAPIServicesSet.List())) + } + }) + } +} + +func TestHandlingControlOverTheAPI(t *testing.T) { + const externalServerAnnotation = "authentication.operator.openshift.io/managed" + + testCases := []struct { + name string + existingAPIServices []runtime.Object + expectedActions []string + expectedEventMsg string + expectsEvent bool + authOperatorUnavailable bool + authOperatorManages bool + }{ + // scenario 1 + { + name: "checks if user.openshift.io and oauth.openshift.io groups are managed by an external server if all preconditions (authentication-operator status field set, annotations added) are valid", + authOperatorManages: true, + existingAPIServices: []runtime.Object{ + runtime.Object(newAPIService("build.openshift.io", "v1")), + runtime.Object(newAPIService("apps.openshift.io", "v1")), + runtime.Object(func() *apiregistrationv1.APIService { + apiService := newAPIService("user.openshift.io", "v1") + apiService.Annotations = map[string]string{} + apiService.Annotations[externalServerAnnotation] = "true" + return apiService + }()), + runtime.Object(func() *apiregistrationv1.APIService { + apiService := newAPIService("oauth.openshift.io", "v1") + apiService.Annotations = map[string]string{} + apiService.Annotations[externalServerAnnotation] = "true" + return apiService + }()), + }, + expectedActions: []string{"get:apiservices:v1.user.openshift.io", "get:apiservices:v1.oauth.openshift.io", "get:apiservices:v1.build.openshift.io", "update:apiservices:v1.build.openshift.io", "get:apiservices:v1.apps.openshift.io", "update:apiservices:v1.apps.openshift.io"}, + expectedEventMsg: "The new API Services list this operator will manage is [v1.apps.openshift.io v1.build.openshift.io]", + }, + + // scenario 2 + { + name: "checks that oauth.openshift.io group is not managed by an external server if it's missing the annotation", + authOperatorManages: true, + existingAPIServices: []runtime.Object{ + runtime.Object(newAPIService("build.openshift.io", "v1")), + runtime.Object(newAPIService("apps.openshift.io", "v1")), + runtime.Object(func() *apiregistrationv1.APIService { + apiService := newAPIService("user.openshift.io", "v1") + apiService.Annotations = map[string]string{} + apiService.Annotations[externalServerAnnotation] = "true" + return apiService + }()), + runtime.Object(newAPIService("oauth.openshift.io", "v1")), + }, + expectedActions: []string{"get:apiservices:v1.user.openshift.io", "get:apiservices:v1.oauth.openshift.io", "get:apiservices:v1.build.openshift.io", "update:apiservices:v1.build.openshift.io", "get:apiservices:v1.apps.openshift.io", "update:apiservices:v1.apps.openshift.io", "get:apiservices:v1.oauth.openshift.io", "update:apiservices:v1.oauth.openshift.io"}, + expectedEventMsg: "The new API Services list this operator will manage is [v1.apps.openshift.io v1.build.openshift.io v1.oauth.openshift.io]", + }, + + // scenario 3 + { + name: "authoritative/initial list is taken if authentication-operator wasn't found BUT the annotations were added", + authOperatorManages: true, + existingAPIServices: []runtime.Object{ + runtime.Object(newAPIService("build.openshift.io", "v1")), + runtime.Object(newAPIService("apps.openshift.io", "v1")), + runtime.Object(func() *apiregistrationv1.APIService { + apiService := newAPIService("user.openshift.io", "v1") + apiService.Annotations = map[string]string{} + apiService.Annotations[externalServerAnnotation] = "true" + return apiService + }()), + runtime.Object(func() *apiregistrationv1.APIService { + apiService := newAPIService("oauth.openshift.io", "v1") + apiService.Annotations = map[string]string{} + apiService.Annotations[externalServerAnnotation] = "true" + return apiService + }()), + }, + expectedActions: []string{"get:apiservices:v1.build.openshift.io", "update:apiservices:v1.build.openshift.io", "get:apiservices:v1.apps.openshift.io", "update:apiservices:v1.apps.openshift.io", "get:apiservices:v1.user.openshift.io", "update:apiservices:v1.user.openshift.io", "get:apiservices:v1.oauth.openshift.io", "update:apiservices:v1.oauth.openshift.io"}, + authOperatorUnavailable: true, + }, + + // scenario 4 + { + name: "authoritative/initial list is taken when ManagingOAuthAPIServer field set to false", + authOperatorManages: false, + existingAPIServices: []runtime.Object{ + runtime.Object(newAPIService("build.openshift.io", "v1")), + runtime.Object(newAPIService("apps.openshift.io", "v1")), + runtime.Object(func() *apiregistrationv1.APIService { + apiService := newAPIService("user.openshift.io", "v1") + apiService.Annotations = map[string]string{} + apiService.Annotations[externalServerAnnotation] = "true" + return apiService + }()), + runtime.Object(func() *apiregistrationv1.APIService { + apiService := newAPIService("oauth.openshift.io", "v1") + apiService.Annotations = map[string]string{} + apiService.Annotations[externalServerAnnotation] = "true" + return apiService + }()), + }, + expectedActions: []string{"get:apiservices:v1.build.openshift.io", "update:apiservices:v1.build.openshift.io", "get:apiservices:v1.apps.openshift.io", "update:apiservices:v1.apps.openshift.io", "get:apiservices:v1.user.openshift.io", "update:apiservices:v1.user.openshift.io", "get:apiservices:v1.oauth.openshift.io", "update:apiservices:v1.oauth.openshift.io"}, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + eventRecorder := events.NewInMemoryRecorder("") + kubeClient := fake.NewSimpleClientset() + kubeAggregatorClient := kubeaggregatorfake.NewSimpleClientset(tc.existingAPIServices...) + + fakeOperatorClient := operatorv1helpers.NewFakeOperatorClient(&operatorv1.OperatorSpec{ManagementState: operatorv1.Managed}, &operatorv1.OperatorStatus{}, nil) + + fakeAuthOperatorIndexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{}) + { + authOperator := &operatorv1.Authentication{ + TypeMeta: metav1.TypeMeta{}, + ObjectMeta: metav1.ObjectMeta{Name: "cluster"}, + Spec: operatorv1.AuthenticationSpec{OperatorSpec: operatorv1.OperatorSpec{ManagementState: operatorv1.Managed}}, + Status: operatorv1.AuthenticationStatus{ManagingOAuthAPIServer: tc.authOperatorManages, OperatorStatus: operatorv1.OperatorStatus{}}, + } + + if !tc.authOperatorUnavailable { + err := fakeAuthOperatorIndexer.Add(authOperator) + if err != nil { + t.Fatal(err) + } + } + } + + apiServices := []*apiregistrationv1.APIService{} + for _, rawService := range tc.existingAPIServices { + service, ok := rawService.(*apiregistrationv1.APIService) + if !ok { + t.Fatal("unable to convert an api service to *apiregistrationv1.APIService") + } + apiServices = append(apiServices, service) + } + + operator := &APIServiceController{ + precondition: func([]*apiregistrationv1.APIService) (bool, error) { return true, nil }, + kubeClient: kubeClient, + eventRecorder: eventRecorder, + operatorClient: fakeOperatorClient, + apiregistrationv1Client: kubeAggregatorClient.ApiregistrationV1(), + getAPIServicesToManageFn: NewAPIServicesToManage( + kubeAggregatorClient.ApiregistrationV1(), + operatorlistersv1.NewAuthenticationLister(fakeAuthOperatorIndexer), + apiServices, + eventRecorder, + sets.NewString("v1.oauth.openshift.io", "v1.user.openshift.io"), + externalServerAnnotation, + ).GetAPIServicesToManage, + } + + err := operator.sync() + if err != nil { + t.Fatal(err) + } + + if err := validateActionsVerbs(kubeAggregatorClient.Actions(), tc.expectedActions); err != nil { + t.Fatal(err) + } + + eventValidated := false + for _, ev := range eventRecorder.Events() { + if ev.Reason == "APIServicesToManageChanged" { + if ev.Message != tc.expectedEventMsg { + t.Errorf("unexpected APIServicesToManageChanged event message = %v, expected = %v", tc.expectedEventMsg, ev.Message) + } + eventValidated = true + } + } + if !eventValidated && tc.expectsEvent { + t.Error("APIServicesToManageChanged hasn't been found") + } + }) + } +} + func TestAvailableStatus(t *testing.T) { - //servicePort := utilpointer.Int32Ptr(443) testCases := []struct { name string expectedStatus operatorv1.ConditionStatus @@ -153,24 +482,45 @@ func TestAvailableStatus(t *testing.T) { kubeAggregatorClient.PrependReactor("*", "apiservices", tc.apiServiceReactor) } + eventRecorder := events.NewInMemoryRecorder("") fakeOperatorClient := operatorv1helpers.NewFakeOperatorClient(&operatorv1.OperatorSpec{ManagementState: operatorv1.Managed}, &operatorv1.OperatorStatus{}, nil) + fakeAuthOperatorIndexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{}) + { + authOperator := &operatorv1.Authentication{ + TypeMeta: metav1.TypeMeta{}, + ObjectMeta: metav1.ObjectMeta{Name: "cluster"}, + Spec: operatorv1.AuthenticationSpec{OperatorSpec: operatorv1.OperatorSpec{ManagementState: operatorv1.Managed}}, + Status: operatorv1.AuthenticationStatus{OperatorStatus: operatorv1.OperatorStatus{}}, + } + + err := fakeAuthOperatorIndexer.Add(authOperator) + if err != nil { + t.Fatal(err) + } + } operator := &APIServiceController{ - apiServices: []*apiregistrationv1.APIService{ - { - ObjectMeta: metav1.ObjectMeta{Name: "v1.apps.openshift.io"}, - Spec: apiregistrationv1.APIServiceSpec{Group: "apps.openshift.io", Version: "v1", Service: &apiregistrationv1.ServiceReference{}}, - }, - { - ObjectMeta: metav1.ObjectMeta{Name: "v1.build.openshift.io"}, - Spec: apiregistrationv1.APIServiceSpec{Group: "build.openshift.io", Version: "v1", Service: &apiregistrationv1.ServiceReference{}}, - }, - }, - precondition: func() (bool, error) { return true, nil }, + precondition: func([]*apiregistrationv1.APIService) (bool, error) { return true, nil }, kubeClient: kubeClient, - eventRecorder: events.NewInMemoryRecorder(""), + eventRecorder: eventRecorder, operatorClient: fakeOperatorClient, apiregistrationv1Client: kubeAggregatorClient.ApiregistrationV1(), - versionRecorder: status.NewVersionGetter(), + getAPIServicesToManageFn: NewAPIServicesToManage( + kubeAggregatorClient.ApiregistrationV1(), + operatorlistersv1.NewAuthenticationLister(fakeAuthOperatorIndexer), + []*apiregistrationv1.APIService{ + { + ObjectMeta: metav1.ObjectMeta{Name: "v1.apps.openshift.io"}, + Spec: apiregistrationv1.APIServiceSpec{Group: "apps.openshift.io", Version: "v1", Service: &apiregistrationv1.ServiceReference{}}, + }, + { + ObjectMeta: metav1.ObjectMeta{Name: "v1.build.openshift.io"}, + Spec: apiregistrationv1.APIServiceSpec{Group: "build.openshift.io", Version: "v1", Service: &apiregistrationv1.ServiceReference{}}, + }, + }, + eventRecorder, + sets.NewString("v1.oauth.openshift.io", "v1.user.openshift.io"), + "cluster.authentication.operator.openshift.io/managed", + ).GetAPIServicesToManage, } _ = operator.sync() @@ -214,3 +564,44 @@ func newAPIService(group, version string) *apiregistrationv1.APIService { Status: apiregistrationv1.APIServiceStatus{Conditions: []apiregistrationv1.APIServiceCondition{{Type: apiregistrationv1.Available, Status: apiregistrationv1.ConditionTrue}}}, } } + +func validateActionsVerbs(actualActions []clientgotesting.Action, expectedActions []string) error { + if len(actualActions) != len(expectedActions) { + return fmt.Errorf("expected to get %d actions but got %d\nexpected=%v \n got=%v", len(expectedActions), len(actualActions), expectedActions, actionStrings(actualActions)) + } + for i, a := range actualActions { + if got, expected := actionString(a), expectedActions[i]; got != expected { + return fmt.Errorf("at %d got %s, expected %s", i, got, expected) + } + } + return nil +} + +func actionString(a clientgotesting.Action) string { + involvedObjectName := "" + if updateAction, isUpdateAction := a.(clientgotesting.UpdateAction); isUpdateAction { + rawObj := updateAction.GetObject() + if objMeta, err := meta.Accessor(rawObj); err == nil { + involvedObjectName = objMeta.GetName() + } + } + if getAction, isGetAction := a.(clientgotesting.GetAction); isGetAction { + involvedObjectName = getAction.GetName() + } + action := a.GetVerb() + ":" + a.GetResource().Resource + if len(a.GetNamespace()) > 0 { + action = action + ":" + a.GetNamespace() + } + if len(involvedObjectName) > 0 { + action = action + ":" + involvedObjectName + } + return action +} + +func actionStrings(actions []clientgotesting.Action) []string { + res := make([]string, 0, len(actions)) + for _, a := range actions { + res = append(res, actionString(a)) + } + return res +} diff --git a/pkg/operator/starter.go b/pkg/operator/starter.go index 65ef963a1..a0127d498 100644 --- a/pkg/operator/starter.go +++ b/pkg/operator/starter.go @@ -3,6 +3,8 @@ package operator import ( "context" "fmt" + "github.com/openshift/cluster-openshift-apiserver-operator/pkg/operator/apiservicecontroller" + "k8s.io/apimachinery/pkg/util/sets" "os" "time" @@ -136,7 +138,14 @@ func RunOperator(ctx context.Context, controllerConfig *controllercmd.Controller controllerConfig.EventRecorder, ).WithAPIServiceController( "openshift-apiserver", - apiServices(), + apiservicecontroller.NewAPIServicesToManage( + apiregistrationv1Client.ApiregistrationV1(), + operatorConfigInformers.Operator().V1().Authentications().Lister(), + apiServices(), + controllerConfig.EventRecorder, + sets.NewString("v1.oauth.openshift.io", "v1.user.openshift.io"), + "authentication.operator.openshift.io/managed", + ).GetAPIServicesToManage, apiregistrationInformers, apiregistrationv1Client.ApiregistrationV1(), kubeInformersForNamespaces.InformersFor(operatorclient.TargetNamespace), diff --git a/vendor/github.com/openshift/api/go.mod b/vendor/github.com/openshift/api/go.mod index 8dd79f287..61d3bb2d4 100644 --- a/vendor/github.com/openshift/api/go.mod +++ b/vendor/github.com/openshift/api/go.mod @@ -7,7 +7,7 @@ require ( github.com/spf13/pflag v1.0.5 golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e // indirect - golang.org/x/tools v0.0.0-20200108203644-89082a384178 // indirect + golang.org/x/tools v0.0.0-20200115044656-831fdb1e1868 // indirect golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 // indirect k8s.io/api v0.17.0 k8s.io/apimachinery v0.17.0 diff --git a/vendor/github.com/openshift/api/go.sum b/vendor/github.com/openshift/api/go.sum index 90b06de99..056b55046 100644 --- a/vendor/github.com/openshift/api/go.sum +++ b/vendor/github.com/openshift/api/go.sum @@ -143,6 +143,8 @@ golang.org/x/tools v0.0.0-20200108195415-316d2f248479 h1:csuS+MHeEA2eWhyjQCMaPMq golang.org/x/tools v0.0.0-20200108195415-316d2f248479/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200108203644-89082a384178 h1:f5gMxb6FbpY48csegk9UPd7IAHVrBD013CU7N4pWzoE= golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200115044656-831fdb1e1868 h1:6VZw2h4iwEB4GwgQU3Jvcsm8l9+yReTrErAEK1k6AC4= +golang.org/x/tools v0.0.0-20200115044656-831fdb1e1868/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/vendor/github.com/openshift/api/image/v1/generated.pb.go b/vendor/github.com/openshift/api/image/v1/generated.pb.go index 858101af7..a320746fa 100644 --- a/vendor/github.com/openshift/api/image/v1/generated.pb.go +++ b/vendor/github.com/openshift/api/image/v1/generated.pb.go @@ -647,10 +647,66 @@ func (m *ImageStreamTagList) XXX_DiscardUnknown() { var xxx_messageInfo_ImageStreamTagList proto.InternalMessageInfo +func (m *ImageTag) Reset() { *m = ImageTag{} } +func (*ImageTag) ProtoMessage() {} +func (*ImageTag) Descriptor() ([]byte, []int) { + return fileDescriptor_650a0b34f65fde60, []int{22} +} +func (m *ImageTag) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ImageTag) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ImageTag) XXX_Merge(src proto.Message) { + xxx_messageInfo_ImageTag.Merge(m, src) +} +func (m *ImageTag) XXX_Size() int { + return m.Size() +} +func (m *ImageTag) XXX_DiscardUnknown() { + xxx_messageInfo_ImageTag.DiscardUnknown(m) +} + +var xxx_messageInfo_ImageTag proto.InternalMessageInfo + +func (m *ImageTagList) Reset() { *m = ImageTagList{} } +func (*ImageTagList) ProtoMessage() {} +func (*ImageTagList) Descriptor() ([]byte, []int) { + return fileDescriptor_650a0b34f65fde60, []int{23} +} +func (m *ImageTagList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ImageTagList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ImageTagList) XXX_Merge(src proto.Message) { + xxx_messageInfo_ImageTagList.Merge(m, src) +} +func (m *ImageTagList) XXX_Size() int { + return m.Size() +} +func (m *ImageTagList) XXX_DiscardUnknown() { + xxx_messageInfo_ImageTagList.DiscardUnknown(m) +} + +var xxx_messageInfo_ImageTagList proto.InternalMessageInfo + func (m *NamedTagEventList) Reset() { *m = NamedTagEventList{} } func (*NamedTagEventList) ProtoMessage() {} func (*NamedTagEventList) Descriptor() ([]byte, []int) { - return fileDescriptor_650a0b34f65fde60, []int{22} + return fileDescriptor_650a0b34f65fde60, []int{24} } func (m *NamedTagEventList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -678,7 +734,7 @@ var xxx_messageInfo_NamedTagEventList proto.InternalMessageInfo func (m *RepositoryImportSpec) Reset() { *m = RepositoryImportSpec{} } func (*RepositoryImportSpec) ProtoMessage() {} func (*RepositoryImportSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_650a0b34f65fde60, []int{23} + return fileDescriptor_650a0b34f65fde60, []int{25} } func (m *RepositoryImportSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -706,7 +762,7 @@ var xxx_messageInfo_RepositoryImportSpec proto.InternalMessageInfo func (m *RepositoryImportStatus) Reset() { *m = RepositoryImportStatus{} } func (*RepositoryImportStatus) ProtoMessage() {} func (*RepositoryImportStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_650a0b34f65fde60, []int{24} + return fileDescriptor_650a0b34f65fde60, []int{26} } func (m *RepositoryImportStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -734,7 +790,7 @@ var xxx_messageInfo_RepositoryImportStatus proto.InternalMessageInfo func (m *SignatureCondition) Reset() { *m = SignatureCondition{} } func (*SignatureCondition) ProtoMessage() {} func (*SignatureCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_650a0b34f65fde60, []int{25} + return fileDescriptor_650a0b34f65fde60, []int{27} } func (m *SignatureCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -762,7 +818,7 @@ var xxx_messageInfo_SignatureCondition proto.InternalMessageInfo func (m *SignatureGenericEntity) Reset() { *m = SignatureGenericEntity{} } func (*SignatureGenericEntity) ProtoMessage() {} func (*SignatureGenericEntity) Descriptor() ([]byte, []int) { - return fileDescriptor_650a0b34f65fde60, []int{26} + return fileDescriptor_650a0b34f65fde60, []int{28} } func (m *SignatureGenericEntity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -790,7 +846,7 @@ var xxx_messageInfo_SignatureGenericEntity proto.InternalMessageInfo func (m *SignatureIssuer) Reset() { *m = SignatureIssuer{} } func (*SignatureIssuer) ProtoMessage() {} func (*SignatureIssuer) Descriptor() ([]byte, []int) { - return fileDescriptor_650a0b34f65fde60, []int{27} + return fileDescriptor_650a0b34f65fde60, []int{29} } func (m *SignatureIssuer) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -818,7 +874,7 @@ var xxx_messageInfo_SignatureIssuer proto.InternalMessageInfo func (m *SignatureSubject) Reset() { *m = SignatureSubject{} } func (*SignatureSubject) ProtoMessage() {} func (*SignatureSubject) Descriptor() ([]byte, []int) { - return fileDescriptor_650a0b34f65fde60, []int{28} + return fileDescriptor_650a0b34f65fde60, []int{30} } func (m *SignatureSubject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -846,7 +902,7 @@ var xxx_messageInfo_SignatureSubject proto.InternalMessageInfo func (m *TagEvent) Reset() { *m = TagEvent{} } func (*TagEvent) ProtoMessage() {} func (*TagEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_650a0b34f65fde60, []int{29} + return fileDescriptor_650a0b34f65fde60, []int{31} } func (m *TagEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -874,7 +930,7 @@ var xxx_messageInfo_TagEvent proto.InternalMessageInfo func (m *TagEventCondition) Reset() { *m = TagEventCondition{} } func (*TagEventCondition) ProtoMessage() {} func (*TagEventCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_650a0b34f65fde60, []int{30} + return fileDescriptor_650a0b34f65fde60, []int{32} } func (m *TagEventCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -902,7 +958,7 @@ var xxx_messageInfo_TagEventCondition proto.InternalMessageInfo func (m *TagImportPolicy) Reset() { *m = TagImportPolicy{} } func (*TagImportPolicy) ProtoMessage() {} func (*TagImportPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_650a0b34f65fde60, []int{31} + return fileDescriptor_650a0b34f65fde60, []int{33} } func (m *TagImportPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -930,7 +986,7 @@ var xxx_messageInfo_TagImportPolicy proto.InternalMessageInfo func (m *TagReference) Reset() { *m = TagReference{} } func (*TagReference) ProtoMessage() {} func (*TagReference) Descriptor() ([]byte, []int) { - return fileDescriptor_650a0b34f65fde60, []int{32} + return fileDescriptor_650a0b34f65fde60, []int{34} } func (m *TagReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -958,7 +1014,7 @@ var xxx_messageInfo_TagReference proto.InternalMessageInfo func (m *TagReferencePolicy) Reset() { *m = TagReferencePolicy{} } func (*TagReferencePolicy) ProtoMessage() {} func (*TagReferencePolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_650a0b34f65fde60, []int{33} + return fileDescriptor_650a0b34f65fde60, []int{35} } func (m *TagReferencePolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1009,6 +1065,8 @@ func init() { proto.RegisterType((*ImageStreamStatus)(nil), "github.com.openshift.api.image.v1.ImageStreamStatus") proto.RegisterType((*ImageStreamTag)(nil), "github.com.openshift.api.image.v1.ImageStreamTag") proto.RegisterType((*ImageStreamTagList)(nil), "github.com.openshift.api.image.v1.ImageStreamTagList") + proto.RegisterType((*ImageTag)(nil), "github.com.openshift.api.image.v1.ImageTag") + proto.RegisterType((*ImageTagList)(nil), "github.com.openshift.api.image.v1.ImageTagList") proto.RegisterType((*NamedTagEventList)(nil), "github.com.openshift.api.image.v1.NamedTagEventList") proto.RegisterType((*RepositoryImportSpec)(nil), "github.com.openshift.api.image.v1.RepositoryImportSpec") proto.RegisterType((*RepositoryImportStatus)(nil), "github.com.openshift.api.image.v1.RepositoryImportStatus") @@ -1029,160 +1087,164 @@ func init() { } var fileDescriptor_650a0b34f65fde60 = []byte{ - // 2446 bytes of a gzipped FileDescriptorProto + // 2502 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5a, 0x4d, 0x6c, 0x1c, 0x49, 0x15, 0x4e, 0xcf, 0x9f, 0xc7, 0xcf, 0x8e, 0x1d, 0x57, 0xe2, 0xdd, 0xd9, 0x49, 0xd6, 0xf6, 0x76, - 0x48, 0x14, 0x20, 0xdb, 0x83, 0x4d, 0x76, 0x71, 0x82, 0xc4, 0x6e, 0x26, 0x13, 0xa2, 0x01, 0x7b, - 0xe3, 0x2d, 0x0f, 0x39, 0x44, 0x41, 0xa2, 0xdc, 0x53, 0x6e, 0x37, 0x9e, 0xe9, 0x1e, 0xba, 0x7b, - 0xbc, 0xeb, 0x08, 0x24, 0x0e, 0x68, 0xb5, 0x07, 0x0e, 0x70, 0xe2, 0xb0, 0x47, 0xb4, 0x42, 0x9c, - 0x11, 0x88, 0x3b, 0x20, 0x45, 0x5c, 0x58, 0x2d, 0x97, 0xbd, 0x60, 0x91, 0x81, 0x33, 0x37, 0x2e, - 0x7b, 0x42, 0x55, 0x5d, 0xdd, 0x5d, 0xdd, 0xd3, 0xe3, 0x74, 0x47, 0xb1, 0x81, 0x9b, 0xa7, 0xea, - 0xbd, 0xef, 0xbd, 0x7a, 0xaf, 0xde, 0x4f, 0xbd, 0x36, 0xac, 0x1a, 0xa6, 0xb7, 0x37, 0xdc, 0xd1, - 0x74, 0xbb, 0xdf, 0xb0, 0x07, 0xd4, 0x72, 0xf7, 0xcc, 0x5d, 0xaf, 0x41, 0x06, 0x66, 0xc3, 0xec, - 0x13, 0x83, 0x36, 0x0e, 0x56, 0x1b, 0x06, 0xb5, 0xa8, 0x43, 0x3c, 0xda, 0xd5, 0x06, 0x8e, 0xed, - 0xd9, 0xe8, 0xb5, 0x88, 0x45, 0x0b, 0x59, 0x34, 0x32, 0x30, 0x35, 0xce, 0xa2, 0x1d, 0xac, 0xd6, - 0x5f, 0x97, 0x50, 0x0d, 0xdb, 0xb0, 0x1b, 0x9c, 0x73, 0x67, 0xb8, 0xcb, 0x7f, 0xf1, 0x1f, 0xfc, - 0x2f, 0x1f, 0xb1, 0xae, 0xee, 0xaf, 0xbb, 0x9a, 0x69, 0x73, 0xb1, 0xba, 0xed, 0xa4, 0x49, 0xad, - 0xdf, 0x88, 0x68, 0xfa, 0x44, 0xdf, 0x33, 0x2d, 0xea, 0x1c, 0x36, 0x06, 0xfb, 0x06, 0x5b, 0x70, - 0x1b, 0x7d, 0xea, 0x91, 0x34, 0xae, 0xc6, 0x24, 0x2e, 0x67, 0x68, 0x79, 0x66, 0x9f, 0x8e, 0x31, - 0xbc, 0xf9, 0x2c, 0x06, 0x57, 0xdf, 0xa3, 0x7d, 0x92, 0xe4, 0x53, 0x3f, 0x55, 0xe0, 0x42, 0xcb, - 0xd6, 0xf7, 0xa9, 0xd3, 0x66, 0x46, 0xc0, 0x74, 0x97, 0x3a, 0xd4, 0xd2, 0x29, 0xba, 0x0e, 0x55, - 0x87, 0x1a, 0xa6, 0xeb, 0x39, 0x87, 0x35, 0x65, 0x45, 0xb9, 0x36, 0xdd, 0x3c, 0xf7, 0xe4, 0x68, - 0xf9, 0xcc, 0xe8, 0x68, 0xb9, 0x8a, 0xc5, 0x3a, 0x0e, 0x29, 0x50, 0x03, 0xa6, 0x2d, 0xd2, 0xa7, - 0xee, 0x80, 0xe8, 0xb4, 0x56, 0xe0, 0xe4, 0x0b, 0x82, 0x7c, 0xfa, 0x9d, 0x60, 0x03, 0x47, 0x34, - 0x68, 0x05, 0x4a, 0xec, 0x47, 0xad, 0xc8, 0x69, 0x67, 0x05, 0x6d, 0x89, 0xd1, 0x62, 0xbe, 0x83, - 0x5e, 0x85, 0xa2, 0x47, 0x8c, 0x5a, 0x89, 0x13, 0xcc, 0x08, 0x82, 0x62, 0x87, 0x18, 0x98, 0xad, - 0xa3, 0x3a, 0x14, 0xcc, 0x56, 0xad, 0xcc, 0x77, 0x41, 0xec, 0x16, 0xda, 0x2d, 0x5c, 0x30, 0x5b, - 0xea, 0x5f, 0xa6, 0xa0, 0xcc, 0x8f, 0x83, 0xbe, 0x07, 0x55, 0x66, 0xe2, 0x2e, 0xf1, 0x08, 0x3f, - 0xc5, 0xcc, 0xda, 0x57, 0x34, 0xdf, 0x52, 0x9a, 0x6c, 0x29, 0x6d, 0xb0, 0x6f, 0xb0, 0x05, 0x57, - 0x63, 0xd4, 0xda, 0xc1, 0xaa, 0x76, 0x7f, 0xe7, 0xfb, 0x54, 0xf7, 0x36, 0xa9, 0x47, 0x9a, 0x48, - 0xa0, 0x43, 0xb4, 0x86, 0x43, 0x54, 0xb4, 0x05, 0x17, 0xba, 0x29, 0xf6, 0x13, 0x46, 0xb8, 0x24, - 0x78, 0x53, 0x6d, 0x8c, 0x53, 0x39, 0xd1, 0x0f, 0xe1, 0xbc, 0xb4, 0xbe, 0x19, 0xa8, 0x5f, 0xe4, - 0xea, 0xbf, 0x3e, 0x51, 0x7d, 0xe1, 0x68, 0x0d, 0x93, 0xf7, 0xee, 0xbe, 0xef, 0x51, 0xcb, 0x35, - 0x6d, 0xab, 0x79, 0x51, 0xc8, 0x3f, 0xdf, 0x1a, 0x47, 0xc4, 0x69, 0x62, 0xd0, 0x0e, 0xd4, 0x53, - 0x96, 0x1f, 0x50, 0x87, 0xe1, 0x09, 0x6f, 0xa8, 0x02, 0xb5, 0xde, 0x9a, 0x48, 0x89, 0x8f, 0x41, - 0x41, 0x9b, 0xf1, 0x13, 0x12, 0xcb, 0xdc, 0xa5, 0xae, 0x27, 0x9c, 0x99, 0xaa, 0xb2, 0x20, 0xc1, - 0x69, 0x7c, 0xe8, 0x00, 0x16, 0xa4, 0xe5, 0x0d, 0x72, 0x48, 0x1d, 0xb7, 0x56, 0x59, 0x29, 0x72, - 0x73, 0x3d, 0x33, 0xe8, 0xb5, 0x88, 0xab, 0xf9, 0x8a, 0x90, 0xbd, 0xd0, 0x4a, 0xe2, 0xe1, 0x71, - 0x11, 0x88, 0x02, 0xb8, 0xa6, 0x61, 0x11, 0x6f, 0xe8, 0x50, 0xb7, 0x36, 0xc5, 0x05, 0xae, 0x66, - 0x15, 0xb8, 0x1d, 0x70, 0x46, 0xf7, 0x2b, 0x5c, 0x72, 0xb1, 0x04, 0x8c, 0xee, 0xc3, 0xa2, 0x24, - 0x3b, 0x22, 0xaa, 0x55, 0x57, 0x8a, 0xd7, 0x66, 0x9b, 0xaf, 0x8c, 0x8e, 0x96, 0x17, 0x5b, 0x69, - 0x04, 0x38, 0x9d, 0x0f, 0xed, 0xc1, 0xa5, 0x14, 0x33, 0x6e, 0xd2, 0xae, 0x49, 0x3a, 0x87, 0x03, - 0x5a, 0x9b, 0xe6, 0x7e, 0xf8, 0x82, 0x50, 0xeb, 0x52, 0xeb, 0x18, 0x5a, 0x7c, 0x2c, 0x12, 0xba, - 0x17, 0xf3, 0xcc, 0x1d, 0xdb, 0xda, 0x35, 0x8d, 0x1a, 0x70, 0xf8, 0x34, 0x53, 0xfb, 0x04, 0x78, - 0x9c, 0x47, 0xfd, 0x85, 0x02, 0xe7, 0xf9, 0xef, 0x66, 0xcf, 0xde, 0x09, 0x43, 0xc5, 0x45, 0xeb, - 0x30, 0xcb, 0xcd, 0xba, 0x69, 0xba, 0xae, 0x69, 0x19, 0x3c, 0x48, 0xaa, 0xcd, 0x0b, 0x02, 0x7b, - 0xb6, 0x2d, 0xed, 0xe1, 0x18, 0x25, 0x52, 0xa1, 0xd2, 0xf3, 0x6f, 0x8a, 0xb2, 0x52, 0x64, 0x39, - 0x64, 0x74, 0xb4, 0x5c, 0x11, 0xbe, 0x16, 0x3b, 0x8c, 0x46, 0xf7, 0x75, 0xf6, 0xa3, 0x99, 0xd3, - 0x08, 0x25, 0xc5, 0x8e, 0xfa, 0xa7, 0x22, 0xcc, 0x73, 0x31, 0xed, 0xfe, 0xc0, 0x76, 0xbc, 0xed, - 0x01, 0xd5, 0xd1, 0x5d, 0x28, 0xed, 0x3a, 0x76, 0x5f, 0x64, 0x9c, 0xcb, 0x52, 0xc8, 0x6a, 0xac, - 0x4c, 0x44, 0xf9, 0x25, 0x3c, 0x49, 0x94, 0x01, 0xbf, 0xe9, 0xd8, 0x7d, 0xcc, 0xd9, 0xd1, 0xdb, - 0x50, 0xf0, 0x6c, 0x2e, 0x7a, 0x66, 0xed, 0x5a, 0x1a, 0xc8, 0x86, 0xad, 0x93, 0x5e, 0x12, 0xa9, - 0xc2, 0x12, 0x61, 0xc7, 0xc6, 0x05, 0xcf, 0x46, 0x3d, 0x66, 0x1e, 0xa6, 0xd6, 0x96, 0xdd, 0x33, - 0xf5, 0x43, 0x91, 0x43, 0xd6, 0x32, 0xdc, 0xd1, 0x0e, 0x31, 0xda, 0x12, 0xa7, 0x6c, 0xd2, 0x68, - 0x15, 0xc7, 0xd0, 0xd1, 0xfb, 0x30, 0xef, 0x04, 0x6a, 0x08, 0x81, 0x65, 0x2e, 0xf0, 0x8d, 0x6c, - 0x02, 0x71, 0x9c, 0xb9, 0xf9, 0xb2, 0x90, 0x39, 0x9f, 0xd8, 0xc0, 0x49, 0x31, 0xe8, 0x36, 0xcc, - 0x9b, 0x96, 0xde, 0x1b, 0x76, 0xa3, 0x64, 0x52, 0xe2, 0x37, 0x21, 0x84, 0x68, 0xc7, 0xb7, 0x71, - 0x92, 0x5e, 0xfd, 0xab, 0x02, 0x0b, 0xb2, 0x1f, 0x3d, 0xe2, 0x0d, 0x5d, 0xd4, 0x81, 0x8a, 0xcb, - 0xff, 0x12, 0xbe, 0xbc, 0x9e, 0xad, 0x7a, 0xf8, 0xdc, 0xcd, 0x39, 0x21, 0xbd, 0xe2, 0xff, 0xc6, - 0x02, 0x0b, 0xb5, 0xa1, 0xcc, 0xcf, 0x1d, 0xfa, 0x36, 0x63, 0xce, 0x68, 0x4e, 0x8f, 0x8e, 0x96, - 0xfd, 0xca, 0x86, 0x7d, 0x84, 0xa0, 0x4a, 0x16, 0xd3, 0xab, 0xa4, 0xfa, 0x81, 0x02, 0x10, 0xa5, - 0xac, 0xb0, 0xea, 0x2a, 0x13, 0xab, 0xee, 0x15, 0x28, 0xb9, 0xe6, 0x63, 0x5f, 0xb3, 0x62, 0x54, - 0xc3, 0x39, 0xfb, 0xb6, 0xf9, 0x98, 0x62, 0xbe, 0xcd, 0xea, 0x7d, 0x3f, 0xcc, 0x17, 0xc5, 0x78, - 0xbd, 0x8f, 0x92, 0x43, 0x44, 0xa3, 0x76, 0x61, 0x2e, 0xd2, 0xa3, 0xc5, 0x0a, 0xcd, 0x6b, 0x42, - 0x92, 0xc2, 0x25, 0x9d, 0x7d, 0xa6, 0x94, 0x42, 0x06, 0x29, 0xbf, 0x57, 0x60, 0xda, 0x17, 0x63, - 0xba, 0x1e, 0x7a, 0x34, 0x56, 0xfc, 0xb5, 0x6c, 0xee, 0x63, 0xdc, 0xbc, 0xf4, 0x87, 0x2d, 0x4f, - 0xb0, 0x22, 0x15, 0xfe, 0x4d, 0x28, 0x9b, 0x1e, 0xed, 0xbb, 0xb5, 0x02, 0x4f, 0xfc, 0xd9, 0x9d, - 0x78, 0x56, 0x80, 0x96, 0xdb, 0x8c, 0x1d, 0xfb, 0x28, 0xea, 0xba, 0xb8, 0x7e, 0x1b, 0xb6, 0xbd, - 0x3f, 0x1c, 0x88, 0x7b, 0x7d, 0x19, 0xca, 0x3d, 0x16, 0xe3, 0x22, 0xaf, 0x85, 0x9c, 0x3c, 0xf0, - 0xb1, 0xbf, 0xa7, 0xfe, 0xa6, 0x22, 0x6c, 0x1b, 0xa6, 0xf8, 0x53, 0x68, 0x7b, 0x56, 0xa0, 0xe4, - 0x45, 0x5e, 0x09, 0x6f, 0x12, 0x77, 0x08, 0xdf, 0x41, 0x57, 0x60, 0x4a, 0xb7, 0x2d, 0x8f, 0x5a, - 0x1e, 0xd7, 0x7e, 0xb6, 0x39, 0x33, 0x3a, 0x5a, 0x9e, 0xba, 0xe3, 0x2f, 0xe1, 0x60, 0x0f, 0x99, - 0x00, 0xba, 0x6d, 0x75, 0x4d, 0xcf, 0xb4, 0x2d, 0xb7, 0x56, 0xe2, 0xb6, 0xcc, 0x92, 0x2f, 0xc2, - 0xc3, 0xde, 0x09, 0xb8, 0x23, 0x8d, 0xc3, 0x25, 0x17, 0x4b, 0xe0, 0xe8, 0xeb, 0x70, 0x96, 0xb3, - 0xb7, 0xbb, 0xd4, 0xf2, 0x4c, 0xef, 0x50, 0x34, 0x1c, 0x8b, 0x82, 0xed, 0x6c, 0x5b, 0xde, 0xc4, - 0x71, 0x5a, 0xf4, 0x23, 0x98, 0x65, 0x35, 0x99, 0x76, 0xef, 0xf4, 0x88, 0xd9, 0x0f, 0xfa, 0x8b, - 0x3b, 0xb9, 0xcb, 0x3d, 0x57, 0x3c, 0x40, 0xb9, 0x6b, 0x79, 0x8e, 0x94, 0x5b, 0xe5, 0x2d, 0x1c, - 0x13, 0x87, 0xde, 0x85, 0x29, 0xdd, 0xa1, 0xac, 0x71, 0xaf, 0x4d, 0x71, 0x87, 0x7e, 0x29, 0x9b, - 0x43, 0x3b, 0x66, 0x9f, 0x0a, 0xcb, 0xfb, 0xec, 0x38, 0xc0, 0x61, 0xe1, 0x61, 0xba, 0xee, 0x90, - 0x76, 0x9b, 0x87, 0xb5, 0x6a, 0xe6, 0xc2, 0x10, 0x1e, 0xa4, 0xcd, 0x78, 0x9d, 0xe6, 0x2c, 0x0b, - 0x8f, 0xb6, 0xc0, 0xc1, 0x21, 0x22, 0xfa, 0x6e, 0x80, 0xde, 0xb1, 0x79, 0x43, 0x31, 0xb3, 0xf6, - 0xd5, 0x3c, 0xe8, 0xdb, 0x43, 0x7e, 0xeb, 0x64, 0xf8, 0x8e, 0x8d, 0x43, 0xc8, 0xfa, 0x5b, 0xb0, - 0x30, 0x66, 0x48, 0x74, 0x0e, 0x8a, 0xfb, 0x54, 0x3c, 0x57, 0x30, 0xfb, 0x13, 0x5d, 0x80, 0xf2, - 0x01, 0xe9, 0x0d, 0xc5, 0x3d, 0xc5, 0xfe, 0x8f, 0x5b, 0x85, 0x75, 0x45, 0xfd, 0x65, 0x01, 0x66, - 0x7c, 0xcf, 0x78, 0x0e, 0x25, 0xfd, 0x53, 0x08, 0x99, 0x0e, 0x94, 0xdc, 0x01, 0xd5, 0x45, 0xd2, - 0x5f, 0xcb, 0x7c, 0x73, 0xb8, 0x7e, 0xac, 0xaf, 0x88, 0xc2, 0x8c, 0xfd, 0xc2, 0x1c, 0x0d, 0x3d, - 0x0a, 0x2b, 0x94, 0x5f, 0xdc, 0x6f, 0xe4, 0xc4, 0x3d, 0xb6, 0x52, 0xa9, 0x7f, 0x50, 0xe0, 0x9c, - 0x44, 0x7d, 0x5a, 0x8f, 0xaa, 0xcd, 0xe7, 0x2d, 0x90, 0x51, 0x6e, 0x95, 0x8a, 0xa4, 0xfa, 0xdb, - 0x82, 0x48, 0xae, 0xc1, 0x29, 0x58, 0x85, 0x3f, 0x85, 0x63, 0x3c, 0x8c, 0x79, 0x7c, 0x3d, 0x9f, - 0x67, 0xa2, 0x7e, 0x32, 0xd5, 0xef, 0x3b, 0x09, 0xbf, 0xdf, 0x7a, 0x2e, 0xf4, 0xe3, 0xbd, 0xff, - 0x93, 0x02, 0x2c, 0xa6, 0x6a, 0x84, 0xae, 0x42, 0xc5, 0x6f, 0xfd, 0xb8, 0xe5, 0xaa, 0x11, 0x82, - 0x4f, 0x83, 0xc5, 0x2e, 0x32, 0x00, 0x1c, 0x3a, 0xb0, 0x5d, 0xd3, 0xb3, 0x9d, 0x43, 0x61, 0x87, - 0xaf, 0x65, 0xd0, 0x14, 0x87, 0x4c, 0x92, 0x19, 0xe6, 0x98, 0xa1, 0xa3, 0x1d, 0x2c, 0x41, 0xa3, - 0x87, 0x4c, 0x21, 0x62, 0x50, 0x66, 0x8e, 0x62, 0x9e, 0xf0, 0x92, 0xf1, 0xa3, 0x43, 0x30, 0x24, - 0x2c, 0x10, 0xd5, 0xdf, 0x15, 0xe0, 0xe5, 0x09, 0xa6, 0x43, 0x38, 0x66, 0x08, 0xd6, 0x61, 0xe4, - 0x72, 0x83, 0xff, 0xa4, 0x48, 0x18, 0xcd, 0x4c, 0x31, 0xda, 0xcd, 0xe7, 0x31, 0x9a, 0xf0, 0xee, - 0x31, 0x66, 0x7b, 0x94, 0x30, 0xdb, 0x8d, 0x9c, 0x66, 0x4b, 0xdc, 0x9f, 0x84, 0xe1, 0x3e, 0x2e, - 0xc5, 0xe2, 0x4e, 0x3c, 0x9b, 0x4f, 0x3e, 0xee, 0xba, 0x50, 0xde, 0xe9, 0xd9, 0x3b, 0x41, 0x6b, - 0xf6, 0x56, 0x3e, 0x9f, 0xf8, 0x6a, 0x6a, 0xec, 0xa5, 0x29, 0x0a, 0x74, 0x98, 0x55, 0xf8, 0x1a, - 0xf6, 0xc1, 0xd1, 0x5e, 0xc2, 0x76, 0x6f, 0x3f, 0x97, 0x18, 0xdf, 0x64, 0xbe, 0x9c, 0x09, 0x76, - 0xac, 0xef, 0x03, 0x44, 0xda, 0xa4, 0x54, 0xb9, 0x7b, 0x72, 0x95, 0xcb, 0x31, 0x83, 0x08, 0x9b, - 0x71, 0xa9, 0x30, 0xd6, 0x7f, 0x20, 0xea, 0xe2, 0x44, 0x69, 0x1b, 0x71, 0x69, 0x6f, 0x66, 0x4e, - 0xce, 0xb1, 0xa7, 0xbb, 0x5c, 0x8b, 0xff, 0xa8, 0x88, 0x37, 0xb4, 0xb0, 0xcc, 0xc9, 0x37, 0xef, - 0xdb, 0xf1, 0xe6, 0x3d, 0x6f, 0xd4, 0xa6, 0xb7, 0xf0, 0xff, 0x54, 0x00, 0x49, 0x54, 0x9b, 0x64, - 0x30, 0x30, 0x2d, 0xe3, 0xff, 0xae, 0x5c, 0x3e, 0xeb, 0x4d, 0xf9, 0xeb, 0x42, 0xcc, 0x5b, 0xbc, - 0x1e, 0x58, 0x30, 0xdb, 0x93, 0x1e, 0x2e, 0x79, 0x7b, 0x11, 0xf9, 0xd1, 0x13, 0xb5, 0xc3, 0xf2, - 0x2a, 0x8e, 0xe1, 0xa3, 0xed, 0xd8, 0x4c, 0x2c, 0x4a, 0x6e, 0xe2, 0x65, 0xfb, 0xaa, 0x80, 0x58, - 0x6c, 0xa5, 0x11, 0xe1, 0x74, 0x5e, 0xf4, 0x2e, 0x94, 0x3c, 0x62, 0x04, 0x77, 0xa2, 0x91, 0x73, - 0x68, 0x21, 0x3d, 0x82, 0x88, 0xe1, 0x62, 0x0e, 0xa5, 0xfe, 0x2a, 0xde, 0x79, 0x88, 0xa2, 0x71, - 0x22, 0xda, 0x53, 0xb8, 0x38, 0x18, 0xee, 0xf4, 0x4c, 0x3d, 0x95, 0x4b, 0x78, 0xf3, 0xb2, 0x80, - 0xbe, 0xb8, 0x35, 0x99, 0x14, 0x1f, 0x87, 0x83, 0x1e, 0xc4, 0x8c, 0x94, 0xc5, 0xc3, 0xef, 0x90, - 0x3e, 0xed, 0x76, 0x88, 0x71, 0xf7, 0x80, 0x5a, 0x1e, 0x8b, 0xc5, 0x54, 0x4b, 0x7d, 0x54, 0x0a, - 0x5e, 0xb1, 0xdc, 0x52, 0x1d, 0x72, 0x1a, 0x81, 0xf3, 0x2d, 0xff, 0xa6, 0xfb, 0x61, 0x93, 0xdb, - 0xe1, 0x53, 0xb1, 0x0f, 0x12, 0x6b, 0x00, 0xe2, 0xe3, 0x8a, 0x69, 0x5b, 0xdc, 0xdc, 0xc5, 0x48, - 0xfa, 0xbd, 0x70, 0x07, 0x4b, 0x54, 0x63, 0x61, 0x53, 0x39, 0xe1, 0xb0, 0xd9, 0x4b, 0x79, 0x6c, - 0xdf, 0xc8, 0x76, 0x6c, 0xee, 0xbd, 0xec, 0x6f, 0xed, 0x30, 0x25, 0x95, 0x5f, 0x48, 0x07, 0xff, - 0xe7, 0x78, 0x6a, 0xed, 0x10, 0xe3, 0x14, 0x8a, 0xc4, 0x83, 0x78, 0x91, 0x58, 0xcd, 0x57, 0x24, - 0x3a, 0xc4, 0x98, 0x50, 0x27, 0xfe, 0xa5, 0xc0, 0xc2, 0x58, 0x50, 0x04, 0x59, 0x57, 0x99, 0xf0, - 0xbd, 0x6b, 0x2b, 0xae, 0xcc, 0x97, 0x73, 0x78, 0x2d, 0x5d, 0x8d, 0xc4, 0x65, 0x28, 0x9e, 0xdc, - 0x65, 0x50, 0x3f, 0x2c, 0xc2, 0x85, 0xb4, 0x8e, 0xfe, 0x45, 0x0d, 0xca, 0x93, 0x63, 0xee, 0xc2, - 0x69, 0x8f, 0xb9, 0x4b, 0xff, 0xb5, 0x31, 0x77, 0x31, 0xe7, 0x98, 0xfb, 0xc3, 0x02, 0xbc, 0x94, - 0xfe, 0x4e, 0x38, 0xa1, 0x59, 0x77, 0xf4, 0xc2, 0x28, 0xbc, 0xf8, 0x17, 0x06, 0xba, 0x05, 0x73, - 0xa4, 0xeb, 0x5f, 0x33, 0xd2, 0x63, 0xd5, 0x84, 0xdf, 0xe3, 0xe9, 0x26, 0x1a, 0x1d, 0x2d, 0xcf, - 0xdd, 0x8e, 0xed, 0xe0, 0x04, 0xa5, 0xfa, 0x69, 0x11, 0xd0, 0xf8, 0x14, 0x11, 0xdd, 0x12, 0x93, - 0x4d, 0x3f, 0x10, 0xaf, 0xca, 0x93, 0xcd, 0xcf, 0x8f, 0x96, 0x5f, 0x1a, 0xe7, 0x90, 0x66, 0x9e, - 0x1b, 0xa1, 0x09, 0xfd, 0xb9, 0xe8, 0x8d, 0xb8, 0x51, 0x3e, 0x3f, 0x5a, 0x4e, 0xf9, 0x97, 0x01, - 0x2d, 0x44, 0x4a, 0x98, 0xce, 0x80, 0xb3, 0x3d, 0xe2, 0x7a, 0x5b, 0x8e, 0xbd, 0x43, 0x3b, 0xa6, - 0xf8, 0x58, 0x9e, 0x6f, 0xf2, 0x17, 0xce, 0x36, 0x37, 0x64, 0x20, 0x1c, 0xc7, 0x45, 0x07, 0x80, - 0xd8, 0x42, 0xc7, 0x21, 0x96, 0xeb, 0x1f, 0x89, 0x49, 0x2b, 0xe5, 0x96, 0x56, 0x17, 0xd2, 0xd0, - 0xc6, 0x18, 0x1a, 0x4e, 0x91, 0x80, 0xae, 0x42, 0xc5, 0xa1, 0xc4, 0xb5, 0x2d, 0x31, 0x89, 0x0d, - 0xbd, 0x8c, 0xf9, 0x2a, 0x16, 0xbb, 0xe8, 0x8b, 0x30, 0xd5, 0xa7, 0xae, 0xcb, 0xca, 0x49, 0x85, - 0x13, 0xce, 0x0b, 0xc2, 0xa9, 0x4d, 0x7f, 0x19, 0x07, 0xfb, 0xea, 0x07, 0x0a, 0x44, 0x2e, 0xe2, - 0x55, 0xd7, 0xd4, 0xef, 0xfa, 0x13, 0xdc, 0x75, 0x98, 0xb5, 0x1d, 0x83, 0x58, 0xe6, 0x63, 0xbf, - 0x44, 0xfb, 0x0e, 0x0e, 0x23, 0xfe, 0xbe, 0xb4, 0x87, 0x63, 0x94, 0xac, 0xb4, 0xeb, 0x76, 0xbf, - 0x6f, 0x5b, 0x2c, 0x6b, 0x0b, 0xd7, 0x4a, 0x39, 0x2f, 0xd8, 0xc1, 0x12, 0x95, 0xfa, 0xb1, 0x02, - 0xf3, 0x89, 0x59, 0x29, 0xfa, 0xb9, 0x02, 0x2f, 0xb9, 0xa9, 0xca, 0x89, 0x90, 0xbb, 0x99, 0x67, - 0x44, 0x1a, 0x03, 0x68, 0x2e, 0x09, 0x7d, 0x26, 0x9c, 0x1e, 0x4f, 0x10, 0xac, 0xfe, 0x4d, 0x81, - 0x73, 0xc9, 0xa9, 0xeb, 0xff, 0xa2, 0xa2, 0xe8, 0x0d, 0x98, 0xf1, 0xfb, 0xd2, 0x6f, 0xd3, 0xc3, - 0x76, 0x4b, 0x78, 0xe1, 0xbc, 0x00, 0x9b, 0xd9, 0x8a, 0xb6, 0xb0, 0x4c, 0xa7, 0xfe, 0xb4, 0x00, - 0xd5, 0xa0, 0x62, 0xa1, 0xef, 0x44, 0x53, 0x74, 0x25, 0xf7, 0xed, 0x0e, 0x2f, 0xdd, 0xd8, 0x24, - 0xfd, 0xc5, 0xff, 0x0f, 0xc8, 0xe5, 0xa0, 0x7d, 0xf2, 0xdb, 0xf6, 0xf4, 0x77, 0x5a, 0xbc, 0xe3, - 0x2c, 0x65, 0xe9, 0x38, 0xd5, 0x8f, 0x8a, 0xb0, 0x30, 0x56, 0xc0, 0xd1, 0xcd, 0x58, 0xce, 0xbb, - 0x92, 0xc8, 0x79, 0x8b, 0x63, 0x0c, 0x27, 0x96, 0xf2, 0xd2, 0x33, 0x51, 0xf1, 0x14, 0x33, 0x51, - 0x29, 0x6b, 0x26, 0x2a, 0x1f, 0x9f, 0x89, 0x12, 0xde, 0xa9, 0x64, 0xf2, 0xce, 0x00, 0xe6, 0x13, - 0x1d, 0x09, 0xba, 0x0e, 0x55, 0xd3, 0x72, 0xa9, 0x3e, 0x74, 0xa8, 0x98, 0xb5, 0x86, 0x2d, 0x6b, - 0x5b, 0xac, 0xe3, 0x90, 0x02, 0x35, 0x60, 0xda, 0xd5, 0xf7, 0x68, 0x77, 0xd8, 0xa3, 0x5d, 0xee, - 0x90, 0x6a, 0xf4, 0xc5, 0x74, 0x3b, 0xd8, 0xc0, 0x11, 0x8d, 0xfa, 0xef, 0x12, 0xcc, 0xca, 0x3d, - 0x49, 0x86, 0x4f, 0xc4, 0xef, 0xc1, 0x0c, 0xb1, 0x2c, 0xdb, 0x23, 0x7e, 0xe3, 0x58, 0xc8, 0x3c, - 0xfc, 0x92, 0xe5, 0x68, 0xb7, 0x23, 0x08, 0x7f, 0xf8, 0x15, 0x86, 0xb2, 0xb4, 0x83, 0x65, 0x49, - 0xe8, 0xb6, 0xe8, 0x16, 0x8b, 0xd9, 0xbb, 0xc5, 0x6a, 0xa2, 0x53, 0x6c, 0xc0, 0x74, 0xd8, 0x54, - 0x89, 0x7f, 0x11, 0x08, 0xed, 0x13, 0xc5, 0x64, 0x44, 0x83, 0xb4, 0x98, 0x17, 0xcb, 0xdc, 0x8b, - 0x73, 0xc7, 0xbc, 0xe8, 0x92, 0xad, 0x68, 0xe5, 0xb4, 0x5b, 0xd1, 0xa9, 0x53, 0x69, 0x45, 0xeb, - 0xdf, 0x80, 0x73, 0x49, 0x0f, 0xe6, 0xfa, 0xfc, 0xb6, 0x05, 0x68, 0x5c, 0xfe, 0xb3, 0x7a, 0xaf, - 0x71, 0x8e, 0x28, 0x11, 0x35, 0xaf, 0x3d, 0x79, 0xba, 0x74, 0xe6, 0x93, 0xa7, 0x4b, 0x67, 0x3e, - 0x7b, 0xba, 0x74, 0xe6, 0xc7, 0xa3, 0x25, 0xe5, 0xc9, 0x68, 0x49, 0xf9, 0x64, 0xb4, 0xa4, 0x7c, - 0x36, 0x5a, 0x52, 0xfe, 0x3e, 0x5a, 0x52, 0x7e, 0xf6, 0x8f, 0xa5, 0x33, 0x0f, 0x0b, 0x07, 0xab, - 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0x9c, 0x37, 0xe5, 0xab, 0x3c, 0x2a, 0x00, 0x00, + 0x48, 0x14, 0x20, 0x3b, 0x83, 0x4d, 0x76, 0x71, 0x82, 0xc4, 0x6e, 0x26, 0x13, 0xa2, 0x01, 0x7b, + 0xe3, 0x2d, 0x0f, 0x11, 0x8a, 0x82, 0x44, 0xb9, 0xa7, 0xdc, 0x6e, 0x3c, 0xd3, 0x3d, 0x74, 0xf7, + 0x78, 0xd7, 0x11, 0x48, 0x1c, 0xd0, 0x6a, 0x0f, 0x1c, 0xe0, 0xc4, 0x61, 0x8f, 0x68, 0x85, 0x38, + 0x23, 0x10, 0x27, 0x2e, 0x80, 0x14, 0x71, 0x61, 0xb5, 0x5c, 0xf6, 0x82, 0xb5, 0x19, 0x38, 0x73, + 0xe3, 0xb2, 0x27, 0x54, 0xd5, 0xd5, 0xdd, 0xd5, 0x3d, 0x3d, 0x4e, 0xb7, 0x89, 0x07, 0xb8, 0x4d, + 0xd7, 0x7b, 0xef, 0x7b, 0xaf, 0xdf, 0xab, 0x7a, 0x3f, 0xd5, 0x03, 0xab, 0xba, 0xe1, 0xee, 0x0d, + 0x76, 0x6a, 0x9a, 0xd5, 0xab, 0x5b, 0x7d, 0x6a, 0x3a, 0x7b, 0xc6, 0xae, 0x5b, 0x27, 0x7d, 0xa3, + 0x6e, 0xf4, 0x88, 0x4e, 0xeb, 0x07, 0xab, 0x75, 0x9d, 0x9a, 0xd4, 0x26, 0x2e, 0xed, 0xd4, 0xfa, + 0xb6, 0xe5, 0x5a, 0xe8, 0x95, 0x50, 0xa4, 0x16, 0x88, 0xd4, 0x48, 0xdf, 0xa8, 0x71, 0x91, 0xda, + 0xc1, 0x6a, 0xf5, 0x55, 0x09, 0x55, 0xb7, 0x74, 0xab, 0xce, 0x25, 0x77, 0x06, 0xbb, 0xfc, 0x89, + 0x3f, 0xf0, 0x5f, 0x1e, 0x62, 0x55, 0xdd, 0x5f, 0x77, 0x6a, 0x86, 0xc5, 0xd5, 0x6a, 0x96, 0x9d, + 0xa4, 0xb5, 0x7a, 0x23, 0xe4, 0xe9, 0x11, 0x6d, 0xcf, 0x30, 0xa9, 0x7d, 0x58, 0xef, 0xef, 0xeb, + 0x6c, 0xc1, 0xa9, 0xf7, 0xa8, 0x4b, 0x92, 0xa4, 0xea, 0xe3, 0xa4, 0xec, 0x81, 0xe9, 0x1a, 0x3d, + 0x3a, 0x22, 0xf0, 0xfa, 0xb3, 0x04, 0x1c, 0x6d, 0x8f, 0xf6, 0x48, 0x5c, 0x4e, 0xfd, 0x58, 0x81, + 0x0b, 0x4d, 0x4b, 0xdb, 0xa7, 0x76, 0x8b, 0x39, 0x01, 0xd3, 0x5d, 0x6a, 0x53, 0x53, 0xa3, 0xe8, + 0x3a, 0x94, 0x6d, 0xaa, 0x1b, 0x8e, 0x6b, 0x1f, 0x56, 0x94, 0x15, 0xe5, 0xda, 0x74, 0xe3, 0xdc, + 0x93, 0xa3, 0xe5, 0x33, 0xc3, 0xa3, 0xe5, 0x32, 0x16, 0xeb, 0x38, 0xe0, 0x40, 0x75, 0x98, 0x36, + 0x49, 0x8f, 0x3a, 0x7d, 0xa2, 0xd1, 0x4a, 0x8e, 0xb3, 0x2f, 0x08, 0xf6, 0xe9, 0xb7, 0x7c, 0x02, + 0x0e, 0x79, 0xd0, 0x0a, 0x14, 0xd8, 0x43, 0x25, 0xcf, 0x79, 0x67, 0x05, 0x6f, 0x81, 0xf1, 0x62, + 0x4e, 0x41, 0x2f, 0x43, 0xde, 0x25, 0x7a, 0xa5, 0xc0, 0x19, 0x66, 0x04, 0x43, 0xbe, 0x4d, 0x74, + 0xcc, 0xd6, 0x51, 0x15, 0x72, 0x46, 0xb3, 0x52, 0xe4, 0x54, 0x10, 0xd4, 0x5c, 0xab, 0x89, 0x73, + 0x46, 0x53, 0xfd, 0xcb, 0x14, 0x14, 0xf9, 0xeb, 0xa0, 0xef, 0x42, 0x99, 0xb9, 0xb8, 0x43, 0x5c, + 0xc2, 0xdf, 0x62, 0x66, 0xed, 0x4b, 0x35, 0xcf, 0x53, 0x35, 0xd9, 0x53, 0xb5, 0xfe, 0xbe, 0xce, + 0x16, 0x9c, 0x1a, 0xe3, 0xae, 0x1d, 0xac, 0xd6, 0xee, 0xef, 0x7c, 0x8f, 0x6a, 0xee, 0x26, 0x75, + 0x49, 0x03, 0x09, 0x74, 0x08, 0xd7, 0x70, 0x80, 0x8a, 0xb6, 0xe0, 0x42, 0x27, 0xc1, 0x7f, 0xc2, + 0x09, 0x97, 0x84, 0x6c, 0xa2, 0x8f, 0x71, 0xa2, 0x24, 0xfa, 0x01, 0x9c, 0x97, 0xd6, 0x37, 0x7d, + 0xf3, 0xf3, 0xdc, 0xfc, 0x57, 0xc7, 0x9a, 0x2f, 0x02, 0x5d, 0xc3, 0xe4, 0x9d, 0xbb, 0xef, 0xba, + 0xd4, 0x74, 0x0c, 0xcb, 0x6c, 0x5c, 0x14, 0xfa, 0xcf, 0x37, 0x47, 0x11, 0x71, 0x92, 0x1a, 0xb4, + 0x03, 0xd5, 0x84, 0xe5, 0x07, 0xd4, 0x66, 0x78, 0x22, 0x1a, 0xaa, 0x40, 0xad, 0x36, 0xc7, 0x72, + 0xe2, 0x63, 0x50, 0xd0, 0x66, 0xf4, 0x0d, 0x89, 0x69, 0xec, 0x52, 0xc7, 0x15, 0xc1, 0x4c, 0x34, + 0x59, 0xb0, 0xe0, 0x24, 0x39, 0x74, 0x00, 0x0b, 0xd2, 0xf2, 0x06, 0x39, 0xa4, 0xb6, 0x53, 0x29, + 0xad, 0xe4, 0xb9, 0xbb, 0x9e, 0x79, 0xe8, 0x6b, 0xa1, 0x54, 0xe3, 0x25, 0xa1, 0x7b, 0xa1, 0x19, + 0xc7, 0xc3, 0xa3, 0x2a, 0x10, 0x05, 0x70, 0x0c, 0xdd, 0x24, 0xee, 0xc0, 0xa6, 0x4e, 0x65, 0x8a, + 0x2b, 0x5c, 0x4d, 0xab, 0x70, 0xdb, 0x97, 0x0c, 0xf7, 0x57, 0xb0, 0xe4, 0x60, 0x09, 0x18, 0xdd, + 0x87, 0x45, 0x49, 0x77, 0xc8, 0x54, 0x29, 0xaf, 0xe4, 0xaf, 0xcd, 0x36, 0x5e, 0x1a, 0x1e, 0x2d, + 0x2f, 0x36, 0x93, 0x18, 0x70, 0xb2, 0x1c, 0xda, 0x83, 0x4b, 0x09, 0x6e, 0xdc, 0xa4, 0x1d, 0x83, + 0xb4, 0x0f, 0xfb, 0xb4, 0x32, 0xcd, 0xe3, 0xf0, 0x39, 0x61, 0xd6, 0xa5, 0xe6, 0x31, 0xbc, 0xf8, + 0x58, 0x24, 0x74, 0x2f, 0x12, 0x99, 0x3b, 0x96, 0xb9, 0x6b, 0xe8, 0x15, 0xe0, 0xf0, 0x49, 0xae, + 0xf6, 0x18, 0xf0, 0xa8, 0x8c, 0xfa, 0x73, 0x05, 0xce, 0xf3, 0xe7, 0x46, 0xd7, 0xda, 0x09, 0x8e, + 0x8a, 0x83, 0xd6, 0x61, 0x96, 0xbb, 0x75, 0xd3, 0x70, 0x1c, 0xc3, 0xd4, 0xf9, 0x21, 0x29, 0x37, + 0x2e, 0x08, 0xec, 0xd9, 0x96, 0x44, 0xc3, 0x11, 0x4e, 0xa4, 0x42, 0xa9, 0xeb, 0xed, 0x14, 0x65, + 0x25, 0xcf, 0x72, 0xc8, 0xf0, 0x68, 0xb9, 0x24, 0x62, 0x2d, 0x28, 0x8c, 0x47, 0xf3, 0x6c, 0xf6, + 0x4e, 0x33, 0xe7, 0x11, 0x46, 0x0a, 0x8a, 0xfa, 0xa7, 0x3c, 0xcc, 0x73, 0x35, 0xad, 0x5e, 0xdf, + 0xb2, 0xdd, 0xed, 0x3e, 0xd5, 0xd0, 0x5d, 0x28, 0xec, 0xda, 0x56, 0x4f, 0x64, 0x9c, 0xcb, 0xd2, + 0x91, 0xad, 0xb1, 0x32, 0x11, 0xe6, 0x97, 0xe0, 0x4d, 0xc2, 0x0c, 0xf8, 0x75, 0xdb, 0xea, 0x61, + 0x2e, 0x8e, 0xde, 0x84, 0x9c, 0x6b, 0x71, 0xd5, 0x33, 0x6b, 0xd7, 0x92, 0x40, 0x36, 0x2c, 0x8d, + 0x74, 0xe3, 0x48, 0x25, 0x96, 0x08, 0xdb, 0x16, 0xce, 0xb9, 0x16, 0xea, 0x32, 0xf7, 0x30, 0xb3, + 0xb6, 0xac, 0xae, 0xa1, 0x1d, 0x8a, 0x1c, 0xb2, 0x96, 0x62, 0x8f, 0xb6, 0x89, 0xde, 0x92, 0x24, + 0x65, 0x97, 0x86, 0xab, 0x38, 0x82, 0x8e, 0xde, 0x85, 0x79, 0xdb, 0x37, 0x43, 0x28, 0x2c, 0x72, + 0x85, 0xaf, 0xa5, 0x53, 0x88, 0xa3, 0xc2, 0x8d, 0x17, 0x85, 0xce, 0xf9, 0x18, 0x01, 0xc7, 0xd5, + 0xa0, 0xdb, 0x30, 0x6f, 0x98, 0x5a, 0x77, 0xd0, 0x09, 0x93, 0x49, 0x81, 0xef, 0x84, 0x00, 0xa2, + 0x15, 0x25, 0xe3, 0x38, 0xbf, 0xfa, 0x57, 0x05, 0x16, 0xe4, 0x38, 0xba, 0xc4, 0x1d, 0x38, 0xa8, + 0x0d, 0x25, 0x87, 0xff, 0x12, 0xb1, 0xbc, 0x9e, 0xae, 0x7a, 0x78, 0xd2, 0x8d, 0x39, 0xa1, 0xbd, + 0xe4, 0x3d, 0x63, 0x81, 0x85, 0x5a, 0x50, 0xe4, 0xef, 0x1d, 0xc4, 0x36, 0x65, 0xce, 0x68, 0x4c, + 0x0f, 0x8f, 0x96, 0xbd, 0xca, 0x86, 0x3d, 0x04, 0xbf, 0x4a, 0xe6, 0x93, 0xab, 0xa4, 0xfa, 0x9e, + 0x02, 0x10, 0xa6, 0xac, 0xa0, 0xea, 0x2a, 0x63, 0xab, 0xee, 0x15, 0x28, 0x38, 0xc6, 0x63, 0xcf, + 0xb2, 0x7c, 0x58, 0xc3, 0xb9, 0xf8, 0xb6, 0xf1, 0x98, 0x62, 0x4e, 0x66, 0xf5, 0xbe, 0x17, 0xe4, + 0x8b, 0x7c, 0xb4, 0xde, 0x87, 0xc9, 0x21, 0xe4, 0x51, 0x3b, 0x30, 0x17, 0xda, 0xd1, 0x64, 0x85, + 0xe6, 0x15, 0xa1, 0x49, 0xe1, 0x9a, 0xce, 0x3e, 0x53, 0x4b, 0x2e, 0x85, 0x96, 0xdf, 0x29, 0x30, + 0xed, 0xa9, 0x31, 0x1c, 0x17, 0x3d, 0x1a, 0x29, 0xfe, 0xb5, 0x74, 0xe1, 0x63, 0xd2, 0xbc, 0xf4, + 0x07, 0x2d, 0x8f, 0xbf, 0x22, 0x15, 0xfe, 0x4d, 0x28, 0x1a, 0x2e, 0xed, 0x39, 0x95, 0x1c, 0x4f, + 0xfc, 0xe9, 0x83, 0x78, 0x56, 0x80, 0x16, 0x5b, 0x4c, 0x1c, 0x7b, 0x28, 0xea, 0xba, 0xd8, 0x7e, + 0x1b, 0x96, 0xb5, 0x3f, 0xe8, 0x8b, 0x7d, 0x7d, 0x19, 0x8a, 0x5d, 0x76, 0xc6, 0x45, 0x5e, 0x0b, + 0x24, 0xf9, 0xc1, 0xc7, 0x1e, 0x4d, 0xfd, 0x75, 0x49, 0xf8, 0x36, 0x48, 0xf1, 0x13, 0x68, 0x7b, + 0x56, 0xa0, 0xe0, 0x86, 0x51, 0x09, 0x76, 0x12, 0x0f, 0x08, 0xa7, 0xa0, 0x2b, 0x30, 0xa5, 0x59, + 0xa6, 0x4b, 0x4d, 0x97, 0x5b, 0x3f, 0xdb, 0x98, 0x19, 0x1e, 0x2d, 0x4f, 0xdd, 0xf1, 0x96, 0xb0, + 0x4f, 0x43, 0x06, 0x80, 0x66, 0x99, 0x1d, 0xc3, 0x35, 0x2c, 0xd3, 0xa9, 0x14, 0xb8, 0x2f, 0xd3, + 0xe4, 0x8b, 0xe0, 0x65, 0xef, 0xf8, 0xd2, 0xa1, 0xc5, 0xc1, 0x92, 0x83, 0x25, 0x70, 0xf4, 0x55, + 0x38, 0xcb, 0xc5, 0x5b, 0x1d, 0x6a, 0xba, 0x86, 0x7b, 0x28, 0x1a, 0x8e, 0x45, 0x21, 0x76, 0xb6, + 0x25, 0x13, 0x71, 0x94, 0x17, 0xfd, 0x10, 0x66, 0x59, 0x4d, 0xa6, 0x9d, 0x3b, 0x5d, 0x62, 0xf4, + 0xfc, 0xfe, 0xe2, 0x4e, 0xe6, 0x72, 0xcf, 0x0d, 0xf7, 0x51, 0xee, 0x9a, 0xae, 0x2d, 0xe5, 0x56, + 0x99, 0x84, 0x23, 0xea, 0xd0, 0xdb, 0x30, 0xa5, 0xd9, 0x94, 0x35, 0xee, 0x95, 0x29, 0x1e, 0xd0, + 0x2f, 0xa4, 0x0b, 0x68, 0xdb, 0xe8, 0x51, 0xe1, 0x79, 0x4f, 0x1c, 0xfb, 0x38, 0xec, 0x78, 0x18, + 0x8e, 0x33, 0xa0, 0x9d, 0xc6, 0x61, 0xa5, 0x9c, 0xba, 0x30, 0x04, 0x2f, 0xd2, 0x62, 0xb2, 0x76, + 0x63, 0x96, 0x1d, 0x8f, 0x96, 0xc0, 0xc1, 0x01, 0x22, 0xfa, 0x8e, 0x8f, 0xde, 0xb6, 0x78, 0x43, + 0x31, 0xb3, 0xf6, 0xe5, 0x2c, 0xe8, 0xdb, 0x03, 0xbe, 0xeb, 0x64, 0xf8, 0xb6, 0x85, 0x03, 0xc8, + 0xea, 0x1b, 0xb0, 0x30, 0xe2, 0x48, 0x74, 0x0e, 0xf2, 0xfb, 0x54, 0x8c, 0x2b, 0x98, 0xfd, 0x44, + 0x17, 0xa0, 0x78, 0x40, 0xba, 0x03, 0xb1, 0x4f, 0xb1, 0xf7, 0x70, 0x2b, 0xb7, 0xae, 0xa8, 0xbf, + 0xc8, 0xc1, 0x8c, 0x17, 0x19, 0xd7, 0xa6, 0xa4, 0x37, 0x81, 0x23, 0xd3, 0x86, 0x82, 0xd3, 0xa7, + 0x9a, 0x48, 0xfa, 0x6b, 0xa9, 0x77, 0x0e, 0xb7, 0x8f, 0xf5, 0x15, 0xe1, 0x31, 0x63, 0x4f, 0x98, + 0xa3, 0xa1, 0x47, 0x41, 0x85, 0xf2, 0x8a, 0xfb, 0x8d, 0x8c, 0xb8, 0xc7, 0x56, 0x2a, 0xf5, 0x0f, + 0x0a, 0x9c, 0x93, 0xb8, 0x27, 0x35, 0x54, 0x6d, 0x9e, 0xb4, 0x40, 0x86, 0xb9, 0x55, 0x2a, 0x92, + 0xea, 0x6f, 0x72, 0x22, 0xb9, 0xfa, 0x6f, 0xc1, 0x2a, 0xfc, 0x04, 0x5e, 0xe3, 0x61, 0x24, 0xe2, + 0xeb, 0xd9, 0x22, 0x13, 0xf6, 0x93, 0x89, 0x71, 0xdf, 0x89, 0xc5, 0xfd, 0xd6, 0x89, 0xd0, 0x8f, + 0x8f, 0xfe, 0x8f, 0x73, 0xb0, 0x98, 0x68, 0x11, 0xba, 0x0a, 0x25, 0xaf, 0xf5, 0xe3, 0x9e, 0x2b, + 0x87, 0x08, 0x1e, 0x0f, 0x16, 0x54, 0xa4, 0x03, 0xd8, 0xb4, 0x6f, 0x39, 0x86, 0x6b, 0xd9, 0x87, + 0xc2, 0x0f, 0x5f, 0x49, 0x61, 0x29, 0x0e, 0x84, 0x24, 0x37, 0xcc, 0x31, 0x47, 0x87, 0x14, 0x2c, + 0x41, 0xa3, 0x87, 0xcc, 0x20, 0xa2, 0x53, 0xe6, 0x8e, 0x7c, 0x96, 0xe3, 0x25, 0xe3, 0x87, 0x2f, + 0xc1, 0x90, 0xb0, 0x40, 0x54, 0x7f, 0x9b, 0x83, 0x17, 0xc7, 0xb8, 0x0e, 0xe1, 0x88, 0x23, 0x58, + 0x87, 0x91, 0x29, 0x0c, 0xde, 0x48, 0x11, 0x73, 0x9a, 0x91, 0xe0, 0xb4, 0x9b, 0x27, 0x71, 0x9a, + 0x88, 0xee, 0x31, 0x6e, 0x7b, 0x14, 0x73, 0xdb, 0x8d, 0x8c, 0x6e, 0x8b, 0xed, 0x9f, 0x98, 0xe3, + 0x3e, 0x2c, 0x44, 0xce, 0x9d, 0x18, 0x9b, 0x4f, 0xff, 0xdc, 0x75, 0xa0, 0xb8, 0xd3, 0xb5, 0x76, + 0xfc, 0xd6, 0xec, 0x8d, 0x6c, 0x31, 0xf1, 0xcc, 0xac, 0xb1, 0x49, 0x53, 0x14, 0xe8, 0x20, 0xab, + 0xf0, 0x35, 0xec, 0x81, 0xa3, 0xbd, 0x98, 0xef, 0xde, 0x3c, 0x91, 0x1a, 0xcf, 0x65, 0x9e, 0x9e, + 0x31, 0x7e, 0xac, 0xee, 0x03, 0x84, 0xd6, 0x24, 0x54, 0xb9, 0x7b, 0x72, 0x95, 0xcb, 0x70, 0x07, + 0x11, 0x34, 0xe3, 0x52, 0x61, 0xac, 0x7e, 0x5f, 0xd4, 0xc5, 0xb1, 0xda, 0x36, 0xa2, 0xda, 0x5e, + 0x4f, 0x9d, 0x9c, 0x23, 0xa3, 0xbb, 0x5c, 0x8b, 0xff, 0xa8, 0x88, 0x19, 0x5a, 0x78, 0xe6, 0xf4, + 0x9b, 0xf7, 0xed, 0x68, 0xf3, 0x9e, 0xf5, 0xd4, 0x26, 0xb7, 0xf0, 0xff, 0x50, 0x00, 0x49, 0x5c, + 0x9b, 0xa4, 0xdf, 0x37, 0x4c, 0xfd, 0xff, 0xae, 0x5c, 0x3e, 0x6b, 0xa6, 0xfc, 0x55, 0x2e, 0x12, + 0x2d, 0x5e, 0x0f, 0x4c, 0x98, 0xed, 0x4a, 0x83, 0x4b, 0xd6, 0x5e, 0x44, 0x1e, 0x7a, 0xc2, 0x76, + 0x58, 0x5e, 0xc5, 0x11, 0x7c, 0xb4, 0x1d, 0xb9, 0x13, 0x0b, 0x93, 0x9b, 0x98, 0x6c, 0x5f, 0x16, + 0x10, 0x8b, 0xcd, 0x24, 0x26, 0x9c, 0x2c, 0x8b, 0xde, 0x86, 0x82, 0x4b, 0x74, 0x7f, 0x4f, 0xd4, + 0x33, 0x5e, 0x5a, 0x48, 0x43, 0x10, 0xd1, 0x1d, 0xcc, 0xa1, 0xd4, 0x5f, 0x46, 0x3b, 0x0f, 0x51, + 0x34, 0x4e, 0xc5, 0x7a, 0x0a, 0x17, 0xfb, 0x83, 0x9d, 0xae, 0xa1, 0x25, 0x4a, 0x89, 0x68, 0x5e, + 0x16, 0xd0, 0x17, 0xb7, 0xc6, 0xb3, 0xe2, 0xe3, 0x70, 0xd0, 0x83, 0x88, 0x93, 0xd2, 0x44, 0xf8, + 0x2d, 0xd2, 0xa3, 0x9d, 0x36, 0xd1, 0xef, 0x1e, 0x50, 0xd3, 0x65, 0x67, 0x31, 0xd1, 0x53, 0x1f, + 0x14, 0xfc, 0x29, 0x96, 0x7b, 0xaa, 0x4d, 0x26, 0x71, 0x70, 0xbe, 0xe1, 0xed, 0x74, 0xef, 0xd8, + 0x64, 0x0e, 0xf8, 0x54, 0xe4, 0x83, 0xc4, 0x1a, 0x80, 0xf8, 0xb8, 0x62, 0x58, 0x26, 0x77, 0x77, + 0x3e, 0xd4, 0x7e, 0x2f, 0xa0, 0x60, 0x89, 0x6b, 0xe4, 0xd8, 0x94, 0x4e, 0xf9, 0xd8, 0xec, 0x25, + 0x0c, 0xdb, 0x37, 0xd2, 0xbd, 0x36, 0x8f, 0x5e, 0xfa, 0x59, 0x3b, 0x48, 0x49, 0xc5, 0xe7, 0xd2, + 0xc1, 0xff, 0x39, 0x9a, 0x5a, 0xdb, 0x44, 0x9f, 0x40, 0x91, 0x78, 0x10, 0x2d, 0x12, 0xab, 0xd9, + 0x8a, 0x44, 0x9b, 0xe8, 0x63, 0xea, 0xc4, 0xa7, 0x39, 0x28, 0x73, 0xc6, 0xc9, 0x6c, 0xf2, 0xcd, + 0xc8, 0x14, 0x92, 0x79, 0x97, 0x97, 0x63, 0x83, 0xc7, 0xb7, 0x4f, 0x30, 0x70, 0x8e, 0xa6, 0x00, + 0x38, 0xee, 0x5a, 0xb4, 0xf0, 0x9f, 0x5e, 0x8b, 0xaa, 0xbf, 0x57, 0x60, 0xd6, 0x77, 0xf1, 0x04, + 0x76, 0xca, 0x56, 0x74, 0xa7, 0x7c, 0x31, 0xad, 0xe5, 0xe3, 0xf7, 0xc8, 0x3f, 0x15, 0x58, 0x18, + 0xf1, 0x9a, 0x5f, 0x99, 0x95, 0x31, 0xdf, 0x44, 0x4f, 0x60, 0x86, 0x0f, 0x9f, 0x6c, 0x46, 0x2c, + 0x61, 0xe4, 0x4f, 0x2f, 0x61, 0xa8, 0xef, 0xe7, 0xe1, 0x42, 0xd2, 0xd4, 0xf7, 0xbc, 0x3e, 0xa6, + 0xc4, 0x3f, 0x85, 0xe4, 0x26, 0xfd, 0x29, 0xa4, 0xf0, 0x5f, 0xfb, 0x14, 0x92, 0xcf, 0xf8, 0x29, + 0xe4, 0xfd, 0x1c, 0xbc, 0x90, 0x3c, 0x4b, 0x9e, 0xd2, 0xf7, 0x90, 0x70, 0x0a, 0xcd, 0x3d, 0xff, + 0x29, 0x14, 0xdd, 0x82, 0x39, 0xd2, 0xf1, 0xb6, 0x19, 0xe9, 0xb2, 0x8e, 0x83, 0xef, 0xe3, 0xe9, + 0x06, 0x1a, 0x1e, 0x2d, 0xcf, 0xdd, 0x8e, 0x50, 0x70, 0x8c, 0x53, 0xfd, 0x38, 0x0f, 0x68, 0xf4, + 0xa6, 0x19, 0xdd, 0x12, 0xb7, 0xdf, 0xde, 0x41, 0xbc, 0x2a, 0xdf, 0x7e, 0x7f, 0x76, 0xb4, 0xfc, + 0xc2, 0xa8, 0x84, 0x74, 0x2f, 0xbe, 0x11, 0xb8, 0xd0, 0xbb, 0x3b, 0xbf, 0x11, 0x75, 0xca, 0x67, + 0x47, 0xcb, 0x09, 0x7f, 0x2b, 0xa9, 0x05, 0x48, 0x31, 0xd7, 0xe9, 0x70, 0xb6, 0x4b, 0x1c, 0x77, + 0xcb, 0xb6, 0x76, 0x68, 0xdb, 0x10, 0x7f, 0xa8, 0xc8, 0x76, 0x3b, 0x1c, 0xdc, 0x7f, 0x6f, 0xc8, + 0x40, 0x38, 0x8a, 0x8b, 0x0e, 0x00, 0xb1, 0x85, 0xb6, 0x4d, 0x4c, 0xc7, 0x7b, 0x25, 0xa6, 0xad, + 0x90, 0x59, 0x5b, 0x55, 0x68, 0x43, 0x1b, 0x23, 0x68, 0x38, 0x41, 0x03, 0xba, 0x0a, 0x25, 0x9b, + 0x12, 0xc7, 0x32, 0xc5, 0x6d, 0x7d, 0x10, 0x65, 0xcc, 0x57, 0xb1, 0xa0, 0xa2, 0xcf, 0xc3, 0x54, + 0x8f, 0x3a, 0x0e, 0x2b, 0x1f, 0x25, 0xce, 0x38, 0x2f, 0x18, 0xa7, 0x36, 0xbd, 0x65, 0xec, 0xd3, + 0xd5, 0xf7, 0x14, 0x08, 0x43, 0xc4, 0x3b, 0x33, 0x43, 0xbb, 0xeb, 0xdd, 0xf2, 0xaf, 0xc3, 0xac, + 0x65, 0xeb, 0xc4, 0x34, 0x1e, 0x7b, 0x6d, 0x9c, 0x17, 0xe0, 0xe0, 0xc4, 0xdf, 0x97, 0x68, 0x38, + 0xc2, 0xc9, 0xda, 0x3f, 0xcd, 0xea, 0xf5, 0x2c, 0x93, 0x65, 0x6d, 0x11, 0x5a, 0x29, 0xe7, 0xf9, + 0x14, 0x2c, 0x71, 0xa9, 0x1f, 0x2a, 0x30, 0x1f, 0xbb, 0x4f, 0x47, 0x3f, 0x53, 0xe0, 0x05, 0x27, + 0xd1, 0x38, 0x71, 0xe4, 0x6e, 0x66, 0xb9, 0x46, 0x8f, 0x00, 0x34, 0x96, 0x84, 0x3d, 0x63, 0xde, + 0x1e, 0x8f, 0x51, 0xac, 0xfe, 0x4d, 0x81, 0x73, 0xf1, 0x9b, 0xf9, 0xff, 0x45, 0x43, 0xd1, 0x6b, + 0x30, 0xe3, 0xcd, 0x2e, 0xdf, 0xa4, 0x87, 0xad, 0xa6, 0x88, 0xc2, 0x79, 0x01, 0x36, 0xb3, 0x15, + 0x92, 0xb0, 0xcc, 0xa7, 0xfe, 0x24, 0x07, 0x65, 0xbf, 0x62, 0xa1, 0x6f, 0x85, 0x5f, 0x5a, 0x94, + 0xcc, 0xbb, 0x3b, 0xd8, 0x74, 0x23, 0x5f, 0x5b, 0x9e, 0xff, 0xff, 0x84, 0x2e, 0xfb, 0xed, 0x92, + 0x37, 0xda, 0x25, 0xcf, 0xf2, 0xd1, 0xa9, 0xa4, 0x90, 0x66, 0x2a, 0x51, 0x3f, 0xc8, 0xc3, 0xc2, + 0x48, 0x01, 0x47, 0x37, 0x23, 0x39, 0xef, 0x4a, 0x2c, 0xe7, 0x2d, 0x8e, 0x08, 0x9c, 0x5a, 0xca, + 0x4b, 0xce, 0x44, 0xf9, 0x09, 0x66, 0xa2, 0x42, 0xda, 0x4c, 0x54, 0x3c, 0x3e, 0x13, 0xc5, 0xa2, + 0x53, 0x4a, 0x15, 0x9d, 0x3e, 0xcc, 0xc7, 0x3a, 0x12, 0x74, 0x1d, 0xca, 0x86, 0xe9, 0x50, 0x6d, + 0x60, 0x53, 0x71, 0x1f, 0x1f, 0x34, 0xab, 0x2d, 0xb1, 0x8e, 0x03, 0x0e, 0x54, 0x87, 0x69, 0x47, + 0xdb, 0xa3, 0x9d, 0x41, 0x97, 0x76, 0x78, 0x40, 0xca, 0xe1, 0x57, 0xf5, 0x6d, 0x9f, 0x80, 0x43, + 0x1e, 0xf5, 0x5f, 0x05, 0x98, 0x95, 0x7b, 0x92, 0x14, 0x7f, 0x23, 0x78, 0x07, 0x66, 0x88, 0x69, + 0x5a, 0x2e, 0xf1, 0x1a, 0xc7, 0x5c, 0xea, 0x0b, 0x52, 0x59, 0x4f, 0xed, 0x76, 0x08, 0xe1, 0x5d, + 0x90, 0x06, 0x47, 0x59, 0xa2, 0x60, 0x59, 0x13, 0xba, 0x2d, 0xba, 0xc5, 0x7c, 0xfa, 0x6e, 0xb1, + 0x1c, 0xeb, 0x14, 0xeb, 0x30, 0x1d, 0x34, 0x55, 0xe2, 0x6f, 0x24, 0x81, 0x7f, 0xc2, 0x33, 0x19, + 0xf2, 0xa0, 0x5a, 0x24, 0x8a, 0x45, 0x1e, 0xc5, 0xb9, 0x63, 0xa6, 0xfe, 0x78, 0x2b, 0x5a, 0x9a, + 0x74, 0x2b, 0x3a, 0x35, 0x91, 0x56, 0xb4, 0xfa, 0x35, 0x38, 0x17, 0x8f, 0x60, 0xa6, 0x4f, 0xb4, + 0x5b, 0x80, 0x46, 0xf5, 0x3f, 0xab, 0xf7, 0x1a, 0x95, 0x08, 0x13, 0x51, 0xe3, 0xda, 0x93, 0xa7, + 0x4b, 0x67, 0x3e, 0x7a, 0xba, 0x74, 0xe6, 0x93, 0xa7, 0x4b, 0x67, 0x7e, 0x34, 0x5c, 0x52, 0x9e, + 0x0c, 0x97, 0x94, 0x8f, 0x86, 0x4b, 0xca, 0x27, 0xc3, 0x25, 0xe5, 0xd3, 0xe1, 0x92, 0xf2, 0xd3, + 0xbf, 0x2f, 0x9d, 0x79, 0x98, 0x3b, 0x58, 0xfd, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x39, 0xdb, + 0xfe, 0xb3, 0x60, 0x2c, 0x00, 0x00, } func (m *DockerImageReference) Marshal() (dAtA []byte, err error) { @@ -2460,6 +2522,122 @@ func (m *ImageStreamTagList) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ImageTag) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ImageTag) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ImageTag) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Image != nil { + { + size, err := m.Image.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + if m.Status != nil { + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if m.Spec != nil { + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ImageTagList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ImageTagList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ImageTagList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *NamedTagEventList) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -3522,6 +3700,46 @@ func (m *ImageStreamTagList) Size() (n int) { return n } +func (m *ImageTag) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if m.Spec != nil { + l = m.Spec.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Status != nil { + l = m.Status.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Image != nil { + l = m.Image.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *ImageTagList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + func (m *NamedTagEventList) Size() (n int) { if m == nil { return 0 @@ -4099,6 +4317,35 @@ func (this *ImageStreamTagList) String() string { }, "") return s } +func (this *ImageTag) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ImageTag{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(this.Spec.String(), "TagReference", "TagReference", 1) + `,`, + `Status:` + strings.Replace(this.Status.String(), "NamedTagEventList", "NamedTagEventList", 1) + `,`, + `Image:` + strings.Replace(this.Image.String(), "Image", "Image", 1) + `,`, + `}`, + }, "") + return s +} +func (this *ImageTagList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]ImageTag{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "ImageTag", "ImageTag", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&ImageTagList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} func (this *NamedTagEventList) String() string { if this == nil { return "nil" @@ -8264,6 +8511,320 @@ func (m *ImageStreamTagList) Unmarshal(dAtA []byte) error { } return nil } +func (m *ImageTag) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ImageTag: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ImageTag: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Spec == nil { + m.Spec = &TagReference{} + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Status == nil { + m.Status = &NamedTagEventList{} + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Image", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Image == nil { + m.Image = &Image{} + } + if err := m.Image.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ImageTagList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ImageTagList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ImageTagList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, ImageTag{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *NamedTagEventList) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/vendor/github.com/openshift/api/image/v1/generated.proto b/vendor/github.com/openshift/api/image/v1/generated.proto index a7fc47953..69ed48e89 100644 --- a/vendor/github.com/openshift/api/image/v1/generated.proto +++ b/vendor/github.com/openshift/api/image/v1/generated.proto @@ -406,6 +406,43 @@ message ImageStreamTagList { repeated ImageStreamTag items = 2; } +// ImageTag represents a single tag within an image stream and includes the spec, +// the status history, and the currently referenced image (if any) of the provided +// tag. This type replaces the ImageStreamTag by providing a full view of the tag. +// ImageTags are returned for every spec or status tag present on the image stream. +// If no tag exists in either form a not found error will be returned by the API. +// A create operation will succeed if no spec tag has already been defined and the +// spec field is set. Delete will remove both spec and status elements from the +// image stream. +message ImageTag { + optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // spec is the spec tag associated with this image stream tag, and it may be null + // if only pushes have occurred to this image stream. + optional TagReference spec = 2; + + // status is the status tag details associated with this image stream tag, and it + // may be null if no push or import has been performed. + optional NamedTagEventList status = 3; + + // image is the details of the most recent image stream status tag, and it may be + // null if import has not completed or an administrator has deleted the image + // object. To verify this is the most recent image, you must verify the generation + // of the most recent status.items entry matches the spec tag (if a spec tag is + // set). This field will not be set when listing image tags. + optional Image image = 4; +} + +// ImageTagList is a list of ImageTag objects. When listing image tags, the image +// field is not populated. Tags are returned in alphabetical order by image stream +// and then tag. +message ImageTagList { + optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // Items is the list of image stream tags + repeated ImageTag items = 2; +} + // NamedTagEventList relates a tag to its image history. message NamedTagEventList { // Tag is the tag for which the history is recorded diff --git a/vendor/github.com/openshift/api/image/v1/register.go b/vendor/github.com/openshift/api/image/v1/register.go index 46f785c47..fc0910c24 100644 --- a/vendor/github.com/openshift/api/image/v1/register.go +++ b/vendor/github.com/openshift/api/image/v1/register.go @@ -45,6 +45,8 @@ func addKnownTypes(scheme *runtime.Scheme) error { &ImageStreamImage{}, &ImageStreamLayers{}, &ImageStreamImport{}, + &ImageTag{}, + &ImageTagList{}, &corev1.SecretList{}, ) metav1.AddToGroupVersion(scheme, GroupVersion) diff --git a/vendor/github.com/openshift/api/image/v1/types.go b/vendor/github.com/openshift/api/image/v1/types.go index b2e215672..c29cad9b2 100644 --- a/vendor/github.com/openshift/api/image/v1/types.go +++ b/vendor/github.com/openshift/api/image/v1/types.go @@ -416,6 +416,49 @@ type ImageStreamTagList struct { Items []ImageStreamTag `json:"items" protobuf:"bytes,2,rep,name=items"` } +// +genclient +// +genclient:onlyVerbs=get,list,create,update,delete +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImageTag represents a single tag within an image stream and includes the spec, +// the status history, and the currently referenced image (if any) of the provided +// tag. This type replaces the ImageStreamTag by providing a full view of the tag. +// ImageTags are returned for every spec or status tag present on the image stream. +// If no tag exists in either form a not found error will be returned by the API. +// A create operation will succeed if no spec tag has already been defined and the +// spec field is set. Delete will remove both spec and status elements from the +// image stream. +type ImageTag struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // spec is the spec tag associated with this image stream tag, and it may be null + // if only pushes have occurred to this image stream. + Spec *TagReference `json:"spec" protobuf:"bytes,2,opt,name=spec"` + // status is the status tag details associated with this image stream tag, and it + // may be null if no push or import has been performed. + Status *NamedTagEventList `json:"status" protobuf:"bytes,3,opt,name=status"` + // image is the details of the most recent image stream status tag, and it may be + // null if import has not completed or an administrator has deleted the image + // object. To verify this is the most recent image, you must verify the generation + // of the most recent status.items entry matches the spec tag (if a spec tag is + // set). This field will not be set when listing image tags. + Image *Image `json:"image" protobuf:"bytes,4,opt,name=image"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// ImageTagList is a list of ImageTag objects. When listing image tags, the image +// field is not populated. Tags are returned in alphabetical order by image stream +// and then tag. +type ImageTagList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // Items is the list of image stream tags + Items []ImageTag `json:"items" protobuf:"bytes,2,rep,name=items"` +} + // +genclient // +genclient:onlyVerbs=get // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/vendor/github.com/openshift/api/image/v1/zz_generated.deepcopy.go b/vendor/github.com/openshift/api/image/v1/zz_generated.deepcopy.go index c0877d67e..aab466482 100644 --- a/vendor/github.com/openshift/api/image/v1/zz_generated.deepcopy.go +++ b/vendor/github.com/openshift/api/image/v1/zz_generated.deepcopy.go @@ -656,6 +656,80 @@ func (in *ImageStreamTagList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImageTag) DeepCopyInto(out *ImageTag) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + if in.Spec != nil { + in, out := &in.Spec, &out.Spec + *out = new(TagReference) + (*in).DeepCopyInto(*out) + } + if in.Status != nil { + in, out := &in.Status, &out.Status + *out = new(NamedTagEventList) + (*in).DeepCopyInto(*out) + } + if in.Image != nil { + in, out := &in.Image, &out.Image + *out = new(Image) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageTag. +func (in *ImageTag) DeepCopy() *ImageTag { + if in == nil { + return nil + } + out := new(ImageTag) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ImageTag) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImageTagList) DeepCopyInto(out *ImageTagList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]ImageTag, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageTagList. +func (in *ImageTagList) DeepCopy() *ImageTagList { + if in == nil { + return nil + } + out := new(ImageTagList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ImageTagList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *NamedTagEventList) DeepCopyInto(out *NamedTagEventList) { *out = *in diff --git a/vendor/github.com/openshift/api/image/v1/zz_generated.swagger_doc_generated.go b/vendor/github.com/openshift/api/image/v1/zz_generated.swagger_doc_generated.go index d5f52003a..a50ffbbc5 100644 --- a/vendor/github.com/openshift/api/image/v1/zz_generated.swagger_doc_generated.go +++ b/vendor/github.com/openshift/api/image/v1/zz_generated.swagger_doc_generated.go @@ -255,6 +255,26 @@ func (ImageStreamTagList) SwaggerDoc() map[string]string { return map_ImageStreamTagList } +var map_ImageTag = map[string]string{ + "": "ImageTag represents a single tag within an image stream and includes the spec, the status history, and the currently referenced image (if any) of the provided tag. This type replaces the ImageStreamTag by providing a full view of the tag. ImageTags are returned for every spec or status tag present on the image stream. If no tag exists in either form a not found error will be returned by the API. A create operation will succeed if no spec tag has already been defined and the spec field is set. Delete will remove both spec and status elements from the image stream.", + "spec": "spec is the spec tag associated with this image stream tag, and it may be null if only pushes have occurred to this image stream.", + "status": "status is the status tag details associated with this image stream tag, and it may be null if no push or import has been performed.", + "image": "image is the details of the most recent image stream status tag, and it may be null if import has not completed or an administrator has deleted the image object. To verify this is the most recent image, you must verify the generation of the most recent status.items entry matches the spec tag (if a spec tag is set). This field will not be set when listing image tags.", +} + +func (ImageTag) SwaggerDoc() map[string]string { + return map_ImageTag +} + +var map_ImageTagList = map[string]string{ + "": "ImageTagList is a list of ImageTag objects. When listing image tags, the image field is not populated. Tags are returned in alphabetical order by image stream and then tag.", + "items": "Items is the list of image stream tags", +} + +func (ImageTagList) SwaggerDoc() map[string]string { + return map_ImageTagList +} + var map_NamedTagEventList = map[string]string{ "": "NamedTagEventList relates a tag to its image history.", "tag": "Tag is the tag for which the history is recorded", diff --git a/vendor/github.com/openshift/api/imageregistry/v1/00-crd.yaml b/vendor/github.com/openshift/api/imageregistry/v1/00-crd.yaml index f034bbaf8..801a20bae 100644 --- a/vendor/github.com/openshift/api/imageregistry/v1/00-crd.yaml +++ b/vendor/github.com/openshift/api/imageregistry/v1/00-crd.yaml @@ -156,7 +156,7 @@ spec: type: string rolloutStrategy: description: rolloutStrategy defines rollout strategy for the image - registry deployment. Valid values are RollingUpdate (default) and Recreate. + registry deployment. type: string pattern: ^(RollingUpdate|Recreate)$ routes: diff --git a/vendor/github.com/openshift/api/imageregistry/v1/types.go b/vendor/github.com/openshift/api/imageregistry/v1/types.go index cdb7b9ff1..6c8eb0b7b 100644 --- a/vendor/github.com/openshift/api/imageregistry/v1/types.go +++ b/vendor/github.com/openshift/api/imageregistry/v1/types.go @@ -86,7 +86,7 @@ type ImageRegistrySpec struct { // deployment. // +optional // +kubebuilder:validation:Pattern=`^(RollingUpdate|Recreate)$` - RolloutStrategy string `json:"rolloutStrategy" protobuf:"bytes,15,opt,name=rolloutStrategy"` + RolloutStrategy string `json:"rolloutStrategy,omitempty" protobuf:"bytes,15,opt,name=rolloutStrategy"` } // ImageRegistryStatus reports image registry operational status. diff --git a/vendor/github.com/openshift/api/operator/v1/0000_50_cluster-authentication-operator_01_config.crd.yaml b/vendor/github.com/openshift/api/operator/v1/0000_50_cluster-authentication-operator_01_config.crd.yaml index 7f604fa82..b983e32ad 100644 --- a/vendor/github.com/openshift/api/operator/v1/0000_50_cluster-authentication-operator_01_config.crd.yaml +++ b/vendor/github.com/openshift/api/operator/v1/0000_50_cluster-authentication-operator_01_config.crd.yaml @@ -120,6 +120,13 @@ spec: description: resource is the resource type of the thing you're tracking type: string + managingOAuthAPIServer: + description: ManagingOAuthAPIServer indicates whether this operator + is managing OAuth related APIs. Setting this field to true will cause + OAS-O to step down. Note that this field will be removed in the future + releases, once https://github.com/openshift/enhancements/blob/master/enhancements/authentication/separate-oauth-resources.md + is fully implemented + type: boolean observedGeneration: description: observedGeneration is the last generation change you've dealt with diff --git a/vendor/github.com/openshift/api/operator/v1/0000_50_ingress-operator_00-custom-resource-definition.yaml b/vendor/github.com/openshift/api/operator/v1/0000_50_ingress-operator_00-custom-resource-definition.yaml index d6dff5c30..512d0f4ca 100644 --- a/vendor/github.com/openshift/api/operator/v1/0000_50_ingress-operator_00-custom-resource-definition.yaml +++ b/vendor/github.com/openshift/api/operator/v1/0000_50_ingress-operator_00-custom-resource-definition.yaml @@ -287,6 +287,21 @@ spec: If unset, defaults to 2. type: integer format: int32 + routeAdmission: + description: "routeAdmission defines a policy for handling new route + claims (for example, to allow or deny claims across namespaces). \n + The empty, defaults will be applied. See specific routeAdmission fields + for details about their defaults." + type: object + properties: + namespaceOwnership: + description: "namespaceOwnership describes how host name claims + across namespaces should be handled. \n Value must be one of: + \n - Strict: Do not allow routes in different namespaces to claim + the same host. \n - InterNamespaceAllowed: allow routes to claim + different paths of the same host name across namespaces. \n + If empty, the default is Strict." + type: string routeSelector: description: "routeSelector is used to filter the set of Routes serviced by the ingress controller. This is useful for implementing shards. diff --git a/vendor/github.com/openshift/api/operator/v1/0000_80_csi_snapshot_controller_operator_01_crd.yaml b/vendor/github.com/openshift/api/operator/v1/0000_80_csi_snapshot_controller_operator_01_crd.yaml index 1f6ac8689..d8cd7528b 100644 --- a/vendor/github.com/openshift/api/operator/v1/0000_80_csi_snapshot_controller_operator_01_crd.yaml +++ b/vendor/github.com/openshift/api/operator/v1/0000_80_csi_snapshot_controller_operator_01_crd.yaml @@ -19,9 +19,11 @@ spec: storage: true validation: openAPIV3Schema: - description: CSISnapshotController provides information to configure an operator to - manage the CSISnapshotController. + description: CSISnapshotController provides a means to configure an operator + to manage the CSI snapshots. `cluster` is the canonical name. type: object + required: + - spec properties: apiVersion: description: 'APIVersion defines the versioned schema of this representation @@ -36,8 +38,7 @@ spec: metadata: type: object spec: - description: CSISnapshotControllerSpec is the specification of the desired behavior of - the CSISnapshotController operator. + description: spec holds user settable values for configuration type: object properties: logLevel: @@ -73,8 +74,8 @@ spec: nullable: true x-kubernetes-preserve-unknown-fields: true status: - description: CSISnapshotControllerStatus defines the observed status of - the CSISnapshotController operator. + description: status holds observed values from the cluster. They may not + be overridden. type: object properties: conditions: diff --git a/vendor/github.com/openshift/api/operator/v1/types_authentication.go b/vendor/github.com/openshift/api/operator/v1/types_authentication.go index f27154117..403028dfd 100644 --- a/vendor/github.com/openshift/api/operator/v1/types_authentication.go +++ b/vendor/github.com/openshift/api/operator/v1/types_authentication.go @@ -25,7 +25,11 @@ type AuthenticationSpec struct { } type AuthenticationStatus struct { - OperatorStatus `json:",inline"` + // ManagingOAuthAPIServer indicates whether this operator is managing OAuth related APIs. Setting this field to true will cause OAS-O to step down. + // Note that this field will be removed in the future releases, once https://github.com/openshift/enhancements/blob/master/enhancements/authentication/separate-oauth-resources.md is fully implemented + // +optional + ManagingOAuthAPIServer bool `json:"managingOAuthAPIServer,omitempty"` + OperatorStatus `json:",inline"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/vendor/github.com/openshift/api/operator/v1/types_ingress.go b/vendor/github.com/openshift/api/operator/v1/types_ingress.go index 0314a4c81..9cac7e8aa 100644 --- a/vendor/github.com/openshift/api/operator/v1/types_ingress.go +++ b/vendor/github.com/openshift/api/operator/v1/types_ingress.go @@ -145,6 +145,15 @@ type IngressControllerSpec struct { // // +optional TLSSecurityProfile *configv1.TLSSecurityProfile `json:"tlsSecurityProfile,omitempty"` + + // routeAdmission defines a policy for handling new route claims (for example, + // to allow or deny claims across namespaces). + // + // The empty, defaults will be applied. See specific routeAdmission fields + // for details about their defaults. + // + // +optional + RouteAdmission *RouteAdmissionPolicy `json:"routeAdmission,omitempty"` } // NodePlacement describes node scheduling configuration for an ingress @@ -308,6 +317,35 @@ type EndpointPublishingStrategy struct { NodePort *NodePortStrategy `json:"nodePort,omitempty"` } +// RouteAdmissionPolicy is an admission policy for allowing new route claims. +type RouteAdmissionPolicy struct { + // namespaceOwnership describes how host name claims across namespaces should + // be handled. + // + // Value must be one of: + // + // - Strict: Do not allow routes in different namespaces to claim the same host. + // + // - InterNamespaceAllowed: allow routes to claim different paths of the same + // host name across namespaces. + // + // If empty, the default is Strict. + // +optional + NamespaceOwnership NamespaceOwnershipCheck `json:"namespaceOwnership,omitempty"` +} + +// NamespaceOwnershipCheck is a route admission policy component that describes +// how host name claims across namespaces should be handled. +type NamespaceOwnershipCheck string + +const ( + // InterNamespaceAllowedOwnershipCheck allows routes to claim different paths of the same host name across namespaces. + InterNamespaceAllowedOwnershipCheck NamespaceOwnershipCheck = "InterNamespaceAllowed" + + // StrictNamespaceOwnershipCheck does not allow routes to claim the same host name across namespaces. + StrictNamespaceOwnershipCheck NamespaceOwnershipCheck = "Strict" +) + var ( // Available indicates the ingress controller deployment is available. IngressControllerAvailableConditionType = "Available" diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.deepcopy.go b/vendor/github.com/openshift/api/operator/v1/zz_generated.deepcopy.go index dbd9f387a..158308a3e 100644 --- a/vendor/github.com/openshift/api/operator/v1/zz_generated.deepcopy.go +++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.deepcopy.go @@ -836,6 +836,11 @@ func (in *IngressControllerSpec) DeepCopyInto(out *IngressControllerSpec) { *out = new(configv1.TLSSecurityProfile) (*in).DeepCopyInto(*out) } + if in.RouteAdmission != nil { + in, out := &in.RouteAdmission, &out.RouteAdmission + *out = new(RouteAdmissionPolicy) + **out = **in + } return } @@ -1941,6 +1946,22 @@ func (in *ProxyConfig) DeepCopy() *ProxyConfig { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RouteAdmissionPolicy) DeepCopyInto(out *RouteAdmissionPolicy) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RouteAdmissionPolicy. +func (in *RouteAdmissionPolicy) DeepCopy() *RouteAdmissionPolicy { + if in == nil { + return nil + } + out := new(RouteAdmissionPolicy) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Server) DeepCopyInto(out *Server) { *out = *in diff --git a/vendor/github.com/openshift/api/operator/v1/zz_generated.swagger_doc_generated.go b/vendor/github.com/openshift/api/operator/v1/zz_generated.swagger_doc_generated.go index b30705ff0..c44f878c3 100644 --- a/vendor/github.com/openshift/api/operator/v1/zz_generated.swagger_doc_generated.go +++ b/vendor/github.com/openshift/api/operator/v1/zz_generated.swagger_doc_generated.go @@ -117,6 +117,14 @@ func (AuthenticationList) SwaggerDoc() map[string]string { return map_AuthenticationList } +var map_AuthenticationStatus = map[string]string{ + "managingOAuthAPIServer": "ManagingOAuthAPIServer indicates whether this operator is managing OAuth related APIs. Setting this field to true will cause OAS-O to step down. Note that this field will be removed in the future releases, once https://github.com/openshift/enhancements/blob/master/enhancements/authentication/separate-oauth-resources.md is fully implemented", +} + +func (AuthenticationStatus) SwaggerDoc() map[string]string { + return map_AuthenticationStatus +} + var map_Console = map[string]string{ "": "Console provides a means to configure an operator to manage the console.", } @@ -331,6 +339,7 @@ var map_IngressControllerSpec = map[string]string{ "routeSelector": "routeSelector is used to filter the set of Routes serviced by the ingress controller. This is useful for implementing shards.\n\nIf unset, the default is no filtering.", "nodePlacement": "nodePlacement enables explicit control over the scheduling of the ingress controller.\n\nIf unset, defaults are used. See NodePlacement for more details.", "tlsSecurityProfile": "tlsSecurityProfile specifies settings for TLS connections for ingresscontrollers.\n\nIf unset, the default is based on the apiservers.config.openshift.io/cluster resource.\n\nNote that when using the Old, Intermediate, and Modern profile types, the effective profile configuration is subject to change between releases. For example, given a specification to use the Intermediate profile deployed on release X.Y.Z, an upgrade to release X.Y.Z+1 may cause a new profile configuration to be applied to the ingress controller, resulting in a rollout.\n\nNote that the minimum TLS version for ingress controllers is 1.1, and the maximum TLS version is 1.2. An implication of this restriction is that the Modern TLS profile type cannot be used because it requires TLS 1.3.", + "routeAdmission": "routeAdmission defines a policy for handling new route claims (for example, to allow or deny claims across namespaces).\n\nThe empty, defaults will be applied. See specific routeAdmission fields for details about their defaults.", } func (IngressControllerSpec) SwaggerDoc() map[string]string { @@ -387,6 +396,15 @@ func (PrivateStrategy) SwaggerDoc() map[string]string { return map_PrivateStrategy } +var map_RouteAdmissionPolicy = map[string]string{ + "": "RouteAdmissionPolicy is an admission policy for allowing new route claims.", + "namespaceOwnership": "namespaceOwnership describes how host name claims across namespaces should be handled.\n\nValue must be one of:\n\n- Strict: Do not allow routes in different namespaces to claim the same host.\n\n- InterNamespaceAllowed: allow routes to claim different paths of the same\n host name across namespaces.\n\nIf empty, the default is Strict.", +} + +func (RouteAdmissionPolicy) SwaggerDoc() map[string]string { + return map_RouteAdmissionPolicy +} + var map_KubeAPIServer = map[string]string{ "": "KubeAPIServer provides information to configure an operator to manage kube-apiserver.", "spec": "spec is the specification of the desired behavior of the Kubernetes API Server", diff --git a/vendor/modules.txt b/vendor/modules.txt index b1b7469a3..8a5443d52 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -143,7 +143,7 @@ github.com/modern-go/concurrent github.com/modern-go/reflect2 # github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 github.com/munnerz/goautoneg -# github.com/openshift/api v0.0.0-20200109182645-c3cf38ec5571 +# github.com/openshift/api v0.0.0-20200115130134-f472aa214b03 github.com/openshift/api github.com/openshift/api/apps github.com/openshift/api/apps/v1 @@ -362,7 +362,7 @@ golang.org/x/text/unicode/norm golang.org/x/text/width # golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 golang.org/x/time/rate -# golang.org/x/tools v0.0.0-20200108203644-89082a384178 +# golang.org/x/tools v0.0.0-20200115044656-831fdb1e1868 golang.org/x/tools/container/intsets # google.golang.org/appengine v1.5.0 google.golang.org/appengine/internal