aboutsummaryrefslogtreecommitdiffstats
path: root/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned
diff options
context:
space:
mode:
Diffstat (limited to 'kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned')
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/apps.go76
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/auth/clientauth.go125
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/autoscaling.go77
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/batch.go107
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/certificates.go86
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/certificatesigningrequests.go104
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/client.go179
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/helpers.go183
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/latest/latest.go54
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/register.go43
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/types.go152
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/v1/conversion.go231
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/v1/register.go40
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/v1/types.go145
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/auth_loaders.go91
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/client_config.go411
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/config.go472
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/doc.go37
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/loader.go585
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/merged_client_builder.go122
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/overrides.go198
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/validation.go270
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clusterrolebindings.go92
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clusterroles.go92
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/componentstatuses.go60
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/conditions.go240
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/configmap.go122
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/containerinfo.go123
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/daemon_sets.go100
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/deployment.go111
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/doc.go57
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/endpoints.go101
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/events.go219
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/extensions.go131
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/flags.go31
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/helper.go273
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/horizontalpodautoscaler.go103
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/import_known_versions.go41
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/ingress.go100
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/jobs.go167
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/limit_ranges.go94
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/namespaces.go116
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/network_policys.go92
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/nodes.go111
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/persistentvolumeclaim.go99
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/persistentvolumes.go93
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/pet_sets.go100
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/pod_disruption_budgets.go100
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/pod_templates.go94
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/pods.go115
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/podsecuritypolicy.go111
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/policy.go76
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/rbac.go96
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/replica_sets.go100
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/replication_controllers.go99
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/resource_quotas.go102
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/rolebindings.go95
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/roles.go95
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/scale.go77
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/scheduledjobs.go103
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/secrets.go120
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/service_accounts.go120
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/services.go121
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/thirdpartyresources.go98
-rw-r--r--kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/util.go79
65 files changed, 8457 insertions, 0 deletions
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/apps.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/apps.go
new file mode 100644
index 0000000..f2498cb
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/apps.go
@@ -0,0 +1,76 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apimachinery/registered"
+ "k8s.io/kubernetes/pkg/apis/apps"
+ "k8s.io/kubernetes/pkg/client/restclient"
+)
+
+type AppsInterface interface {
+ PetSetNamespacer
+}
+
+// AppsClient is used to interact with Kubernetes batch features.
+type AppsClient struct {
+ *restclient.RESTClient
+}
+
+func (c *AppsClient) PetSets(namespace string) PetSetInterface {
+ return newPetSet(c, namespace)
+}
+
+func NewApps(c *restclient.Config) (*AppsClient, error) {
+ config := *c
+ if err := setAppsDefaults(&config); err != nil {
+ return nil, err
+ }
+ client, err := restclient.RESTClientFor(&config)
+ if err != nil {
+ return nil, err
+ }
+ return &AppsClient{client}, nil
+}
+
+func NewAppsOrDie(c *restclient.Config) *AppsClient {
+ client, err := NewApps(c)
+ if err != nil {
+ panic(err)
+ }
+ return client
+}
+
+func setAppsDefaults(config *restclient.Config) error {
+ g, err := registered.Group(apps.GroupName)
+ if err != nil {
+ return err
+ }
+ config.APIPath = defaultAPIPath
+ if config.UserAgent == "" {
+ config.UserAgent = restclient.DefaultKubernetesUserAgent()
+ }
+ // TODO: Unconditionally set the config.Version, until we fix the config.
+ //if config.Version == "" {
+ copyGroupVersion := g.GroupVersion
+ config.GroupVersion = &copyGroupVersion
+ //}
+
+ config.NegotiatedSerializer = api.Codecs
+ return nil
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/auth/clientauth.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/auth/clientauth.go
new file mode 100644
index 0000000..128597f
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/auth/clientauth.go
@@ -0,0 +1,125 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+/*
+Package auth defines a file format for holding authentication
+information needed by clients of Kubernetes. Typically,
+a Kubernetes cluster will put auth info for the admin in a known
+location when it is created, and will (soon) put it in a known
+location within a Container's file tree for Containers that
+need access to the Kubernetes API.
+
+Having a defined format allows:
+ - clients to be implmented in multiple languages
+ - applications which link clients to be portable across
+ clusters with different authentication styles (e.g.
+ some may use SSL Client certs, others may not, etc)
+ - when the format changes, applications only
+ need to update this code.
+
+The file format is json, marshalled from a struct authcfg.Info.
+
+Clinet libraries in other languages should use the same format.
+
+It is not intended to store general preferences, such as default
+namespace, output options, etc. CLIs (such as kubectl) and UIs should
+develop their own format and may wish to inline the authcfg.Info type.
+
+The authcfg.Info is just a file format. It is distinct from
+client.Config which holds options for creating a client.Client.
+Helper functions are provided in this package to fill in a
+client.Client from an authcfg.Info.
+
+Example:
+
+ import (
+ "pkg/client"
+ "pkg/client/auth"
+ )
+
+ info, err := auth.LoadFromFile(filename)
+ if err != nil {
+ // handle error
+ }
+ clientConfig = client.Config{}
+ clientConfig.Host = "example.com:4901"
+ clientConfig = info.MergeWithConfig()
+ client := client.New(clientConfig)
+ client.Pods(ns).List()
+*/
+package auth
+
+// TODO: need a way to rotate Tokens. Therefore, need a way for client object to be reset when the authcfg is updated.
+import (
+ "encoding/json"
+ "io/ioutil"
+ "os"
+
+ "k8s.io/kubernetes/pkg/client/restclient"
+)
+
+// Info holds Kubernetes API authorization config. It is intended
+// to be read/written from a file as a JSON object.
+type Info struct {
+ User string
+ Password string
+ CAFile string
+ CertFile string
+ KeyFile string
+ BearerToken string
+ Insecure *bool
+}
+
+// LoadFromFile parses an Info object from a file path.
+// If the file does not exist, then os.IsNotExist(err) == true
+func LoadFromFile(path string) (*Info, error) {
+ var info Info
+ if _, err := os.Stat(path); os.IsNotExist(err) {
+ return nil, err
+ }
+ data, err := ioutil.ReadFile(path)
+ if err != nil {
+ return nil, err
+ }
+ err = json.Unmarshal(data, &info)
+ if err != nil {
+ return nil, err
+ }
+ return &info, err
+}
+
+// MergeWithConfig returns a copy of a client.Config with values from the Info.
+// The fields of client.Config with a corresponding field in the Info are set
+// with the value from the Info.
+func (info Info) MergeWithConfig(c restclient.Config) (restclient.Config, error) {
+ var config restclient.Config = c
+ config.Username = info.User
+ config.Password = info.Password
+ config.CAFile = info.CAFile
+ config.CertFile = info.CertFile
+ config.KeyFile = info.KeyFile
+ config.BearerToken = info.BearerToken
+ if info.Insecure != nil {
+ config.Insecure = *info.Insecure
+ }
+ return config, nil
+}
+
+func (info Info) Complete() bool {
+ return len(info.User) > 0 ||
+ len(info.CertFile) > 0 ||
+ len(info.BearerToken) > 0
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/autoscaling.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/autoscaling.go
new file mode 100644
index 0000000..188a5ea
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/autoscaling.go
@@ -0,0 +1,77 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apimachinery/registered"
+ "k8s.io/kubernetes/pkg/apis/autoscaling"
+ "k8s.io/kubernetes/pkg/client/restclient"
+)
+
+type AutoscalingInterface interface {
+ HorizontalPodAutoscalersNamespacer
+}
+
+// AutoscalingClient is used to interact with Kubernetes autoscaling features.
+type AutoscalingClient struct {
+ *restclient.RESTClient
+}
+
+func (c *AutoscalingClient) HorizontalPodAutoscalers(namespace string) HorizontalPodAutoscalerInterface {
+ return newHorizontalPodAutoscalers(c, namespace)
+}
+
+func NewAutoscaling(c *restclient.Config) (*AutoscalingClient, error) {
+ config := *c
+ if err := setAutoscalingDefaults(&config); err != nil {
+ return nil, err
+ }
+ client, err := restclient.RESTClientFor(&config)
+ if err != nil {
+ return nil, err
+ }
+ return &AutoscalingClient{client}, nil
+}
+
+func NewAutoscalingOrDie(c *restclient.Config) *AutoscalingClient {
+ client, err := NewAutoscaling(c)
+ if err != nil {
+ panic(err)
+ }
+ return client
+}
+
+func setAutoscalingDefaults(config *restclient.Config) error {
+ // if autoscaling group is not registered, return an error
+ g, err := registered.Group(autoscaling.GroupName)
+ if err != nil {
+ return err
+ }
+ config.APIPath = defaultAPIPath
+ if config.UserAgent == "" {
+ config.UserAgent = restclient.DefaultKubernetesUserAgent()
+ }
+ // TODO: Unconditionally set the config.Version, until we fix the config.
+ //if config.Version == "" {
+ copyGroupVersion := g.GroupVersion
+ config.GroupVersion = &copyGroupVersion
+ //}
+
+ config.NegotiatedSerializer = api.Codecs
+ return nil
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/batch.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/batch.go
new file mode 100644
index 0000000..c31652f
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/batch.go
@@ -0,0 +1,107 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/api/unversioned"
+ "k8s.io/kubernetes/pkg/apimachinery/registered"
+ "k8s.io/kubernetes/pkg/apis/batch"
+ "k8s.io/kubernetes/pkg/apis/batch/v2alpha1"
+ "k8s.io/kubernetes/pkg/client/restclient"
+)
+
+type BatchInterface interface {
+ JobsNamespacer
+ ScheduledJobsNamespacer
+}
+
+// BatchClient is used to interact with Kubernetes batch features.
+type BatchClient struct {
+ *restclient.RESTClient
+}
+
+func (c *BatchClient) Jobs(namespace string) JobInterface {
+ return newJobsV1(c, namespace)
+}
+
+func (c *BatchClient) ScheduledJobs(namespace string) ScheduledJobInterface {
+ return newScheduledJobs(c, namespace)
+}
+
+func NewBatch(c *restclient.Config) (*BatchClient, error) {
+ config := *c
+ if err := setBatchDefaults(&config, nil); err != nil {
+ return nil, err
+ }
+ client, err := restclient.RESTClientFor(&config)
+ if err != nil {
+ return nil, err
+ }
+ return &BatchClient{client}, nil
+}
+
+func NewBatchV2Alpha1(c *restclient.Config) (*BatchClient, error) {
+ config := *c
+ if err := setBatchDefaults(&config, &v2alpha1.SchemeGroupVersion); err != nil {
+ return nil, err
+ }
+ client, err := restclient.RESTClientFor(&config)
+ if err != nil {
+ return nil, err
+ }
+ return &BatchClient{client}, nil
+}
+
+func NewBatchOrDie(c *restclient.Config) *BatchClient {
+ var (
+ client *BatchClient
+ err error
+ )
+ if c.ContentConfig.GroupVersion != nil && *c.ContentConfig.GroupVersion == v2alpha1.SchemeGroupVersion {
+ client, err = NewBatchV2Alpha1(c)
+ } else {
+ client, err = NewBatch(c)
+ }
+ if err != nil {
+ panic(err)
+ }
+ return client
+}
+
+func setBatchDefaults(config *restclient.Config, gv *unversioned.GroupVersion) error {
+ // if batch group is not registered, return an error
+ g, err := registered.Group(batch.GroupName)
+ if err != nil {
+ return err
+ }
+ config.APIPath = defaultAPIPath
+ if config.UserAgent == "" {
+ config.UserAgent = restclient.DefaultKubernetesUserAgent()
+ }
+ // TODO: Unconditionally set the config.Version, until we fix the config.
+ //if config.Version == "" {
+ copyGroupVersion := g.GroupVersion
+ if gv != nil {
+ copyGroupVersion = *gv
+ }
+ config.GroupVersion = &copyGroupVersion
+ //}
+
+ config.NegotiatedSerializer = api.Codecs
+ return nil
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/certificates.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/certificates.go
new file mode 100644
index 0000000..29b15c4
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/certificates.go
@@ -0,0 +1,86 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apimachinery/registered"
+ "k8s.io/kubernetes/pkg/apis/certificates"
+ "k8s.io/kubernetes/pkg/client/restclient"
+)
+
+// Interface holds the methods for clients of Kubernetes to allow mock testing.
+type CertificatesInterface interface {
+ CertificateSigningRequests() CertificateSigningRequestInterface
+}
+
+type CertificatesClient struct {
+ *restclient.RESTClient
+}
+
+func (c *CertificatesClient) CertificateSigningRequests() CertificateSigningRequestInterface {
+ return newCertificateSigningRequests(c)
+}
+
+// NewCertificates creates a new CertificatesClient for the given config.
+func NewCertificates(c *restclient.Config) (*CertificatesClient, error) {
+ config := *c
+ if err := setCertificatesDefaults(&config); err != nil {
+ return nil, err
+ }
+ client, err := restclient.RESTClientFor(&config)
+ if err != nil {
+ return nil, err
+ }
+ return &CertificatesClient{client}, nil
+}
+
+// NewCertificatesOrDie creates a new CertificatesClient for the given config and
+// panics if there is an error in the config.
+func NewCertificatesOrDie(c *restclient.Config) *CertificatesClient {
+ client, err := NewCertificates(c)
+ if err != nil {
+ panic(err)
+ }
+ return client
+}
+
+func setCertificatesDefaults(config *restclient.Config) error {
+ // if certificates group is not registered, return an error
+ g, err := registered.Group(certificates.GroupName)
+ if err != nil {
+ return err
+ }
+ config.APIPath = defaultAPIPath
+ if config.UserAgent == "" {
+ config.UserAgent = restclient.DefaultKubernetesUserAgent()
+ }
+ // TODO: Unconditionally set the config.Version, until we fix the config.
+ //if config.Version == "" {
+ copyGroupVersion := g.GroupVersion
+ config.GroupVersion = &copyGroupVersion
+ //}
+
+ config.NegotiatedSerializer = api.Codecs
+ if config.QPS == 0 {
+ config.QPS = 5
+ }
+ if config.Burst == 0 {
+ config.Burst = 10
+ }
+ return nil
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/certificatesigningrequests.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/certificatesigningrequests.go
new file mode 100644
index 0000000..f3ce09f
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/certificatesigningrequests.go
@@ -0,0 +1,104 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/certificates"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// CertificateSigningRequestInterface has methods to work with CertificateSigningRequest resources.
+type CertificateSigningRequestInterface interface {
+ List(opts api.ListOptions) (*certificates.CertificateSigningRequestList, error)
+ Get(name string) (*certificates.CertificateSigningRequest, error)
+ Delete(name string, options *api.DeleteOptions) error
+ Create(certificateSigningRequest *certificates.CertificateSigningRequest) (*certificates.CertificateSigningRequest, error)
+ Update(certificateSigningRequest *certificates.CertificateSigningRequest) (*certificates.CertificateSigningRequest, error)
+ UpdateStatus(certificateSigningRequest *certificates.CertificateSigningRequest) (*certificates.CertificateSigningRequest, error)
+ UpdateApproval(certificateSigningRequest *certificates.CertificateSigningRequest) (*certificates.CertificateSigningRequest, error)
+ Watch(opts api.ListOptions) (watch.Interface, error)
+}
+
+// certificateSigningRequests implements CertificateSigningRequestsNamespacer interface
+type certificateSigningRequests struct {
+ client *CertificatesClient
+}
+
+// newCertificateSigningRequests returns a certificateSigningRequests
+func newCertificateSigningRequests(c *CertificatesClient) *certificateSigningRequests {
+ return &certificateSigningRequests{
+ client: c,
+ }
+}
+
+// List takes label and field selectors, and returns the list of certificateSigningRequests that match those selectors.
+func (c *certificateSigningRequests) List(opts api.ListOptions) (result *certificates.CertificateSigningRequestList, err error) {
+ result = &certificates.CertificateSigningRequestList{}
+ err = c.client.Get().Resource("certificatesigningrequests").VersionedParams(&opts, api.ParameterCodec).Do().Into(result)
+ return
+}
+
+// Get takes the name of the certificateSigningRequest, and returns the corresponding CertificateSigningRequest object, and an error if it occurs
+func (c *certificateSigningRequests) Get(name string) (result *certificates.CertificateSigningRequest, err error) {
+ result = &certificates.CertificateSigningRequest{}
+ err = c.client.Get().Resource("certificatesigningrequests").Name(name).Do().Into(result)
+ return
+}
+
+// Delete takes the name of the certificateSigningRequest and deletes it. Returns an error if one occurs.
+func (c *certificateSigningRequests) Delete(name string, options *api.DeleteOptions) error {
+ return c.client.Delete().Resource("certificatesigningrequests").Name(name).Body(options).Do().Error()
+}
+
+// Create takes the representation of a certificateSigningRequest and creates it. Returns the server's representation of the certificateSigningRequest, and an error, if it occurs.
+func (c *certificateSigningRequests) Create(certificateSigningRequest *certificates.CertificateSigningRequest) (result *certificates.CertificateSigningRequest, err error) {
+ result = &certificates.CertificateSigningRequest{}
+ err = c.client.Post().Resource("certificatesigningrequests").Body(certificateSigningRequest).Do().Into(result)
+ return
+}
+
+// Update takes the representation of a certificateSigningRequest and updates it. Returns the server's representation of the certificateSigningRequest, and an error, if it occurs.
+func (c *certificateSigningRequests) Update(certificateSigningRequest *certificates.CertificateSigningRequest) (result *certificates.CertificateSigningRequest, err error) {
+ result = &certificates.CertificateSigningRequest{}
+ err = c.client.Put().Resource("certificatesigningrequests").Name(certificateSigningRequest.Name).Body(certificateSigningRequest).Do().Into(result)
+ return
+}
+
+// UpdateStatus takes the representation of a certificateSigningRequest and updates it. Returns the server's representation of the certificateSigningRequest, and an error, if it occurs.
+func (c *certificateSigningRequests) UpdateStatus(certificateSigningRequest *certificates.CertificateSigningRequest) (result *certificates.CertificateSigningRequest, err error) {
+ result = &certificates.CertificateSigningRequest{}
+ err = c.client.Put().Resource("certificatesigningrequests").Name(certificateSigningRequest.Name).SubResource("status").Body(certificateSigningRequest).Do().Into(result)
+ return
+}
+
+// UpdateApproval takes the representation of a certificateSigningRequest and updates it. Returns the server's representation of the certificateSigningRequest, and an error, if it occurs.
+func (c *certificateSigningRequests) UpdateApproval(certificateSigningRequest *certificates.CertificateSigningRequest) (result *certificates.CertificateSigningRequest, err error) {
+ result = &certificates.CertificateSigningRequest{}
+ err = c.client.Put().Resource("certificatesigningrequests").Name(certificateSigningRequest.Name).SubResource("approval").Body(certificateSigningRequest).Do().Into(result)
+ return
+}
+
+// Watch returns a watch.Interface that watches the requested certificateSigningRequests.
+func (c *certificateSigningRequests) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.client.Get().
+ Prefix("watch").
+ Namespace(api.NamespaceAll).
+ Resource("certificatesigningrequests").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/client.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/client.go
new file mode 100644
index 0000000..5474e96
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/client.go
@@ -0,0 +1,179 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "net"
+ "net/url"
+ "strings"
+
+ "k8s.io/kubernetes/pkg/client/restclient"
+ "k8s.io/kubernetes/pkg/client/typed/discovery"
+)
+
+// Interface holds the methods for clients of Kubernetes,
+// an interface to allow mock testing.
+type Interface interface {
+ PodsNamespacer
+ PodTemplatesNamespacer
+ ReplicationControllersNamespacer
+ ServicesNamespacer
+ EndpointsNamespacer
+ NodesInterface
+ EventNamespacer
+ LimitRangesNamespacer
+ ResourceQuotasNamespacer
+ ServiceAccountsNamespacer
+ SecretsNamespacer
+ NamespacesInterface
+ PersistentVolumesInterface
+ PersistentVolumeClaimsNamespacer
+ ComponentStatusesInterface
+ ConfigMapsNamespacer
+ Autoscaling() AutoscalingInterface
+ Batch() BatchInterface
+ Extensions() ExtensionsInterface
+ Rbac() RbacInterface
+ Discovery() discovery.DiscoveryInterface
+ Certificates() CertificatesInterface
+}
+
+func (c *Client) ReplicationControllers(namespace string) ReplicationControllerInterface {
+ return newReplicationControllers(c, namespace)
+}
+
+func (c *Client) Nodes() NodeInterface {
+ return newNodes(c)
+}
+
+func (c *Client) Events(namespace string) EventInterface {
+ return newEvents(c, namespace)
+}
+
+func (c *Client) Endpoints(namespace string) EndpointsInterface {
+ return newEndpoints(c, namespace)
+}
+
+func (c *Client) Pods(namespace string) PodInterface {
+ return newPods(c, namespace)
+}
+
+func (c *Client) PodTemplates(namespace string) PodTemplateInterface {
+ return newPodTemplates(c, namespace)
+}
+
+func (c *Client) Services(namespace string) ServiceInterface {
+ return newServices(c, namespace)
+}
+func (c *Client) LimitRanges(namespace string) LimitRangeInterface {
+ return newLimitRanges(c, namespace)
+}
+
+func (c *Client) ResourceQuotas(namespace string) ResourceQuotaInterface {
+ return newResourceQuotas(c, namespace)
+}
+
+func (c *Client) ServiceAccounts(namespace string) ServiceAccountsInterface {
+ return newServiceAccounts(c, namespace)
+}
+
+func (c *Client) Secrets(namespace string) SecretsInterface {
+ return newSecrets(c, namespace)
+}
+
+func (c *Client) Namespaces() NamespaceInterface {
+ return newNamespaces(c)
+}
+
+func (c *Client) PersistentVolumes() PersistentVolumeInterface {
+ return newPersistentVolumes(c)
+}
+
+func (c *Client) PersistentVolumeClaims(namespace string) PersistentVolumeClaimInterface {
+ return newPersistentVolumeClaims(c, namespace)
+}
+
+func (c *Client) ComponentStatuses() ComponentStatusInterface {
+ return newComponentStatuses(c)
+}
+
+func (c *Client) ConfigMaps(namespace string) ConfigMapsInterface {
+ return newConfigMaps(c, namespace)
+}
+
+// Client is the implementation of a Kubernetes client.
+type Client struct {
+ *restclient.RESTClient
+ *AutoscalingClient
+ *BatchClient
+ *ExtensionsClient
+ *AppsClient
+ *PolicyClient
+ *RbacClient
+ *discovery.DiscoveryClient
+ *CertificatesClient
+}
+
+// IsTimeout tests if this is a timeout error in the underlying transport.
+// This is unbelievably ugly.
+// See: http://stackoverflow.com/questions/23494950/specifically-check-for-timeout-error for details
+func IsTimeout(err error) bool {
+ if err == nil {
+ return false
+ }
+ switch err := err.(type) {
+ case *url.Error:
+ if err, ok := err.Err.(net.Error); ok {
+ return err.Timeout()
+ }
+ case net.Error:
+ return err.Timeout()
+ }
+
+ if strings.Contains(err.Error(), "use of closed network connection") {
+ return true
+ }
+ return false
+}
+
+func (c *Client) Autoscaling() AutoscalingInterface {
+ return c.AutoscalingClient
+}
+
+func (c *Client) Batch() BatchInterface {
+ return c.BatchClient
+}
+
+func (c *Client) Extensions() ExtensionsInterface {
+ return c.ExtensionsClient
+}
+
+func (c *Client) Apps() AppsInterface {
+ return c.AppsClient
+}
+
+func (c *Client) Rbac() RbacInterface {
+ return c.RbacClient
+}
+
+func (c *Client) Discovery() discovery.DiscoveryInterface {
+ return c.DiscoveryClient
+}
+
+func (c *Client) Certificates() CertificatesInterface {
+ return c.CertificatesClient
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/helpers.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/helpers.go
new file mode 100644
index 0000000..43e2648
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/helpers.go
@@ -0,0 +1,183 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package api
+
+import (
+ "encoding/base64"
+ "errors"
+ "fmt"
+ "io/ioutil"
+ "os"
+ "path"
+ "path/filepath"
+)
+
+func init() {
+ sDec, _ := base64.StdEncoding.DecodeString("REDACTED+")
+ redactedBytes = []byte(string(sDec))
+}
+
+// IsConfigEmpty returns true if the config is empty.
+func IsConfigEmpty(config *Config) bool {
+ return len(config.AuthInfos) == 0 && len(config.Clusters) == 0 && len(config.Contexts) == 0 &&
+ len(config.CurrentContext) == 0 &&
+ len(config.Preferences.Extensions) == 0 && !config.Preferences.Colors &&
+ len(config.Extensions) == 0
+}
+
+// MinifyConfig read the current context and uses that to keep only the relevant pieces of config
+// This is useful for making secrets based on kubeconfig files
+func MinifyConfig(config *Config) error {
+ if len(config.CurrentContext) == 0 {
+ return errors.New("current-context must exist in order to minify")
+ }
+
+ currContext, exists := config.Contexts[config.CurrentContext]
+ if !exists {
+ return fmt.Errorf("cannot locate context %v", config.CurrentContext)
+ }
+
+ newContexts := map[string]*Context{}
+ newContexts[config.CurrentContext] = currContext
+
+ newClusters := map[string]*Cluster{}
+ if len(currContext.Cluster) > 0 {
+ if _, exists := config.Clusters[currContext.Cluster]; !exists {
+ return fmt.Errorf("cannot locate cluster %v", currContext.Cluster)
+ }
+
+ newClusters[currContext.Cluster] = config.Clusters[currContext.Cluster]
+ }
+
+ newAuthInfos := map[string]*AuthInfo{}
+ if len(currContext.AuthInfo) > 0 {
+ if _, exists := config.AuthInfos[currContext.AuthInfo]; !exists {
+ return fmt.Errorf("cannot locate user %v", currContext.AuthInfo)
+ }
+
+ newAuthInfos[currContext.AuthInfo] = config.AuthInfos[currContext.AuthInfo]
+ }
+
+ config.AuthInfos = newAuthInfos
+ config.Clusters = newClusters
+ config.Contexts = newContexts
+
+ return nil
+}
+
+var redactedBytes []byte
+
+// Flatten redacts raw data entries from the config object for a human-readable view.
+func ShortenConfig(config *Config) {
+ // trick json encoder into printing a human readable string in the raw data
+ // by base64 decoding what we want to print. Relies on implementation of
+ // http://golang.org/pkg/encoding/json/#Marshal using base64 to encode []byte
+ for key, authInfo := range config.AuthInfos {
+ if len(authInfo.ClientKeyData) > 0 {
+ authInfo.ClientKeyData = redactedBytes
+ }
+ if len(authInfo.ClientCertificateData) > 0 {
+ authInfo.ClientCertificateData = redactedBytes
+ }
+ config.AuthInfos[key] = authInfo
+ }
+ for key, cluster := range config.Clusters {
+ if len(cluster.CertificateAuthorityData) > 0 {
+ cluster.CertificateAuthorityData = redactedBytes
+ }
+ config.Clusters[key] = cluster
+ }
+}
+
+// Flatten changes the config object into a self contained config (useful for making secrets)
+func FlattenConfig(config *Config) error {
+ for key, authInfo := range config.AuthInfos {
+ baseDir, err := MakeAbs(path.Dir(authInfo.LocationOfOrigin), "")
+ if err != nil {
+ return err
+ }
+
+ if err := FlattenContent(&authInfo.ClientCertificate, &authInfo.ClientCertificateData, baseDir); err != nil {
+ return err
+ }
+ if err := FlattenContent(&authInfo.ClientKey, &authInfo.ClientKeyData, baseDir); err != nil {
+ return err
+ }
+
+ config.AuthInfos[key] = authInfo
+ }
+ for key, cluster := range config.Clusters {
+ baseDir, err := MakeAbs(path.Dir(cluster.LocationOfOrigin), "")
+ if err != nil {
+ return err
+ }
+
+ if err := FlattenContent(&cluster.CertificateAuthority, &cluster.CertificateAuthorityData, baseDir); err != nil {
+ return err
+ }
+
+ config.Clusters[key] = cluster
+ }
+
+ return nil
+}
+
+func FlattenContent(path *string, contents *[]byte, baseDir string) error {
+ if len(*path) != 0 {
+ if len(*contents) > 0 {
+ return errors.New("cannot have values for both path and contents")
+ }
+
+ var err error
+ absPath := ResolvePath(*path, baseDir)
+ *contents, err = ioutil.ReadFile(absPath)
+ if err != nil {
+ return err
+ }
+
+ *path = ""
+ }
+
+ return nil
+}
+
+// ResolvePath returns the path as an absolute paths, relative to the given base directory
+func ResolvePath(path string, base string) string {
+ // Don't resolve empty paths
+ if len(path) > 0 {
+ // Don't resolve absolute paths
+ if !filepath.IsAbs(path) {
+ return filepath.Join(base, path)
+ }
+ }
+
+ return path
+}
+
+func MakeAbs(path, base string) (string, error) {
+ if filepath.IsAbs(path) {
+ return path, nil
+ }
+ if len(base) == 0 {
+ cwd, err := os.Getwd()
+ if err != nil {
+ return "", err
+ }
+ base = cwd
+ }
+ return filepath.Join(base, path), nil
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/latest/latest.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/latest/latest.go
new file mode 100644
index 0000000..0b9a427
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/latest/latest.go
@@ -0,0 +1,54 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package latest
+
+import (
+ "k8s.io/kubernetes/pkg/api/unversioned"
+ "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api"
+ _ "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/v1"
+ "k8s.io/kubernetes/pkg/runtime"
+ "k8s.io/kubernetes/pkg/runtime/serializer/json"
+ "k8s.io/kubernetes/pkg/runtime/serializer/versioning"
+)
+
+// Version is the string that represents the current external default version.
+const Version = "v1"
+
+var ExternalVersion = unversioned.GroupVersion{Group: "", Version: "v1"}
+
+// OldestVersion is the string that represents the oldest server version supported,
+// for client code that wants to hardcode the lowest common denominator.
+const OldestVersion = "v1"
+
+// Versions is the list of versions that are recognized in code. The order provided
+// may be assumed to be least feature rich to most feature rich, and clients may
+// choose to prefer the latter items in the list over the former items when presented
+// with a set of versions to choose.
+var Versions = []string{"v1"}
+
+var Codec runtime.Codec
+
+func init() {
+ yamlSerializer := json.NewYAMLSerializer(json.DefaultMetaFactory, api.Scheme, api.Scheme)
+ Codec = versioning.NewCodecForScheme(
+ api.Scheme,
+ yamlSerializer,
+ yamlSerializer,
+ []unversioned.GroupVersion{{Version: Version}},
+ []unversioned.GroupVersion{{Version: runtime.APIVersionInternal}},
+ )
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/register.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/register.go
new file mode 100644
index 0000000..5426e7f
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/register.go
@@ -0,0 +1,43 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package api
+
+import (
+ "k8s.io/kubernetes/pkg/api/unversioned"
+ "k8s.io/kubernetes/pkg/runtime"
+)
+
+// Scheme is the default instance of runtime.Scheme to which types in the Kubernetes API are already registered.
+var Scheme = runtime.NewScheme()
+
+// SchemeGroupVersion is group version used to register these objects
+// TODO this should be in the "kubeconfig" group
+var SchemeGroupVersion = unversioned.GroupVersion{Group: "", Version: runtime.APIVersionInternal}
+
+func init() {
+ Scheme.AddKnownTypes(SchemeGroupVersion,
+ &Config{},
+ )
+}
+
+func (obj *Config) GetObjectKind() unversioned.ObjectKind { return obj }
+func (obj *Config) SetGroupVersionKind(gvk unversioned.GroupVersionKind) {
+ obj.APIVersion, obj.Kind = gvk.ToAPIVersionAndKind()
+}
+func (obj *Config) GroupVersionKind() unversioned.GroupVersionKind {
+ return unversioned.FromAPIVersionAndKind(obj.APIVersion, obj.Kind)
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/types.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/types.go
new file mode 100644
index 0000000..95b5289
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/types.go
@@ -0,0 +1,152 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package api
+
+import (
+ "k8s.io/kubernetes/pkg/runtime"
+)
+
+// Where possible, json tags match the cli argument names.
+// Top level config objects and all values required for proper functioning are not "omitempty". Any truly optional piece of config is allowed to be omitted.
+
+// Config holds the information needed to build connect to remote kubernetes clusters as a given user
+// IMPORTANT if you add fields to this struct, please update IsConfigEmpty()
+type Config struct {
+ // Legacy field from pkg/api/types.go TypeMeta.
+ // TODO(jlowdermilk): remove this after eliminating downstream dependencies.
+ Kind string `json:"kind,omitempty"`
+ // DEPRECATED: APIVersion is the preferred api version for communicating with the kubernetes cluster (v1, v2, etc).
+ // Because a cluster can run multiple API groups and potentially multiple versions of each, it no longer makes sense to specify
+ // a single value for the cluster version.
+ // This field isn't really needed anyway, so we are deprecating it without replacement.
+ // It will be ignored if it is present.
+ APIVersion string `json:"apiVersion,omitempty"`
+ // Preferences holds general information to be use for cli interactions
+ Preferences Preferences `json:"preferences"`
+ // Clusters is a map of referencable names to cluster configs
+ Clusters map[string]*Cluster `json:"clusters"`
+ // AuthInfos is a map of referencable names to user configs
+ AuthInfos map[string]*AuthInfo `json:"users"`
+ // Contexts is a map of referencable names to context configs
+ Contexts map[string]*Context `json:"contexts"`
+ // CurrentContext is the name of the context that you would like to use by default
+ CurrentContext string `json:"current-context"`
+ // Extensions holds additional information. This is useful for extenders so that reads and writes don't clobber unknown fields
+ Extensions map[string]runtime.Object `json:"extensions,omitempty"`
+}
+
+// IMPORTANT if you add fields to this struct, please update IsConfigEmpty()
+type Preferences struct {
+ Colors bool `json:"colors,omitempty"`
+ // Extensions holds additional information. This is useful for extenders so that reads and writes don't clobber unknown fields
+ Extensions map[string]runtime.Object `json:"extensions,omitempty"`
+}
+
+// Cluster contains information about how to communicate with a kubernetes cluster
+type Cluster struct {
+ // LocationOfOrigin indicates where this object came from. It is used for round tripping config post-merge, but never serialized.
+ LocationOfOrigin string
+ // Server is the address of the kubernetes cluster (https://hostname:port).
+ Server string `json:"server"`
+ // APIVersion is the preferred api version for communicating with the kubernetes cluster (v1, v2, etc).
+ APIVersion string `json:"api-version,omitempty"`
+ // InsecureSkipTLSVerify skips the validity check for the server's certificate. This will make your HTTPS connections insecure.
+ InsecureSkipTLSVerify bool `json:"insecure-skip-tls-verify,omitempty"`
+ // CertificateAuthority is the path to a cert file for the certificate authority.
+ CertificateAuthority string `json:"certificate-authority,omitempty"`
+ // CertificateAuthorityData contains PEM-encoded certificate authority certificates. Overrides CertificateAuthority
+ CertificateAuthorityData []byte `json:"certificate-authority-data,omitempty"`
+ // Extensions holds additional information. This is useful for extenders so that reads and writes don't clobber unknown fields
+ Extensions map[string]runtime.Object `json:"extensions,omitempty"`
+}
+
+// AuthInfo contains information that describes identity information. This is use to tell the kubernetes cluster who you are.
+type AuthInfo struct {
+ // LocationOfOrigin indicates where this object came from. It is used for round tripping config post-merge, but never serialized.
+ LocationOfOrigin string
+ // ClientCertificate is the path to a client cert file for TLS.
+ ClientCertificate string `json:"client-certificate,omitempty"`
+ // ClientCertificateData contains PEM-encoded data from a client cert file for TLS. Overrides ClientCertificate
+ ClientCertificateData []byte `json:"client-certificate-data,omitempty"`
+ // ClientKey is the path to a client key file for TLS.
+ ClientKey string `json:"client-key,omitempty"`
+ // ClientKeyData contains PEM-encoded data from a client key file for TLS. Overrides ClientKey
+ ClientKeyData []byte `json:"client-key-data,omitempty"`
+ // Token is the bearer token for authentication to the kubernetes cluster.
+ Token string `json:"token,omitempty"`
+ // Impersonate is the username to act-as.
+ Impersonate string `json:"act-as,omitempty"`
+ // Username is the username for basic authentication to the kubernetes cluster.
+ Username string `json:"username,omitempty"`
+ // Password is the password for basic authentication to the kubernetes cluster.
+ Password string `json:"password,omitempty"`
+ // AuthProvider specifies a custom authentication plugin for the kubernetes cluster.
+ AuthProvider *AuthProviderConfig `json:"auth-provider,omitempty"`
+ // Extensions holds additional information. This is useful for extenders so that reads and writes don't clobber unknown fields
+ Extensions map[string]runtime.Object `json:"extensions,omitempty"`
+}
+
+// Context is a tuple of references to a cluster (how do I communicate with a kubernetes cluster), a user (how do I identify myself), and a namespace (what subset of resources do I want to work with)
+type Context struct {
+ // LocationOfOrigin indicates where this object came from. It is used for round tripping config post-merge, but never serialized.
+ LocationOfOrigin string
+ // Cluster is the name of the cluster for this context
+ Cluster string `json:"cluster"`
+ // AuthInfo is the name of the authInfo for this context
+ AuthInfo string `json:"user"`
+ // Namespace is the default namespace to use on unspecified requests
+ Namespace string `json:"namespace,omitempty"`
+ // Extensions holds additional information. This is useful for extenders so that reads and writes don't clobber unknown fields
+ Extensions map[string]runtime.Object `json:"extensions,omitempty"`
+}
+
+// AuthProviderConfig holds the configuration for a specified auth provider.
+type AuthProviderConfig struct {
+ Name string `json:"name"`
+ Config map[string]string `json:"config,omitempty"`
+}
+
+// NewConfig is a convenience function that returns a new Config object with non-nil maps
+func NewConfig() *Config {
+ return &Config{
+ Preferences: *NewPreferences(),
+ Clusters: make(map[string]*Cluster),
+ AuthInfos: make(map[string]*AuthInfo),
+ Contexts: make(map[string]*Context),
+ Extensions: make(map[string]runtime.Object),
+ }
+}
+
+// NewConfig is a convenience function that returns a new Config object with non-nil maps
+func NewContext() *Context {
+ return &Context{Extensions: make(map[string]runtime.Object)}
+}
+
+// NewConfig is a convenience function that returns a new Config object with non-nil maps
+func NewCluster() *Cluster {
+ return &Cluster{Extensions: make(map[string]runtime.Object)}
+}
+
+// NewConfig is a convenience function that returns a new Config object with non-nil maps
+func NewAuthInfo() *AuthInfo {
+ return &AuthInfo{Extensions: make(map[string]runtime.Object)}
+}
+
+// NewConfig is a convenience function that returns a new Config object with non-nil maps
+func NewPreferences() *Preferences {
+ return &Preferences{Extensions: make(map[string]runtime.Object)}
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/v1/conversion.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/v1/conversion.go
new file mode 100644
index 0000000..e22e5f8
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/v1/conversion.go
@@ -0,0 +1,231 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1
+
+import (
+ "sort"
+
+ "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api"
+ "k8s.io/kubernetes/pkg/conversion"
+ "k8s.io/kubernetes/pkg/runtime"
+)
+
+func init() {
+ err := api.Scheme.AddConversionFuncs(
+ func(in *Cluster, out *api.Cluster, s conversion.Scope) error {
+ return s.DefaultConvert(in, out, conversion.IgnoreMissingFields)
+ },
+ func(in *api.Cluster, out *Cluster, s conversion.Scope) error {
+ return s.DefaultConvert(in, out, conversion.IgnoreMissingFields)
+ },
+ func(in *Preferences, out *api.Preferences, s conversion.Scope) error {
+ return s.DefaultConvert(in, out, conversion.IgnoreMissingFields)
+ },
+ func(in *api.Preferences, out *Preferences, s conversion.Scope) error {
+ return s.DefaultConvert(in, out, conversion.IgnoreMissingFields)
+ },
+ func(in *AuthInfo, out *api.AuthInfo, s conversion.Scope) error {
+ return s.DefaultConvert(in, out, conversion.IgnoreMissingFields)
+ },
+ func(in *api.AuthInfo, out *AuthInfo, s conversion.Scope) error {
+ return s.DefaultConvert(in, out, conversion.IgnoreMissingFields)
+ },
+ func(in *Context, out *api.Context, s conversion.Scope) error {
+ return s.DefaultConvert(in, out, conversion.IgnoreMissingFields)
+ },
+ func(in *api.Context, out *Context, s conversion.Scope) error {
+ return s.DefaultConvert(in, out, conversion.IgnoreMissingFields)
+ },
+
+ func(in *Config, out *api.Config, s conversion.Scope) error {
+ out.CurrentContext = in.CurrentContext
+ if err := s.Convert(&in.Preferences, &out.Preferences, 0); err != nil {
+ return err
+ }
+
+ out.Clusters = make(map[string]*api.Cluster)
+ if err := s.Convert(&in.Clusters, &out.Clusters, 0); err != nil {
+ return err
+ }
+ out.AuthInfos = make(map[string]*api.AuthInfo)
+ if err := s.Convert(&in.AuthInfos, &out.AuthInfos, 0); err != nil {
+ return err
+ }
+ out.Contexts = make(map[string]*api.Context)
+ if err := s.Convert(&in.Contexts, &out.Contexts, 0); err != nil {
+ return err
+ }
+ out.Extensions = make(map[string]runtime.Object)
+ if err := s.Convert(&in.Extensions, &out.Extensions, 0); err != nil {
+ return err
+ }
+ return nil
+ },
+ func(in *api.Config, out *Config, s conversion.Scope) error {
+ out.CurrentContext = in.CurrentContext
+ if err := s.Convert(&in.Preferences, &out.Preferences, 0); err != nil {
+ return err
+ }
+
+ out.Clusters = make([]NamedCluster, 0, 0)
+ if err := s.Convert(&in.Clusters, &out.Clusters, 0); err != nil {
+ return err
+ }
+ out.AuthInfos = make([]NamedAuthInfo, 0, 0)
+ if err := s.Convert(&in.AuthInfos, &out.AuthInfos, 0); err != nil {
+ return err
+ }
+ out.Contexts = make([]NamedContext, 0, 0)
+ if err := s.Convert(&in.Contexts, &out.Contexts, 0); err != nil {
+ return err
+ }
+ out.Extensions = make([]NamedExtension, 0, 0)
+ if err := s.Convert(&in.Extensions, &out.Extensions, 0); err != nil {
+ return err
+ }
+ return nil
+ },
+ func(in *[]NamedCluster, out *map[string]*api.Cluster, s conversion.Scope) error {
+ for _, curr := range *in {
+ newCluster := api.NewCluster()
+ if err := s.Convert(&curr.Cluster, newCluster, 0); err != nil {
+ return err
+ }
+ (*out)[curr.Name] = newCluster
+ }
+
+ return nil
+ },
+ func(in *map[string]*api.Cluster, out *[]NamedCluster, s conversion.Scope) error {
+ allKeys := make([]string, 0, len(*in))
+ for key := range *in {
+ allKeys = append(allKeys, key)
+ }
+ sort.Strings(allKeys)
+
+ for _, key := range allKeys {
+ newCluster := (*in)[key]
+ oldCluster := &Cluster{}
+ if err := s.Convert(newCluster, oldCluster, 0); err != nil {
+ return err
+ }
+
+ namedCluster := NamedCluster{key, *oldCluster}
+ *out = append(*out, namedCluster)
+ }
+
+ return nil
+ },
+ func(in *[]NamedAuthInfo, out *map[string]*api.AuthInfo, s conversion.Scope) error {
+ for _, curr := range *in {
+ newAuthInfo := api.NewAuthInfo()
+ if err := s.Convert(&curr.AuthInfo, newAuthInfo, 0); err != nil {
+ return err
+ }
+ (*out)[curr.Name] = newAuthInfo
+ }
+
+ return nil
+ },
+ func(in *map[string]*api.AuthInfo, out *[]NamedAuthInfo, s conversion.Scope) error {
+ allKeys := make([]string, 0, len(*in))
+ for key := range *in {
+ allKeys = append(allKeys, key)
+ }
+ sort.Strings(allKeys)
+
+ for _, key := range allKeys {
+ newAuthInfo := (*in)[key]
+ oldAuthInfo := &AuthInfo{}
+ if err := s.Convert(newAuthInfo, oldAuthInfo, 0); err != nil {
+ return err
+ }
+
+ namedAuthInfo := NamedAuthInfo{key, *oldAuthInfo}
+ *out = append(*out, namedAuthInfo)
+ }
+
+ return nil
+ },
+ func(in *[]NamedContext, out *map[string]*api.Context, s conversion.Scope) error {
+ for _, curr := range *in {
+ newContext := api.NewContext()
+ if err := s.Convert(&curr.Context, newContext, 0); err != nil {
+ return err
+ }
+ (*out)[curr.Name] = newContext
+ }
+
+ return nil
+ },
+ func(in *map[string]*api.Context, out *[]NamedContext, s conversion.Scope) error {
+ allKeys := make([]string, 0, len(*in))
+ for key := range *in {
+ allKeys = append(allKeys, key)
+ }
+ sort.Strings(allKeys)
+
+ for _, key := range allKeys {
+ newContext := (*in)[key]
+ oldContext := &Context{}
+ if err := s.Convert(newContext, oldContext, 0); err != nil {
+ return err
+ }
+
+ namedContext := NamedContext{key, *oldContext}
+ *out = append(*out, namedContext)
+ }
+
+ return nil
+ },
+ func(in *[]NamedExtension, out *map[string]runtime.Object, s conversion.Scope) error {
+ for _, curr := range *in {
+ var newExtension runtime.Object
+ if err := s.Convert(&curr.Extension, &newExtension, 0); err != nil {
+ return err
+ }
+ (*out)[curr.Name] = newExtension
+ }
+
+ return nil
+ },
+ func(in *map[string]runtime.Object, out *[]NamedExtension, s conversion.Scope) error {
+ allKeys := make([]string, 0, len(*in))
+ for key := range *in {
+ allKeys = append(allKeys, key)
+ }
+ sort.Strings(allKeys)
+
+ for _, key := range allKeys {
+ newExtension := (*in)[key]
+ oldExtension := &runtime.RawExtension{}
+ if err := s.Convert(newExtension, oldExtension, 0); err != nil {
+ return err
+ }
+
+ namedExtension := NamedExtension{key, *oldExtension}
+ *out = append(*out, namedExtension)
+ }
+
+ return nil
+ },
+ )
+ if err != nil {
+ // If one of the conversion functions is malformed, detect it immediately.
+ panic(err)
+ }
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/v1/register.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/v1/register.go
new file mode 100644
index 0000000..dcdb533
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/v1/register.go
@@ -0,0 +1,40 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1
+
+import (
+ "k8s.io/kubernetes/pkg/api/unversioned"
+ "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api"
+)
+
+// SchemeGroupVersion is group version used to register these objects
+// TODO this should be in the "kubeconfig" group
+var SchemeGroupVersion = unversioned.GroupVersion{Group: "", Version: "v1"}
+
+func init() {
+ api.Scheme.AddKnownTypes(SchemeGroupVersion,
+ &Config{},
+ )
+}
+
+func (obj *Config) GetObjectKind() unversioned.ObjectKind { return obj }
+func (obj *Config) SetGroupVersionKind(gvk unversioned.GroupVersionKind) {
+ obj.APIVersion, obj.Kind = gvk.ToAPIVersionAndKind()
+}
+func (obj *Config) GroupVersionKind() unversioned.GroupVersionKind {
+ return unversioned.FromAPIVersionAndKind(obj.APIVersion, obj.Kind)
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/v1/types.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/v1/types.go
new file mode 100644
index 0000000..77bce80
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/v1/types.go
@@ -0,0 +1,145 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v1
+
+import (
+ "k8s.io/kubernetes/pkg/runtime"
+)
+
+// Where possible, json tags match the cli argument names.
+// Top level config objects and all values required for proper functioning are not "omitempty". Any truly optional piece of config is allowed to be omitted.
+
+// Config holds the information needed to build connect to remote kubernetes clusters as a given user
+type Config struct {
+ // Legacy field from pkg/api/types.go TypeMeta.
+ // TODO(jlowdermilk): remove this after eliminating downstream dependencies.
+ Kind string `json:"kind,omitempty"`
+ // DEPRECATED: APIVersion is the preferred api version for communicating with the kubernetes cluster (v1, v2, etc).
+ // Because a cluster can run multiple API groups and potentially multiple versions of each, it no longer makes sense to specify
+ // a single value for the cluster version.
+ // This field isn't really needed anyway, so we are deprecating it without replacement.
+ // It will be ignored if it is present.
+ APIVersion string `json:"apiVersion,omitempty"`
+ // Preferences holds general information to be use for cli interactions
+ Preferences Preferences `json:"preferences"`
+ // Clusters is a map of referencable names to cluster configs
+ Clusters []NamedCluster `json:"clusters"`
+ // AuthInfos is a map of referencable names to user configs
+ AuthInfos []NamedAuthInfo `json:"users"`
+ // Contexts is a map of referencable names to context configs
+ Contexts []NamedContext `json:"contexts"`
+ // CurrentContext is the name of the context that you would like to use by default
+ CurrentContext string `json:"current-context"`
+ // Extensions holds additional information. This is useful for extenders so that reads and writes don't clobber unknown fields
+ Extensions []NamedExtension `json:"extensions,omitempty"`
+}
+
+type Preferences struct {
+ Colors bool `json:"colors,omitempty"`
+ // Extensions holds additional information. This is useful for extenders so that reads and writes don't clobber unknown fields
+ Extensions []NamedExtension `json:"extensions,omitempty"`
+}
+
+// Cluster contains information about how to communicate with a kubernetes cluster
+type Cluster struct {
+ // Server is the address of the kubernetes cluster (https://hostname:port).
+ Server string `json:"server"`
+ // APIVersion is the preferred api version for communicating with the kubernetes cluster (v1, v2, etc).
+ APIVersion string `json:"api-version,omitempty"`
+ // InsecureSkipTLSVerify skips the validity check for the server's certificate. This will make your HTTPS connections insecure.
+ InsecureSkipTLSVerify bool `json:"insecure-skip-tls-verify,omitempty"`
+ // CertificateAuthority is the path to a cert file for the certificate authority.
+ CertificateAuthority string `json:"certificate-authority,omitempty"`
+ // CertificateAuthorityData contains PEM-encoded certificate authority certificates. Overrides CertificateAuthority
+ CertificateAuthorityData []byte `json:"certificate-authority-data,omitempty"`
+ // Extensions holds additional information. This is useful for extenders so that reads and writes don't clobber unknown fields
+ Extensions []NamedExtension `json:"extensions,omitempty"`
+}
+
+// AuthInfo contains information that describes identity information. This is use to tell the kubernetes cluster who you are.
+type AuthInfo struct {
+ // ClientCertificate is the path to a client cert file for TLS.
+ ClientCertificate string `json:"client-certificate,omitempty"`
+ // ClientCertificateData contains PEM-encoded data from a client cert file for TLS. Overrides ClientCertificate
+ ClientCertificateData []byte `json:"client-certificate-data,omitempty"`
+ // ClientKey is the path to a client key file for TLS.
+ ClientKey string `json:"client-key,omitempty"`
+ // ClientKeyData contains PEM-encoded data from a client key file for TLS. Overrides ClientKey
+ ClientKeyData []byte `json:"client-key-data,omitempty"`
+ // Token is the bearer token for authentication to the kubernetes cluster.
+ Token string `json:"token,omitempty"`
+ // Impersonate is the username to imperonate. The name matches the flag.
+ Impersonate string `json:"as,omitempty"`
+ // Username is the username for basic authentication to the kubernetes cluster.
+ Username string `json:"username,omitempty"`
+ // Password is the password for basic authentication to the kubernetes cluster.
+ Password string `json:"password,omitempty"`
+ // AuthProvider specifies a custom authentication plugin for the kubernetes cluster.
+ AuthProvider *AuthProviderConfig `json:"auth-provider,omitempty"`
+ // Extensions holds additional information. This is useful for extenders so that reads and writes don't clobber unknown fields
+ Extensions []NamedExtension `json:"extensions,omitempty"`
+}
+
+// Context is a tuple of references to a cluster (how do I communicate with a kubernetes cluster), a user (how do I identify myself), and a namespace (what subset of resources do I want to work with)
+type Context struct {
+ // Cluster is the name of the cluster for this context
+ Cluster string `json:"cluster"`
+ // AuthInfo is the name of the authInfo for this context
+ AuthInfo string `json:"user"`
+ // Namespace is the default namespace to use on unspecified requests
+ Namespace string `json:"namespace,omitempty"`
+ // Extensions holds additional information. This is useful for extenders so that reads and writes don't clobber unknown fields
+ Extensions []NamedExtension `json:"extensions,omitempty"`
+}
+
+// NamedCluster relates nicknames to cluster information
+type NamedCluster struct {
+ // Name is the nickname for this Cluster
+ Name string `json:"name"`
+ // Cluster holds the cluster information
+ Cluster Cluster `json:"cluster"`
+}
+
+// NamedContext relates nicknames to context information
+type NamedContext struct {
+ // Name is the nickname for this Context
+ Name string `json:"name"`
+ // Context holds the context information
+ Context Context `json:"context"`
+}
+
+// NamedAuthInfo relates nicknames to auth information
+type NamedAuthInfo struct {
+ // Name is the nickname for this AuthInfo
+ Name string `json:"name"`
+ // AuthInfo holds the auth information
+ AuthInfo AuthInfo `json:"user"`
+}
+
+// NamedExtension relates nicknames to extension information
+type NamedExtension struct {
+ // Name is the nickname for this Extension
+ Name string `json:"name"`
+ // Extension holds the extension information
+ Extension runtime.RawExtension `json:"extension"`
+}
+
+// AuthProviderConfig holds the configuration for a specified auth provider.
+type AuthProviderConfig struct {
+ Name string `json:"name"`
+ Config map[string]string `json:"config"`
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/auth_loaders.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/auth_loaders.go
new file mode 100644
index 0000000..0abc425
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/auth_loaders.go
@@ -0,0 +1,91 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package clientcmd
+
+import (
+ "encoding/json"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "os"
+
+ clientauth "k8s.io/kubernetes/pkg/client/unversioned/auth"
+)
+
+// AuthLoaders are used to build clientauth.Info objects.
+type AuthLoader interface {
+ // LoadAuth takes a path to a config file and can then do anything it needs in order to return a valid clientauth.Info
+ LoadAuth(path string) (*clientauth.Info, error)
+}
+
+// default implementation of an AuthLoader
+type defaultAuthLoader struct{}
+
+// LoadAuth for defaultAuthLoader simply delegates to clientauth.LoadFromFile
+func (*defaultAuthLoader) LoadAuth(path string) (*clientauth.Info, error) {
+ return clientauth.LoadFromFile(path)
+}
+
+type PromptingAuthLoader struct {
+ reader io.Reader
+}
+
+// LoadAuth parses an AuthInfo object from a file path. It prompts user and creates file if it doesn't exist.
+func (a *PromptingAuthLoader) LoadAuth(path string) (*clientauth.Info, error) {
+ var auth clientauth.Info
+ // Prompt for user/pass and write a file if none exists.
+ if _, err := os.Stat(path); os.IsNotExist(err) {
+ auth = *a.Prompt()
+ data, err := json.Marshal(auth)
+ if err != nil {
+ return &auth, err
+ }
+ err = ioutil.WriteFile(path, data, 0600)
+ return &auth, err
+ }
+ authPtr, err := clientauth.LoadFromFile(path)
+ if err != nil {
+ return nil, err
+ }
+ return authPtr, nil
+}
+
+// Prompt pulls the user and password from a reader
+func (a *PromptingAuthLoader) Prompt() *clientauth.Info {
+ auth := &clientauth.Info{}
+ auth.User = promptForString("Username", a.reader)
+ auth.Password = promptForString("Password", a.reader)
+
+ return auth
+}
+
+func promptForString(field string, r io.Reader) string {
+ fmt.Printf("Please enter %s: ", field)
+ var result string
+ fmt.Fscan(r, &result)
+ return result
+}
+
+// NewPromptingAuthLoader is an AuthLoader that parses an AuthInfo object from a file path. It prompts user and creates file if it doesn't exist.
+func NewPromptingAuthLoader(reader io.Reader) *PromptingAuthLoader {
+ return &PromptingAuthLoader{reader}
+}
+
+// NewDefaultAuthLoader returns a default implementation of an AuthLoader that only reads from a config file
+func NewDefaultAuthLoader() AuthLoader {
+ return &defaultAuthLoader{}
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/client_config.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/client_config.go
new file mode 100644
index 0000000..47b14e2
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/client_config.go
@@ -0,0 +1,411 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package clientcmd
+
+import (
+ "fmt"
+ "io"
+ "io/ioutil"
+ "net/url"
+ "os"
+ "strings"
+
+ "github.com/golang/glog"
+ "github.com/imdario/mergo"
+
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/client/restclient"
+ clientauth "k8s.io/kubernetes/pkg/client/unversioned/auth"
+ clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api"
+)
+
+var (
+ // DefaultCluster is the cluster config used when no other config is specified
+ // TODO: eventually apiserver should start on 443 and be secure by default
+ DefaultCluster = clientcmdapi.Cluster{Server: "http://localhost:8080"}
+
+ // EnvVarCluster allows overriding the DefaultCluster using an envvar for the server name
+ EnvVarCluster = clientcmdapi.Cluster{Server: os.Getenv("KUBERNETES_MASTER")}
+
+ DefaultClientConfig = DirectClientConfig{*clientcmdapi.NewConfig(), "", &ConfigOverrides{}, nil, NewDefaultClientConfigLoadingRules()}
+)
+
+// ClientConfig is used to make it easy to get an api server client
+type ClientConfig interface {
+ // RawConfig returns the merged result of all overrides
+ RawConfig() (clientcmdapi.Config, error)
+ // ClientConfig returns a complete client config
+ ClientConfig() (*restclient.Config, error)
+ // Namespace returns the namespace resulting from the merged
+ // result of all overrides and a boolean indicating if it was
+ // overridden
+ Namespace() (string, bool, error)
+ // ConfigAccess returns the rules for loading/persisting the config.
+ ConfigAccess() ConfigAccess
+}
+
+type PersistAuthProviderConfigForUser func(user string) restclient.AuthProviderConfigPersister
+
+// DirectClientConfig is a ClientConfig interface that is backed by a clientcmdapi.Config, options overrides, and an optional fallbackReader for auth information
+type DirectClientConfig struct {
+ config clientcmdapi.Config
+ contextName string
+ overrides *ConfigOverrides
+ fallbackReader io.Reader
+ configAccess ConfigAccess
+}
+
+// NewDefaultClientConfig creates a DirectClientConfig using the config.CurrentContext as the context name
+func NewDefaultClientConfig(config clientcmdapi.Config, overrides *ConfigOverrides) ClientConfig {
+ return &DirectClientConfig{config, config.CurrentContext, overrides, nil, NewDefaultClientConfigLoadingRules()}
+}
+
+// NewNonInteractiveClientConfig creates a DirectClientConfig using the passed context name and does not have a fallback reader for auth information
+func NewNonInteractiveClientConfig(config clientcmdapi.Config, contextName string, overrides *ConfigOverrides, configAccess ConfigAccess) ClientConfig {
+ return &DirectClientConfig{config, contextName, overrides, nil, configAccess}
+}
+
+// NewInteractiveClientConfig creates a DirectClientConfig using the passed context name and a reader in case auth information is not provided via files or flags
+func NewInteractiveClientConfig(config clientcmdapi.Config, contextName string, overrides *ConfigOverrides, fallbackReader io.Reader, configAccess ConfigAccess) ClientConfig {
+ return &DirectClientConfig{config, contextName, overrides, fallbackReader, configAccess}
+}
+
+func (config *DirectClientConfig) RawConfig() (clientcmdapi.Config, error) {
+ return config.config, nil
+}
+
+// ClientConfig implements ClientConfig
+func (config *DirectClientConfig) ClientConfig() (*restclient.Config, error) {
+ if err := config.ConfirmUsable(); err != nil {
+ return nil, err
+ }
+
+ configAuthInfo := config.getAuthInfo()
+ configClusterInfo := config.getCluster()
+
+ clientConfig := &restclient.Config{}
+ clientConfig.Host = configClusterInfo.Server
+ if u, err := url.ParseRequestURI(clientConfig.Host); err == nil && u.Opaque == "" && len(u.Path) > 1 {
+ u.RawQuery = ""
+ u.Fragment = ""
+ clientConfig.Host = u.String()
+ }
+ if len(configAuthInfo.Impersonate) > 0 {
+ clientConfig.Impersonate = configAuthInfo.Impersonate
+ }
+
+ // only try to read the auth information if we are secure
+ if restclient.IsConfigTransportTLS(*clientConfig) {
+ var err error
+
+ // mergo is a first write wins for map value and a last writing wins for interface values
+ // NOTE: This behavior changed with https://github.com/imdario/mergo/commit/d304790b2ed594794496464fadd89d2bb266600a.
+ // Our mergo.Merge version is older than this change.
+ var persister restclient.AuthProviderConfigPersister
+ if config.configAccess != nil {
+ persister = PersisterForUser(config.configAccess, config.getAuthInfoName())
+ }
+ userAuthPartialConfig, err := getUserIdentificationPartialConfig(configAuthInfo, config.fallbackReader, persister)
+ if err != nil {
+ return nil, err
+ }
+ mergo.Merge(clientConfig, userAuthPartialConfig)
+
+ serverAuthPartialConfig, err := getServerIdentificationPartialConfig(configAuthInfo, configClusterInfo)
+ if err != nil {
+ return nil, err
+ }
+ mergo.Merge(clientConfig, serverAuthPartialConfig)
+ }
+
+ return clientConfig, nil
+}
+
+// clientauth.Info object contain both user identification and server identification. We want different precedence orders for
+// both, so we have to split the objects and merge them separately
+// we want this order of precedence for the server identification
+// 1. configClusterInfo (the final result of command line flags and merged .kubeconfig files)
+// 2. configAuthInfo.auth-path (this file can contain information that conflicts with #1, and we want #1 to win the priority)
+// 3. load the ~/.kubernetes_auth file as a default
+func getServerIdentificationPartialConfig(configAuthInfo clientcmdapi.AuthInfo, configClusterInfo clientcmdapi.Cluster) (*restclient.Config, error) {
+ mergedConfig := &restclient.Config{}
+
+ // configClusterInfo holds the information identify the server provided by .kubeconfig
+ configClientConfig := &restclient.Config{}
+ configClientConfig.CAFile = configClusterInfo.CertificateAuthority
+ configClientConfig.CAData = configClusterInfo.CertificateAuthorityData
+ configClientConfig.Insecure = configClusterInfo.InsecureSkipTLSVerify
+ mergo.Merge(mergedConfig, configClientConfig)
+
+ return mergedConfig, nil
+}
+
+// clientauth.Info object contain both user identification and server identification. We want different precedence orders for
+// both, so we have to split the objects and merge them separately
+// we want this order of precedence for user identifcation
+// 1. configAuthInfo minus auth-path (the final result of command line flags and merged .kubeconfig files)
+// 2. configAuthInfo.auth-path (this file can contain information that conflicts with #1, and we want #1 to win the priority)
+// 3. if there is not enough information to idenfity the user, load try the ~/.kubernetes_auth file
+// 4. if there is not enough information to identify the user, prompt if possible
+func getUserIdentificationPartialConfig(configAuthInfo clientcmdapi.AuthInfo, fallbackReader io.Reader, persistAuthConfig restclient.AuthProviderConfigPersister) (*restclient.Config, error) {
+ mergedConfig := &restclient.Config{}
+
+ // blindly overwrite existing values based on precedence
+ if len(configAuthInfo.Token) > 0 {
+ mergedConfig.BearerToken = configAuthInfo.Token
+ }
+ if len(configAuthInfo.Impersonate) > 0 {
+ mergedConfig.Impersonate = configAuthInfo.Impersonate
+ }
+ if len(configAuthInfo.ClientCertificate) > 0 || len(configAuthInfo.ClientCertificateData) > 0 {
+ mergedConfig.CertFile = configAuthInfo.ClientCertificate
+ mergedConfig.CertData = configAuthInfo.ClientCertificateData
+ mergedConfig.KeyFile = configAuthInfo.ClientKey
+ mergedConfig.KeyData = configAuthInfo.ClientKeyData
+ }
+ if len(configAuthInfo.Username) > 0 || len(configAuthInfo.Password) > 0 {
+ mergedConfig.Username = configAuthInfo.Username
+ mergedConfig.Password = configAuthInfo.Password
+ }
+ if configAuthInfo.AuthProvider != nil {
+ mergedConfig.AuthProvider = configAuthInfo.AuthProvider
+ mergedConfig.AuthConfigPersister = persistAuthConfig
+ }
+
+ // if there still isn't enough information to authenticate the user, try prompting
+ if !canIdentifyUser(*mergedConfig) && (fallbackReader != nil) {
+ prompter := NewPromptingAuthLoader(fallbackReader)
+ promptedAuthInfo := prompter.Prompt()
+
+ promptedConfig := makeUserIdentificationConfig(*promptedAuthInfo)
+ previouslyMergedConfig := mergedConfig
+ mergedConfig = &restclient.Config{}
+ mergo.Merge(mergedConfig, promptedConfig)
+ mergo.Merge(mergedConfig, previouslyMergedConfig)
+ }
+
+ return mergedConfig, nil
+}
+
+// makeUserIdentificationFieldsConfig returns a client.Config capable of being merged using mergo for only user identification information
+func makeUserIdentificationConfig(info clientauth.Info) *restclient.Config {
+ config := &restclient.Config{}
+ config.Username = info.User
+ config.Password = info.Password
+ config.CertFile = info.CertFile
+ config.KeyFile = info.KeyFile
+ config.BearerToken = info.BearerToken
+ return config
+}
+
+// makeUserIdentificationFieldsConfig returns a client.Config capable of being merged using mergo for only server identification information
+func makeServerIdentificationConfig(info clientauth.Info) restclient.Config {
+ config := restclient.Config{}
+ config.CAFile = info.CAFile
+ if info.Insecure != nil {
+ config.Insecure = *info.Insecure
+ }
+ return config
+}
+
+func canIdentifyUser(config restclient.Config) bool {
+ return len(config.Username) > 0 ||
+ (len(config.CertFile) > 0 || len(config.CertData) > 0) ||
+ len(config.BearerToken) > 0 ||
+ config.AuthProvider != nil
+}
+
+// Namespace implements ClientConfig
+func (config *DirectClientConfig) Namespace() (string, bool, error) {
+ if err := config.ConfirmUsable(); err != nil {
+ return "", false, err
+ }
+
+ configContext := config.getContext()
+
+ if len(configContext.Namespace) == 0 {
+ return api.NamespaceDefault, false, nil
+ }
+
+ overridden := false
+ if config.overrides != nil && config.overrides.Context.Namespace != "" {
+ overridden = true
+ }
+ return configContext.Namespace, overridden, nil
+}
+
+// ConfigAccess implements ClientConfig
+func (config *DirectClientConfig) ConfigAccess() ConfigAccess {
+ return config.configAccess
+}
+
+// ConfirmUsable looks a particular context and determines if that particular part of the config is useable. There might still be errors in the config,
+// but no errors in the sections requested or referenced. It does not return early so that it can find as many errors as possible.
+func (config *DirectClientConfig) ConfirmUsable() error {
+ validationErrors := make([]error, 0)
+ validationErrors = append(validationErrors, validateAuthInfo(config.getAuthInfoName(), config.getAuthInfo())...)
+ validationErrors = append(validationErrors, validateClusterInfo(config.getClusterName(), config.getCluster())...)
+ // when direct client config is specified, and our only error is that no server is defined, we should
+ // return a standard "no config" error
+ if len(validationErrors) == 1 && validationErrors[0] == ErrEmptyCluster {
+ return newErrConfigurationInvalid([]error{ErrEmptyConfig})
+ }
+ return newErrConfigurationInvalid(validationErrors)
+}
+
+func (config *DirectClientConfig) getContextName() string {
+ if len(config.overrides.CurrentContext) != 0 {
+ return config.overrides.CurrentContext
+ }
+ if len(config.contextName) != 0 {
+ return config.contextName
+ }
+
+ return config.config.CurrentContext
+}
+
+func (config *DirectClientConfig) getAuthInfoName() string {
+ if len(config.overrides.Context.AuthInfo) != 0 {
+ return config.overrides.Context.AuthInfo
+ }
+ return config.getContext().AuthInfo
+}
+
+func (config *DirectClientConfig) getClusterName() string {
+ if len(config.overrides.Context.Cluster) != 0 {
+ return config.overrides.Context.Cluster
+ }
+ return config.getContext().Cluster
+}
+
+func (config *DirectClientConfig) getContext() clientcmdapi.Context {
+ contexts := config.config.Contexts
+ contextName := config.getContextName()
+
+ var mergedContext clientcmdapi.Context
+ if configContext, exists := contexts[contextName]; exists {
+ mergo.Merge(&mergedContext, configContext)
+ }
+ mergo.Merge(&mergedContext, config.overrides.Context)
+
+ return mergedContext
+}
+
+func (config *DirectClientConfig) getAuthInfo() clientcmdapi.AuthInfo {
+ authInfos := config.config.AuthInfos
+ authInfoName := config.getAuthInfoName()
+
+ var mergedAuthInfo clientcmdapi.AuthInfo
+ if configAuthInfo, exists := authInfos[authInfoName]; exists {
+ mergo.Merge(&mergedAuthInfo, configAuthInfo)
+ }
+ mergo.Merge(&mergedAuthInfo, config.overrides.AuthInfo)
+
+ return mergedAuthInfo
+}
+
+func (config *DirectClientConfig) getCluster() clientcmdapi.Cluster {
+ clusterInfos := config.config.Clusters
+ clusterInfoName := config.getClusterName()
+
+ var mergedClusterInfo clientcmdapi.Cluster
+ mergo.Merge(&mergedClusterInfo, DefaultCluster)
+ mergo.Merge(&mergedClusterInfo, EnvVarCluster)
+ if configClusterInfo, exists := clusterInfos[clusterInfoName]; exists {
+ mergo.Merge(&mergedClusterInfo, configClusterInfo)
+ }
+ mergo.Merge(&mergedClusterInfo, config.overrides.ClusterInfo)
+ // An override of --insecure-skip-tls-verify=true and no accompanying CA/CA data should clear already-set CA/CA data
+ // otherwise, a kubeconfig containing a CA reference would return an error that "CA and insecure-skip-tls-verify couldn't both be set"
+ caLen := len(config.overrides.ClusterInfo.CertificateAuthority)
+ caDataLen := len(config.overrides.ClusterInfo.CertificateAuthorityData)
+ if config.overrides.ClusterInfo.InsecureSkipTLSVerify && caLen == 0 && caDataLen == 0 {
+ mergedClusterInfo.CertificateAuthority = ""
+ mergedClusterInfo.CertificateAuthorityData = nil
+ }
+
+ return mergedClusterInfo
+}
+
+// inClusterClientConfig makes a config that will work from within a kubernetes cluster container environment.
+type inClusterClientConfig struct{}
+
+func (inClusterClientConfig) RawConfig() (clientcmdapi.Config, error) {
+ return clientcmdapi.Config{}, fmt.Errorf("inCluster environment config doesn't support multiple clusters")
+}
+
+func (inClusterClientConfig) ClientConfig() (*restclient.Config, error) {
+ return restclient.InClusterConfig()
+}
+
+func (inClusterClientConfig) Namespace() (string, error) {
+ // This way assumes you've set the POD_NAMESPACE environment variable using the downward API.
+ // This check has to be done first for backwards compatibility with the way InClusterConfig was originally set up
+ if ns := os.Getenv("POD_NAMESPACE"); ns != "" {
+ return ns, nil
+ }
+
+ // Fall back to the namespace associated with the service account token, if available
+ if data, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/namespace"); err == nil {
+ if ns := strings.TrimSpace(string(data)); len(ns) > 0 {
+ return ns, nil
+ }
+ }
+
+ return "default", nil
+}
+
+func (inClusterClientConfig) ConfigAccess() ConfigAccess {
+ return NewDefaultClientConfigLoadingRules()
+}
+
+// Possible returns true if loading an inside-kubernetes-cluster is possible.
+func (inClusterClientConfig) Possible() bool {
+ fi, err := os.Stat("/var/run/secrets/kubernetes.io/serviceaccount/token")
+ return os.Getenv("KUBERNETES_SERVICE_HOST") != "" &&
+ os.Getenv("KUBERNETES_SERVICE_PORT") != "" &&
+ err == nil && !fi.IsDir()
+}
+
+// BuildConfigFromFlags is a helper function that builds configs from a master
+// url or a kubeconfig filepath. These are passed in as command line flags for cluster
+// components. Warnings should reflect this usage. If neither masterUrl or kubeconfigPath
+// are passed in we fallback to inClusterConfig. If inClusterConfig fails, we fallback
+// to the default config.
+func BuildConfigFromFlags(masterUrl, kubeconfigPath string) (*restclient.Config, error) {
+ if kubeconfigPath == "" && masterUrl == "" {
+ glog.Warningf("Neither --kubeconfig nor --master was specified. Using the inClusterConfig. This might not work.")
+ kubeconfig, err := restclient.InClusterConfig()
+ if err == nil {
+ return kubeconfig, nil
+ }
+ glog.Warning("error creating inClusterConfig, falling back to default config: ", err)
+ }
+ return NewNonInteractiveDeferredLoadingClientConfig(
+ &ClientConfigLoadingRules{ExplicitPath: kubeconfigPath},
+ &ConfigOverrides{ClusterInfo: clientcmdapi.Cluster{Server: masterUrl}}).ClientConfig()
+}
+
+// BuildConfigFromKubeconfigGetter is a helper function that builds configs from a master
+// url and a kubeconfigGetter.
+func BuildConfigFromKubeconfigGetter(masterUrl string, kubeconfigGetter KubeconfigGetter) (*restclient.Config, error) {
+ // TODO: We do not need a DeferredLoader here. Refactor code and see if we can use DirectClientConfig here.
+ cc := NewNonInteractiveDeferredLoadingClientConfig(
+ &ClientConfigGetter{kubeconfigGetter: kubeconfigGetter},
+ &ConfigOverrides{ClusterInfo: clientcmdapi.Cluster{Server: masterUrl}})
+ return cc.ClientConfig()
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/config.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/config.go
new file mode 100644
index 0000000..9df69a7
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/config.go
@@ -0,0 +1,472 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package clientcmd
+
+import (
+ "errors"
+ "os"
+ "path"
+ "path/filepath"
+ "reflect"
+ "sort"
+
+ "github.com/golang/glog"
+
+ "k8s.io/kubernetes/pkg/client/restclient"
+ clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api"
+)
+
+// ConfigAccess is used by subcommands and methods in this package to load and modify the appropriate config files
+type ConfigAccess interface {
+ // GetLoadingPrecedence returns the slice of files that should be used for loading and inspecting the config
+ GetLoadingPrecedence() []string
+ // GetStartingConfig returns the config that subcommands should being operating against. It may or may not be merged depending on loading rules
+ GetStartingConfig() (*clientcmdapi.Config, error)
+ // GetDefaultFilename returns the name of the file you should write into (create if necessary), if you're trying to create a new stanza as opposed to updating an existing one.
+ GetDefaultFilename() string
+ // IsExplicitFile indicates whether or not this command is interested in exactly one file. This implementation only ever does that via a flag, but implementations that handle local, global, and flags may have more
+ IsExplicitFile() bool
+ // GetExplicitFile returns the particular file this command is operating against. This implementation only ever has one, but implementations that handle local, global, and flags may have more
+ GetExplicitFile() string
+}
+
+type PathOptions struct {
+ // GlobalFile is the full path to the file to load as the global (final) option
+ GlobalFile string
+ // EnvVar is the env var name that points to the list of kubeconfig files to load
+ EnvVar string
+ // ExplicitFileFlag is the name of the flag to use for prompting for the kubeconfig file
+ ExplicitFileFlag string
+
+ // GlobalFileSubpath is an optional value used for displaying help
+ GlobalFileSubpath string
+
+ LoadingRules *ClientConfigLoadingRules
+}
+
+func (o *PathOptions) GetEnvVarFiles() []string {
+ if len(o.EnvVar) == 0 {
+ return []string{}
+ }
+
+ envVarValue := os.Getenv(o.EnvVar)
+ if len(envVarValue) == 0 {
+ return []string{}
+ }
+
+ return filepath.SplitList(envVarValue)
+}
+
+func (o *PathOptions) GetLoadingPrecedence() []string {
+ if envVarFiles := o.GetEnvVarFiles(); len(envVarFiles) > 0 {
+ return envVarFiles
+ }
+
+ return []string{o.GlobalFile}
+}
+
+func (o *PathOptions) GetStartingConfig() (*clientcmdapi.Config, error) {
+ // don't mutate the original
+ loadingRules := *o.LoadingRules
+ loadingRules.Precedence = o.GetLoadingPrecedence()
+
+ clientConfig := NewNonInteractiveDeferredLoadingClientConfig(&loadingRules, &ConfigOverrides{})
+ rawConfig, err := clientConfig.RawConfig()
+ if os.IsNotExist(err) {
+ return clientcmdapi.NewConfig(), nil
+ }
+ if err != nil {
+ return nil, err
+ }
+
+ return &rawConfig, nil
+}
+
+func (o *PathOptions) GetDefaultFilename() string {
+ if o.IsExplicitFile() {
+ return o.GetExplicitFile()
+ }
+
+ if envVarFiles := o.GetEnvVarFiles(); len(envVarFiles) > 0 {
+ if len(envVarFiles) == 1 {
+ return envVarFiles[0]
+ }
+
+ // if any of the envvar files already exists, return it
+ for _, envVarFile := range envVarFiles {
+ if _, err := os.Stat(envVarFile); err == nil {
+ return envVarFile
+ }
+ }
+
+ // otherwise, return the last one in the list
+ return envVarFiles[len(envVarFiles)-1]
+ }
+
+ return o.GlobalFile
+}
+
+func (o *PathOptions) IsExplicitFile() bool {
+ if len(o.LoadingRules.ExplicitPath) > 0 {
+ return true
+ }
+
+ return false
+}
+
+func (o *PathOptions) GetExplicitFile() string {
+ return o.LoadingRules.ExplicitPath
+}
+
+func NewDefaultPathOptions() *PathOptions {
+ ret := &PathOptions{
+ GlobalFile: RecommendedHomeFile,
+ EnvVar: RecommendedConfigPathEnvVar,
+ ExplicitFileFlag: RecommendedConfigPathFlag,
+
+ GlobalFileSubpath: path.Join(RecommendedHomeDir, RecommendedFileName),
+
+ LoadingRules: NewDefaultClientConfigLoadingRules(),
+ }
+ ret.LoadingRules.DoNotResolvePaths = true
+
+ return ret
+}
+
+// ModifyConfig takes a Config object, iterates through Clusters, AuthInfos, and Contexts, uses the LocationOfOrigin if specified or
+// uses the default destination file to write the results into. This results in multiple file reads, but it's very easy to follow.
+// Preferences and CurrentContext should always be set in the default destination file. Since we can't distinguish between empty and missing values
+// (no nil strings), we're forced have separate handling for them. In the kubeconfig cases, newConfig should have at most one difference,
+// that means that this code will only write into a single file. If you want to relativizePaths, you must provide a fully qualified path in any
+// modified element.
+func ModifyConfig(configAccess ConfigAccess, newConfig clientcmdapi.Config, relativizePaths bool) error {
+ possibleSources := configAccess.GetLoadingPrecedence()
+ // sort the possible kubeconfig files so we always "lock" in the same order
+ // to avoid deadlock (note: this can fail w/ symlinks, but... come on).
+ sort.Strings(possibleSources)
+ for _, filename := range possibleSources {
+ if err := lockFile(filename); err != nil {
+ return err
+ }
+ defer unlockFile(filename)
+ }
+
+ startingConfig, err := configAccess.GetStartingConfig()
+ if err != nil {
+ return err
+ }
+
+ // We need to find all differences, locate their original files, read a partial config to modify only that stanza and write out the file.
+ // Special case the test for current context and preferences since those always write to the default file.
+ if reflect.DeepEqual(*startingConfig, newConfig) {
+ // nothing to do
+ return nil
+ }
+
+ if startingConfig.CurrentContext != newConfig.CurrentContext {
+ if err := writeCurrentContext(configAccess, newConfig.CurrentContext); err != nil {
+ return err
+ }
+ }
+
+ if !reflect.DeepEqual(startingConfig.Preferences, newConfig.Preferences) {
+ if err := writePreferences(configAccess, newConfig.Preferences); err != nil {
+ return err
+ }
+ }
+
+ // Search every cluster, authInfo, and context. First from new to old for differences, then from old to new for deletions
+ for key, cluster := range newConfig.Clusters {
+ startingCluster, exists := startingConfig.Clusters[key]
+ if !reflect.DeepEqual(cluster, startingCluster) || !exists {
+ destinationFile := cluster.LocationOfOrigin
+ if len(destinationFile) == 0 {
+ destinationFile = configAccess.GetDefaultFilename()
+ }
+
+ configToWrite, err := getConfigFromFile(destinationFile)
+ if err != nil {
+ return err
+ }
+ t := *cluster
+
+ configToWrite.Clusters[key] = &t
+ configToWrite.Clusters[key].LocationOfOrigin = destinationFile
+ if relativizePaths {
+ if err := RelativizeClusterLocalPaths(configToWrite.Clusters[key]); err != nil {
+ return err
+ }
+ }
+
+ if err := WriteToFile(*configToWrite, destinationFile); err != nil {
+ return err
+ }
+ }
+ }
+
+ for key, context := range newConfig.Contexts {
+ startingContext, exists := startingConfig.Contexts[key]
+ if !reflect.DeepEqual(context, startingContext) || !exists {
+ destinationFile := context.LocationOfOrigin
+ if len(destinationFile) == 0 {
+ destinationFile = configAccess.GetDefaultFilename()
+ }
+
+ configToWrite, err := getConfigFromFile(destinationFile)
+ if err != nil {
+ return err
+ }
+ configToWrite.Contexts[key] = context
+
+ if err := WriteToFile(*configToWrite, destinationFile); err != nil {
+ return err
+ }
+ }
+ }
+
+ for key, authInfo := range newConfig.AuthInfos {
+ startingAuthInfo, exists := startingConfig.AuthInfos[key]
+ if !reflect.DeepEqual(authInfo, startingAuthInfo) || !exists {
+ destinationFile := authInfo.LocationOfOrigin
+ if len(destinationFile) == 0 {
+ destinationFile = configAccess.GetDefaultFilename()
+ }
+
+ configToWrite, err := getConfigFromFile(destinationFile)
+ if err != nil {
+ return err
+ }
+ t := *authInfo
+ configToWrite.AuthInfos[key] = &t
+ configToWrite.AuthInfos[key].LocationOfOrigin = destinationFile
+ if relativizePaths {
+ if err := RelativizeAuthInfoLocalPaths(configToWrite.AuthInfos[key]); err != nil {
+ return err
+ }
+ }
+
+ if err := WriteToFile(*configToWrite, destinationFile); err != nil {
+ return err
+ }
+ }
+ }
+
+ for key, cluster := range startingConfig.Clusters {
+ if _, exists := newConfig.Clusters[key]; !exists {
+ destinationFile := cluster.LocationOfOrigin
+ if len(destinationFile) == 0 {
+ destinationFile = configAccess.GetDefaultFilename()
+ }
+
+ configToWrite, err := getConfigFromFile(destinationFile)
+ if err != nil {
+ return err
+ }
+ delete(configToWrite.Clusters, key)
+
+ if err := WriteToFile(*configToWrite, destinationFile); err != nil {
+ return err
+ }
+ }
+ }
+
+ for key, context := range startingConfig.Contexts {
+ if _, exists := newConfig.Contexts[key]; !exists {
+ destinationFile := context.LocationOfOrigin
+ if len(destinationFile) == 0 {
+ destinationFile = configAccess.GetDefaultFilename()
+ }
+
+ configToWrite, err := getConfigFromFile(destinationFile)
+ if err != nil {
+ return err
+ }
+ delete(configToWrite.Contexts, key)
+
+ if err := WriteToFile(*configToWrite, destinationFile); err != nil {
+ return err
+ }
+ }
+ }
+
+ for key, authInfo := range startingConfig.AuthInfos {
+ if _, exists := newConfig.AuthInfos[key]; !exists {
+ destinationFile := authInfo.LocationOfOrigin
+ if len(destinationFile) == 0 {
+ destinationFile = configAccess.GetDefaultFilename()
+ }
+
+ configToWrite, err := getConfigFromFile(destinationFile)
+ if err != nil {
+ return err
+ }
+ delete(configToWrite.AuthInfos, key)
+
+ if err := WriteToFile(*configToWrite, destinationFile); err != nil {
+ return err
+ }
+ }
+ }
+
+ return nil
+}
+
+func PersisterForUser(configAccess ConfigAccess, user string) restclient.AuthProviderConfigPersister {
+ return &persister{configAccess, user}
+}
+
+type persister struct {
+ configAccess ConfigAccess
+ user string
+}
+
+func (p *persister) Persist(config map[string]string) error {
+ newConfig, err := p.configAccess.GetStartingConfig()
+ if err != nil {
+ return err
+ }
+ authInfo, ok := newConfig.AuthInfos[p.user]
+ if ok && authInfo.AuthProvider != nil {
+ authInfo.AuthProvider.Config = config
+ ModifyConfig(p.configAccess, *newConfig, false)
+ }
+ return nil
+}
+
+// writeCurrentContext takes three possible paths.
+// If newCurrentContext is the same as the startingConfig's current context, then we exit.
+// If newCurrentContext has a value, then that value is written into the default destination file.
+// If newCurrentContext is empty, then we find the config file that is setting the CurrentContext and clear the value from that file
+func writeCurrentContext(configAccess ConfigAccess, newCurrentContext string) error {
+ if startingConfig, err := configAccess.GetStartingConfig(); err != nil {
+ return err
+ } else if startingConfig.CurrentContext == newCurrentContext {
+ return nil
+ }
+
+ if configAccess.IsExplicitFile() {
+ file := configAccess.GetExplicitFile()
+ currConfig, err := getConfigFromFile(file)
+ if err != nil {
+ return err
+ }
+ currConfig.CurrentContext = newCurrentContext
+ if err := WriteToFile(*currConfig, file); err != nil {
+ return err
+ }
+
+ return nil
+ }
+
+ if len(newCurrentContext) > 0 {
+ destinationFile := configAccess.GetDefaultFilename()
+ config, err := getConfigFromFile(destinationFile)
+ if err != nil {
+ return err
+ }
+ config.CurrentContext = newCurrentContext
+
+ if err := WriteToFile(*config, destinationFile); err != nil {
+ return err
+ }
+
+ return nil
+ }
+
+ // we're supposed to be clearing the current context. We need to find the first spot in the chain that is setting it and clear it
+ for _, file := range configAccess.GetLoadingPrecedence() {
+ if _, err := os.Stat(file); err == nil {
+ currConfig, err := getConfigFromFile(file)
+ if err != nil {
+ return err
+ }
+
+ if len(currConfig.CurrentContext) > 0 {
+ currConfig.CurrentContext = newCurrentContext
+ if err := WriteToFile(*currConfig, file); err != nil {
+ return err
+ }
+
+ return nil
+ }
+ }
+ }
+
+ return errors.New("no config found to write context")
+}
+
+func writePreferences(configAccess ConfigAccess, newPrefs clientcmdapi.Preferences) error {
+ if startingConfig, err := configAccess.GetStartingConfig(); err != nil {
+ return err
+ } else if reflect.DeepEqual(startingConfig.Preferences, newPrefs) {
+ return nil
+ }
+
+ if configAccess.IsExplicitFile() {
+ file := configAccess.GetExplicitFile()
+ currConfig, err := getConfigFromFile(file)
+ if err != nil {
+ return err
+ }
+ currConfig.Preferences = newPrefs
+ if err := WriteToFile(*currConfig, file); err != nil {
+ return err
+ }
+
+ return nil
+ }
+
+ for _, file := range configAccess.GetLoadingPrecedence() {
+ currConfig, err := getConfigFromFile(file)
+ if err != nil {
+ return err
+ }
+
+ if !reflect.DeepEqual(currConfig.Preferences, newPrefs) {
+ currConfig.Preferences = newPrefs
+ if err := WriteToFile(*currConfig, file); err != nil {
+ return err
+ }
+
+ return nil
+ }
+ }
+
+ return errors.New("no config found to write preferences")
+}
+
+// getConfigFromFile tries to read a kubeconfig file and if it can't, returns an error. One exception, missing files result in empty configs, not an error.
+func getConfigFromFile(filename string) (*clientcmdapi.Config, error) {
+ config, err := LoadFromFile(filename)
+ if err != nil && !os.IsNotExist(err) {
+ return nil, err
+ }
+ if config == nil {
+ config = clientcmdapi.NewConfig()
+ }
+ return config, nil
+}
+
+// GetConfigFromFileOrDie tries to read a kubeconfig file and if it can't, it calls exit. One exception, missing files result in empty configs, not an exit
+func GetConfigFromFileOrDie(filename string) *clientcmdapi.Config {
+ config, err := getConfigFromFile(filename)
+ if err != nil {
+ glog.FatalDepth(1, err)
+ }
+
+ return config
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/doc.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/doc.go
new file mode 100644
index 0000000..30ef6f3
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/doc.go
@@ -0,0 +1,37 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+/*
+Package clientcmd provides one stop shopping for building a working client from a fixed config,
+from a .kubeconfig file, from command line flags, or from any merged combination.
+
+Sample usage from merged .kubeconfig files (local directory, home directory)
+
+ loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
+ // if you want to change the loading rules (which files in which order), you can do so here
+
+ configOverrides := &clientcmd.ConfigOverrides{}
+ // if you want to change override values or bind them to flags, there are methods to help you
+
+ kubeConfig := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loadingRules, configOverrides)
+ config, err := kubeConfig.ClientConfig()
+ if err != nil {
+ // Do something
+ }
+ client, err := unversioned.New(config)
+ // ...
+*/
+package clientcmd
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/loader.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/loader.go
new file mode 100644
index 0000000..1009406
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/loader.go
@@ -0,0 +1,585 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package clientcmd
+
+import (
+ "fmt"
+ "io"
+ "io/ioutil"
+ "os"
+ "path"
+ "path/filepath"
+ goruntime "runtime"
+ "strings"
+
+ "github.com/golang/glog"
+ "github.com/imdario/mergo"
+
+ "k8s.io/kubernetes/pkg/api/unversioned"
+ clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api"
+ clientcmdlatest "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api/latest"
+ "k8s.io/kubernetes/pkg/runtime"
+ utilerrors "k8s.io/kubernetes/pkg/util/errors"
+ "k8s.io/kubernetes/pkg/util/homedir"
+)
+
+const (
+ RecommendedConfigPathFlag = "kubeconfig"
+ RecommendedConfigPathEnvVar = "KUBECONFIG"
+ RecommendedHomeDir = ".kube"
+ RecommendedFileName = "config"
+ RecommendedSchemaName = "schema"
+)
+
+var RecommendedHomeFile = path.Join(homedir.HomeDir(), RecommendedHomeDir, RecommendedFileName)
+var RecommendedSchemaFile = path.Join(homedir.HomeDir(), RecommendedHomeDir, RecommendedSchemaName)
+
+// currentMigrationRules returns a map that holds the history of recommended home directories used in previous versions.
+// Any future changes to RecommendedHomeFile and related are expected to add a migration rule here, in order to make
+// sure existing config files are migrated to their new locations properly.
+func currentMigrationRules() map[string]string {
+ oldRecommendedHomeFile := path.Join(os.Getenv("HOME"), "/.kube/.kubeconfig")
+ oldRecommendedWindowsHomeFile := path.Join(os.Getenv("HOME"), RecommendedHomeDir, RecommendedFileName)
+
+ migrationRules := map[string]string{}
+ migrationRules[RecommendedHomeFile] = oldRecommendedHomeFile
+ if goruntime.GOOS == "windows" {
+ migrationRules[RecommendedHomeFile] = oldRecommendedWindowsHomeFile
+ }
+ return migrationRules
+}
+
+type ClientConfigLoader interface {
+ ConfigAccess
+ Load() (*clientcmdapi.Config, error)
+}
+
+type KubeconfigGetter func() (*clientcmdapi.Config, error)
+
+type ClientConfigGetter struct {
+ kubeconfigGetter KubeconfigGetter
+}
+
+// ClientConfigGetter implements the ClientConfigLoader interface.
+var _ ClientConfigLoader = &ClientConfigGetter{}
+
+func (g *ClientConfigGetter) Load() (*clientcmdapi.Config, error) {
+ return g.kubeconfigGetter()
+}
+
+func (g *ClientConfigGetter) GetLoadingPrecedence() []string {
+ return nil
+}
+func (g *ClientConfigGetter) GetStartingConfig() (*clientcmdapi.Config, error) {
+ return nil, nil
+}
+func (g *ClientConfigGetter) GetDefaultFilename() string {
+ return ""
+}
+func (g *ClientConfigGetter) IsExplicitFile() bool {
+ return false
+}
+func (g *ClientConfigGetter) GetExplicitFile() string {
+ return ""
+}
+
+// ClientConfigLoadingRules is an ExplicitPath and string slice of specific locations that are used for merging together a Config
+// Callers can put the chain together however they want, but we'd recommend:
+// EnvVarPathFiles if set (a list of files if set) OR the HomeDirectoryPath
+// ExplicitPath is special, because if a user specifically requests a certain file be used and error is reported if thie file is not present
+type ClientConfigLoadingRules struct {
+ ExplicitPath string
+ Precedence []string
+
+ // MigrationRules is a map of destination files to source files. If a destination file is not present, then the source file is checked.
+ // If the source file is present, then it is copied to the destination file BEFORE any further loading happens.
+ MigrationRules map[string]string
+
+ // DoNotResolvePaths indicates whether or not to resolve paths with respect to the originating files. This is phrased as a negative so
+ // that a default object that doesn't set this will usually get the behavior it wants.
+ DoNotResolvePaths bool
+}
+
+// ClientConfigLoadingRules implements the ClientConfigLoader interface.
+var _ ClientConfigLoader = &ClientConfigLoadingRules{}
+
+// NewDefaultClientConfigLoadingRules returns a ClientConfigLoadingRules object with default fields filled in. You are not required to
+// use this constructor
+func NewDefaultClientConfigLoadingRules() *ClientConfigLoadingRules {
+ chain := []string{}
+
+ envVarFiles := os.Getenv(RecommendedConfigPathEnvVar)
+ if len(envVarFiles) != 0 {
+ chain = append(chain, filepath.SplitList(envVarFiles)...)
+
+ } else {
+ chain = append(chain, RecommendedHomeFile)
+ }
+
+ return &ClientConfigLoadingRules{
+ Precedence: chain,
+ MigrationRules: currentMigrationRules(),
+ }
+}
+
+// Load starts by running the MigrationRules and then
+// takes the loading rules and returns a Config object based on following rules.
+// if the ExplicitPath, return the unmerged explicit file
+// Otherwise, return a merged config based on the Precedence slice
+// A missing ExplicitPath file produces an error. Empty filenames or other missing files are ignored.
+// Read errors or files with non-deserializable content produce errors.
+// The first file to set a particular map key wins and map key's value is never changed.
+// BUT, if you set a struct value that is NOT contained inside of map, the value WILL be changed.
+// This results in some odd looking logic to merge in one direction, merge in the other, and then merge the two.
+// It also means that if two files specify a "red-user", only values from the first file's red-user are used. Even
+// non-conflicting entries from the second file's "red-user" are discarded.
+// Relative paths inside of the .kubeconfig files are resolved against the .kubeconfig file's parent folder
+// and only absolute file paths are returned.
+func (rules *ClientConfigLoadingRules) Load() (*clientcmdapi.Config, error) {
+ if err := rules.Migrate(); err != nil {
+ return nil, err
+ }
+
+ errlist := []error{}
+
+ kubeConfigFiles := []string{}
+
+ // Make sure a file we were explicitly told to use exists
+ if len(rules.ExplicitPath) > 0 {
+ if _, err := os.Stat(rules.ExplicitPath); os.IsNotExist(err) {
+ return nil, err
+ }
+ kubeConfigFiles = append(kubeConfigFiles, rules.ExplicitPath)
+
+ } else {
+ kubeConfigFiles = append(kubeConfigFiles, rules.Precedence...)
+ }
+
+ kubeconfigs := []*clientcmdapi.Config{}
+ // read and cache the config files so that we only look at them once
+ for _, filename := range kubeConfigFiles {
+ if len(filename) == 0 {
+ // no work to do
+ continue
+ }
+
+ config, err := LoadFromFile(filename)
+ if os.IsNotExist(err) {
+ // skip missing files
+ continue
+ }
+ if err != nil {
+ errlist = append(errlist, fmt.Errorf("Error loading config file \"%s\": %v", filename, err))
+ continue
+ }
+
+ kubeconfigs = append(kubeconfigs, config)
+ }
+
+ // first merge all of our maps
+ mapConfig := clientcmdapi.NewConfig()
+ for _, kubeconfig := range kubeconfigs {
+ mergo.Merge(mapConfig, kubeconfig)
+ }
+
+ // merge all of the struct values in the reverse order so that priority is given correctly
+ // errors are not added to the list the second time
+ nonMapConfig := clientcmdapi.NewConfig()
+ for i := len(kubeconfigs) - 1; i >= 0; i-- {
+ kubeconfig := kubeconfigs[i]
+ mergo.Merge(nonMapConfig, kubeconfig)
+ }
+
+ // since values are overwritten, but maps values are not, we can merge the non-map config on top of the map config and
+ // get the values we expect.
+ config := clientcmdapi.NewConfig()
+ mergo.Merge(config, mapConfig)
+ mergo.Merge(config, nonMapConfig)
+
+ if rules.ResolvePaths() {
+ if err := ResolveLocalPaths(config); err != nil {
+ errlist = append(errlist, err)
+ }
+ }
+
+ return config, utilerrors.NewAggregate(errlist)
+}
+
+// Migrate uses the MigrationRules map. If a destination file is not present, then the source file is checked.
+// If the source file is present, then it is copied to the destination file BEFORE any further loading happens.
+func (rules *ClientConfigLoadingRules) Migrate() error {
+ if rules.MigrationRules == nil {
+ return nil
+ }
+
+ for destination, source := range rules.MigrationRules {
+ if _, err := os.Stat(destination); err == nil {
+ // if the destination already exists, do nothing
+ continue
+ } else if os.IsPermission(err) {
+ // if we can't access the file, skip it
+ continue
+ } else if !os.IsNotExist(err) {
+ // if we had an error other than non-existence, fail
+ return err
+ }
+
+ if sourceInfo, err := os.Stat(source); err != nil {
+ if os.IsNotExist(err) || os.IsPermission(err) {
+ // if the source file doesn't exist or we can't access it, there's no work to do.
+ continue
+ }
+
+ // if we had an error other than non-existence, fail
+ return err
+ } else if sourceInfo.IsDir() {
+ return fmt.Errorf("cannot migrate %v to %v because it is a directory", source, destination)
+ }
+
+ in, err := os.Open(source)
+ if err != nil {
+ return err
+ }
+ defer in.Close()
+ out, err := os.Create(destination)
+ if err != nil {
+ return err
+ }
+ defer out.Close()
+
+ if _, err = io.Copy(out, in); err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
+// GetLoadingPrecedence implements ConfigAccess
+func (rules *ClientConfigLoadingRules) GetLoadingPrecedence() []string {
+ return rules.Precedence
+}
+
+// GetStartingConfig implements ConfigAccess
+func (rules *ClientConfigLoadingRules) GetStartingConfig() (*clientcmdapi.Config, error) {
+ clientConfig := NewNonInteractiveDeferredLoadingClientConfig(rules, &ConfigOverrides{})
+ rawConfig, err := clientConfig.RawConfig()
+ if os.IsNotExist(err) {
+ return clientcmdapi.NewConfig(), nil
+ }
+ if err != nil {
+ return nil, err
+ }
+
+ return &rawConfig, nil
+}
+
+// GetDefaultFilename implements ConfigAccess
+func (rules *ClientConfigLoadingRules) GetDefaultFilename() string {
+ // Explicit file if we have one.
+ if rules.IsExplicitFile() {
+ return rules.GetExplicitFile()
+ }
+ // Otherwise, first existing file from precedence.
+ for _, filename := range rules.GetLoadingPrecedence() {
+ if _, err := os.Stat(filename); err == nil {
+ return filename
+ }
+ }
+ // If none exists, use the first from precedence.
+ if len(rules.Precedence) > 0 {
+ return rules.Precedence[0]
+ }
+ return ""
+}
+
+// IsExplicitFile implements ConfigAccess
+func (rules *ClientConfigLoadingRules) IsExplicitFile() bool {
+ return len(rules.ExplicitPath) > 0
+}
+
+// GetExplicitFile implements ConfigAccess
+func (rules *ClientConfigLoadingRules) GetExplicitFile() string {
+ return rules.ExplicitPath
+}
+
+// LoadFromFile takes a filename and deserializes the contents into Config object
+func LoadFromFile(filename string) (*clientcmdapi.Config, error) {
+ kubeconfigBytes, err := ioutil.ReadFile(filename)
+ if err != nil {
+ return nil, err
+ }
+ config, err := Load(kubeconfigBytes)
+ if err != nil {
+ return nil, err
+ }
+ glog.V(6).Infoln("Config loaded from file", filename)
+
+ // set LocationOfOrigin on every Cluster, User, and Context
+ for key, obj := range config.AuthInfos {
+ obj.LocationOfOrigin = filename
+ config.AuthInfos[key] = obj
+ }
+ for key, obj := range config.Clusters {
+ obj.LocationOfOrigin = filename
+ config.Clusters[key] = obj
+ }
+ for key, obj := range config.Contexts {
+ obj.LocationOfOrigin = filename
+ config.Contexts[key] = obj
+ }
+
+ if config.AuthInfos == nil {
+ config.AuthInfos = map[string]*clientcmdapi.AuthInfo{}
+ }
+ if config.Clusters == nil {
+ config.Clusters = map[string]*clientcmdapi.Cluster{}
+ }
+ if config.Contexts == nil {
+ config.Contexts = map[string]*clientcmdapi.Context{}
+ }
+
+ return config, nil
+}
+
+// Load takes a byte slice and deserializes the contents into Config object.
+// Encapsulates deserialization without assuming the source is a file.
+func Load(data []byte) (*clientcmdapi.Config, error) {
+ config := clientcmdapi.NewConfig()
+ // if there's no data in a file, return the default object instead of failing (DecodeInto reject empty input)
+ if len(data) == 0 {
+ return config, nil
+ }
+ decoded, _, err := clientcmdlatest.Codec.Decode(data, &unversioned.GroupVersionKind{Version: clientcmdlatest.Version, Kind: "Config"}, config)
+ if err != nil {
+ return nil, err
+ }
+ return decoded.(*clientcmdapi.Config), nil
+}
+
+// WriteToFile serializes the config to yaml and writes it out to a file. If not present, it creates the file with the mode 0600. If it is present
+// it stomps the contents
+func WriteToFile(config clientcmdapi.Config, filename string) error {
+ content, err := Write(config)
+ if err != nil {
+ return err
+ }
+ dir := filepath.Dir(filename)
+ if _, err := os.Stat(dir); os.IsNotExist(err) {
+ if err = os.MkdirAll(dir, 0755); err != nil {
+ return err
+ }
+ }
+
+ if err := ioutil.WriteFile(filename, content, 0600); err != nil {
+ return err
+ }
+ return nil
+}
+
+func lockFile(filename string) error {
+ // TODO: find a way to do this with actual file locks. Will
+ // probably need seperate solution for windows and linux.
+
+ // Make sure the dir exists before we try to create a lock file.
+ dir := filepath.Dir(filename)
+ if _, err := os.Stat(dir); os.IsNotExist(err) {
+ if err = os.MkdirAll(dir, 0755); err != nil {
+ return err
+ }
+ }
+ f, err := os.OpenFile(lockName(filename), os.O_CREATE|os.O_EXCL, 0)
+ if err != nil {
+ return err
+ }
+ f.Close()
+ return nil
+}
+
+func unlockFile(filename string) error {
+ return os.Remove(lockName(filename))
+}
+
+func lockName(filename string) string {
+ return filename + ".lock"
+}
+
+// Write serializes the config to yaml.
+// Encapsulates serialization without assuming the destination is a file.
+func Write(config clientcmdapi.Config) ([]byte, error) {
+ return runtime.Encode(clientcmdlatest.Codec, &config)
+}
+
+func (rules ClientConfigLoadingRules) ResolvePaths() bool {
+ return !rules.DoNotResolvePaths
+}
+
+// ResolveLocalPaths resolves all relative paths in the config object with respect to the stanza's LocationOfOrigin
+// this cannot be done directly inside of LoadFromFile because doing so there would make it impossible to load a file without
+// modification of its contents.
+func ResolveLocalPaths(config *clientcmdapi.Config) error {
+ for _, cluster := range config.Clusters {
+ if len(cluster.LocationOfOrigin) == 0 {
+ continue
+ }
+ base, err := filepath.Abs(filepath.Dir(cluster.LocationOfOrigin))
+ if err != nil {
+ return fmt.Errorf("Could not determine the absolute path of config file %s: %v", cluster.LocationOfOrigin, err)
+ }
+
+ if err := ResolvePaths(GetClusterFileReferences(cluster), base); err != nil {
+ return err
+ }
+ }
+ for _, authInfo := range config.AuthInfos {
+ if len(authInfo.LocationOfOrigin) == 0 {
+ continue
+ }
+ base, err := filepath.Abs(filepath.Dir(authInfo.LocationOfOrigin))
+ if err != nil {
+ return fmt.Errorf("Could not determine the absolute path of config file %s: %v", authInfo.LocationOfOrigin, err)
+ }
+
+ if err := ResolvePaths(GetAuthInfoFileReferences(authInfo), base); err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
+// RelativizeClusterLocalPaths first absolutizes the paths by calling ResolveLocalPaths. This assumes that any NEW path is already
+// absolute, but any existing path will be resolved relative to LocationOfOrigin
+func RelativizeClusterLocalPaths(cluster *clientcmdapi.Cluster) error {
+ if len(cluster.LocationOfOrigin) == 0 {
+ return fmt.Errorf("no location of origin for %s", cluster.Server)
+ }
+ base, err := filepath.Abs(filepath.Dir(cluster.LocationOfOrigin))
+ if err != nil {
+ return fmt.Errorf("could not determine the absolute path of config file %s: %v", cluster.LocationOfOrigin, err)
+ }
+
+ if err := ResolvePaths(GetClusterFileReferences(cluster), base); err != nil {
+ return err
+ }
+ if err := RelativizePathWithNoBacksteps(GetClusterFileReferences(cluster), base); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+// RelativizeAuthInfoLocalPaths first absolutizes the paths by calling ResolveLocalPaths. This assumes that any NEW path is already
+// absolute, but any existing path will be resolved relative to LocationOfOrigin
+func RelativizeAuthInfoLocalPaths(authInfo *clientcmdapi.AuthInfo) error {
+ if len(authInfo.LocationOfOrigin) == 0 {
+ return fmt.Errorf("no location of origin for %v", authInfo)
+ }
+ base, err := filepath.Abs(filepath.Dir(authInfo.LocationOfOrigin))
+ if err != nil {
+ return fmt.Errorf("could not determine the absolute path of config file %s: %v", authInfo.LocationOfOrigin, err)
+ }
+
+ if err := ResolvePaths(GetAuthInfoFileReferences(authInfo), base); err != nil {
+ return err
+ }
+ if err := RelativizePathWithNoBacksteps(GetAuthInfoFileReferences(authInfo), base); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func RelativizeConfigPaths(config *clientcmdapi.Config, base string) error {
+ return RelativizePathWithNoBacksteps(GetConfigFileReferences(config), base)
+}
+
+func ResolveConfigPaths(config *clientcmdapi.Config, base string) error {
+ return ResolvePaths(GetConfigFileReferences(config), base)
+}
+
+func GetConfigFileReferences(config *clientcmdapi.Config) []*string {
+ refs := []*string{}
+
+ for _, cluster := range config.Clusters {
+ refs = append(refs, GetClusterFileReferences(cluster)...)
+ }
+ for _, authInfo := range config.AuthInfos {
+ refs = append(refs, GetAuthInfoFileReferences(authInfo)...)
+ }
+
+ return refs
+}
+
+func GetClusterFileReferences(cluster *clientcmdapi.Cluster) []*string {
+ return []*string{&cluster.CertificateAuthority}
+}
+
+func GetAuthInfoFileReferences(authInfo *clientcmdapi.AuthInfo) []*string {
+ return []*string{&authInfo.ClientCertificate, &authInfo.ClientKey}
+}
+
+// ResolvePaths updates the given refs to be absolute paths, relative to the given base directory
+func ResolvePaths(refs []*string, base string) error {
+ for _, ref := range refs {
+ // Don't resolve empty paths
+ if len(*ref) > 0 {
+ // Don't resolve absolute paths
+ if !filepath.IsAbs(*ref) {
+ *ref = filepath.Join(base, *ref)
+ }
+ }
+ }
+ return nil
+}
+
+// RelativizePathWithNoBacksteps updates the given refs to be relative paths, relative to the given base directory as long as they do not require backsteps.
+// Any path requiring a backstep is left as-is as long it is absolute. Any non-absolute path that can't be relativized produces an error
+func RelativizePathWithNoBacksteps(refs []*string, base string) error {
+ for _, ref := range refs {
+ // Don't relativize empty paths
+ if len(*ref) > 0 {
+ rel, err := MakeRelative(*ref, base)
+ if err != nil {
+ return err
+ }
+
+ // if we have a backstep, don't mess with the path
+ if strings.HasPrefix(rel, "../") {
+ if filepath.IsAbs(*ref) {
+ continue
+ }
+
+ return fmt.Errorf("%v requires backsteps and is not absolute", *ref)
+ }
+
+ *ref = rel
+ }
+ }
+ return nil
+}
+
+func MakeRelative(path, base string) (string, error) {
+ if len(path) > 0 {
+ rel, err := filepath.Rel(base, path)
+ if err != nil {
+ return path, err
+ }
+ return rel, nil
+ }
+ return path, nil
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/merged_client_builder.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/merged_client_builder.go
new file mode 100644
index 0000000..0180469
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/merged_client_builder.go
@@ -0,0 +1,122 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package clientcmd
+
+import (
+ "io"
+ "reflect"
+ "sync"
+
+ "github.com/golang/glog"
+
+ "k8s.io/kubernetes/pkg/client/restclient"
+ clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api"
+)
+
+// DeferredLoadingClientConfig is a ClientConfig interface that is backed by a client config loader.
+// It is used in cases where the loading rules may change after you've instantiated them and you want to be sure that
+// the most recent rules are used. This is useful in cases where you bind flags to loading rule parameters before
+// the parse happens and you want your calling code to be ignorant of how the values are being mutated to avoid
+// passing extraneous information down a call stack
+type DeferredLoadingClientConfig struct {
+ loader ClientConfigLoader
+ overrides *ConfigOverrides
+ fallbackReader io.Reader
+
+ clientConfig ClientConfig
+ loadingLock sync.Mutex
+}
+
+// NewNonInteractiveDeferredLoadingClientConfig creates a ConfigClientClientConfig using the passed context name
+func NewNonInteractiveDeferredLoadingClientConfig(loader ClientConfigLoader, overrides *ConfigOverrides) ClientConfig {
+ return &DeferredLoadingClientConfig{loader: loader, overrides: overrides}
+}
+
+// NewInteractiveDeferredLoadingClientConfig creates a ConfigClientClientConfig using the passed context name and the fallback auth reader
+func NewInteractiveDeferredLoadingClientConfig(loader ClientConfigLoader, overrides *ConfigOverrides, fallbackReader io.Reader) ClientConfig {
+ return &DeferredLoadingClientConfig{loader: loader, overrides: overrides, fallbackReader: fallbackReader}
+}
+
+func (config *DeferredLoadingClientConfig) createClientConfig() (ClientConfig, error) {
+ if config.clientConfig == nil {
+ config.loadingLock.Lock()
+ defer config.loadingLock.Unlock()
+
+ if config.clientConfig == nil {
+ mergedConfig, err := config.loader.Load()
+ if err != nil {
+ return nil, err
+ }
+
+ var mergedClientConfig ClientConfig
+ if config.fallbackReader != nil {
+ mergedClientConfig = NewInteractiveClientConfig(*mergedConfig, config.overrides.CurrentContext, config.overrides, config.fallbackReader, config.loader)
+ } else {
+ mergedClientConfig = NewNonInteractiveClientConfig(*mergedConfig, config.overrides.CurrentContext, config.overrides, config.loader)
+ }
+
+ config.clientConfig = mergedClientConfig
+ }
+ }
+
+ return config.clientConfig, nil
+}
+
+func (config *DeferredLoadingClientConfig) RawConfig() (clientcmdapi.Config, error) {
+ mergedConfig, err := config.createClientConfig()
+ if err != nil {
+ return clientcmdapi.Config{}, err
+ }
+
+ return mergedConfig.RawConfig()
+}
+
+// ClientConfig implements ClientConfig
+func (config *DeferredLoadingClientConfig) ClientConfig() (*restclient.Config, error) {
+ mergedClientConfig, err := config.createClientConfig()
+ if err != nil {
+ return nil, err
+ }
+
+ mergedConfig, err := mergedClientConfig.ClientConfig()
+ if err != nil {
+ return nil, err
+ }
+ // Are we running in a cluster and were no other configs found? If so, use the in-cluster-config.
+ icc := inClusterClientConfig{}
+ defaultConfig, err := DefaultClientConfig.ClientConfig()
+ if icc.Possible() && err == nil && reflect.DeepEqual(mergedConfig, defaultConfig) {
+ glog.V(2).Info("No kubeconfig could be created, falling back to service account.")
+ return icc.ClientConfig()
+ }
+ return mergedConfig, nil
+}
+
+// Namespace implements KubeConfig
+func (config *DeferredLoadingClientConfig) Namespace() (string, bool, error) {
+ mergedKubeConfig, err := config.createClientConfig()
+ if err != nil {
+ return "", false, err
+ }
+
+ return mergedKubeConfig.Namespace()
+}
+
+// ConfigAccess implements ClientConfig
+func (config *DeferredLoadingClientConfig) ConfigAccess() ConfigAccess {
+ return config.loader
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/overrides.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/overrides.go
new file mode 100644
index 0000000..40a35e6
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/overrides.go
@@ -0,0 +1,198 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package clientcmd
+
+import (
+ "strconv"
+
+ "github.com/spf13/pflag"
+
+ clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api"
+)
+
+// ConfigOverrides holds values that should override whatever information is pulled from the actual Config object. You can't
+// simply use an actual Config object, because Configs hold maps, but overrides are restricted to "at most one"
+type ConfigOverrides struct {
+ AuthInfo clientcmdapi.AuthInfo
+ ClusterInfo clientcmdapi.Cluster
+ Context clientcmdapi.Context
+ CurrentContext string
+}
+
+// ConfigOverrideFlags holds the flag names to be used for binding command line flags. Notice that this structure tightly
+// corresponds to ConfigOverrides
+type ConfigOverrideFlags struct {
+ AuthOverrideFlags AuthOverrideFlags
+ ClusterOverrideFlags ClusterOverrideFlags
+ ContextOverrideFlags ContextOverrideFlags
+ CurrentContext FlagInfo
+}
+
+// AuthOverrideFlags holds the flag names to be used for binding command line flags for AuthInfo objects
+type AuthOverrideFlags struct {
+ ClientCertificate FlagInfo
+ ClientKey FlagInfo
+ Token FlagInfo
+ Impersonate FlagInfo
+ Username FlagInfo
+ Password FlagInfo
+}
+
+// ContextOverrideFlags holds the flag names to be used for binding command line flags for Cluster objects
+type ContextOverrideFlags struct {
+ ClusterName FlagInfo
+ AuthInfoName FlagInfo
+ Namespace FlagInfo
+}
+
+// ClusterOverride holds the flag names to be used for binding command line flags for Cluster objects
+type ClusterOverrideFlags struct {
+ APIServer FlagInfo
+ APIVersion FlagInfo
+ CertificateAuthority FlagInfo
+ InsecureSkipTLSVerify FlagInfo
+}
+
+// FlagInfo contains information about how to register a flag. This struct is useful if you want to provide a way for an extender to
+// get back a set of recommended flag names, descriptions, and defaults, but allow for customization by an extender. This makes for
+// coherent extension, without full prescription
+type FlagInfo struct {
+ // LongName is the long string for a flag. If this is empty, then the flag will not be bound
+ LongName string
+ // ShortName is the single character for a flag. If this is empty, then there will be no short flag
+ ShortName string
+ // Default is the default value for the flag
+ Default string
+ // Description is the description for the flag
+ Description string
+}
+
+// BindStringFlag binds the flag based on the provided info. If LongName == "", nothing is registered
+func (f FlagInfo) BindStringFlag(flags *pflag.FlagSet, target *string) {
+ // you can't register a flag without a long name
+ if len(f.LongName) > 0 {
+ flags.StringVarP(target, f.LongName, f.ShortName, f.Default, f.Description)
+ }
+}
+
+// BindBoolFlag binds the flag based on the provided info. If LongName == "", nothing is registered
+func (f FlagInfo) BindBoolFlag(flags *pflag.FlagSet, target *bool) {
+ // you can't register a flag without a long name
+ if len(f.LongName) > 0 {
+ // try to parse Default as a bool. If it fails, assume false
+ boolVal, err := strconv.ParseBool(f.Default)
+ if err != nil {
+ boolVal = false
+ }
+
+ flags.BoolVarP(target, f.LongName, f.ShortName, boolVal, f.Description)
+ }
+}
+
+const (
+ FlagClusterName = "cluster"
+ FlagAuthInfoName = "user"
+ FlagContext = "context"
+ FlagNamespace = "namespace"
+ FlagAPIServer = "server"
+ FlagAPIVersion = "api-version"
+ FlagInsecure = "insecure-skip-tls-verify"
+ FlagCertFile = "client-certificate"
+ FlagKeyFile = "client-key"
+ FlagCAFile = "certificate-authority"
+ FlagEmbedCerts = "embed-certs"
+ FlagBearerToken = "token"
+ FlagImpersonate = "as"
+ FlagUsername = "username"
+ FlagPassword = "password"
+)
+
+// RecommendedAuthOverrideFlags is a convenience method to return recommended flag names prefixed with a string of your choosing
+func RecommendedAuthOverrideFlags(prefix string) AuthOverrideFlags {
+ return AuthOverrideFlags{
+ ClientCertificate: FlagInfo{prefix + FlagCertFile, "", "", "Path to a client certificate file for TLS"},
+ ClientKey: FlagInfo{prefix + FlagKeyFile, "", "", "Path to a client key file for TLS"},
+ Token: FlagInfo{prefix + FlagBearerToken, "", "", "Bearer token for authentication to the API server"},
+ Impersonate: FlagInfo{prefix + FlagImpersonate, "", "", "Username to impersonate for the operation"},
+ Username: FlagInfo{prefix + FlagUsername, "", "", "Username for basic authentication to the API server"},
+ Password: FlagInfo{prefix + FlagPassword, "", "", "Password for basic authentication to the API server"},
+ }
+}
+
+// RecommendedClusterOverrideFlags is a convenience method to return recommended flag names prefixed with a string of your choosing
+func RecommendedClusterOverrideFlags(prefix string) ClusterOverrideFlags {
+ return ClusterOverrideFlags{
+ APIServer: FlagInfo{prefix + FlagAPIServer, "", "", "The address and port of the Kubernetes API server"},
+ APIVersion: FlagInfo{prefix + FlagAPIVersion, "", "", "DEPRECATED: The API version to use when talking to the server"},
+ CertificateAuthority: FlagInfo{prefix + FlagCAFile, "", "", "Path to a cert. file for the certificate authority"},
+ InsecureSkipTLSVerify: FlagInfo{prefix + FlagInsecure, "", "false", "If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure"},
+ }
+}
+
+// RecommendedConfigOverrideFlags is a convenience method to return recommended flag names prefixed with a string of your choosing
+func RecommendedConfigOverrideFlags(prefix string) ConfigOverrideFlags {
+ return ConfigOverrideFlags{
+ AuthOverrideFlags: RecommendedAuthOverrideFlags(prefix),
+ ClusterOverrideFlags: RecommendedClusterOverrideFlags(prefix),
+ ContextOverrideFlags: RecommendedContextOverrideFlags(prefix),
+ CurrentContext: FlagInfo{prefix + FlagContext, "", "", "The name of the kubeconfig context to use"},
+ }
+}
+
+// RecommendedContextOverrideFlags is a convenience method to return recommended flag names prefixed with a string of your choosing
+func RecommendedContextOverrideFlags(prefix string) ContextOverrideFlags {
+ return ContextOverrideFlags{
+ ClusterName: FlagInfo{prefix + FlagClusterName, "", "", "The name of the kubeconfig cluster to use"},
+ AuthInfoName: FlagInfo{prefix + FlagAuthInfoName, "", "", "The name of the kubeconfig user to use"},
+ Namespace: FlagInfo{prefix + FlagNamespace, "", "", "If present, the namespace scope for this CLI request"},
+ }
+}
+
+// BindAuthInfoFlags is a convenience method to bind the specified flags to their associated variables
+func BindAuthInfoFlags(authInfo *clientcmdapi.AuthInfo, flags *pflag.FlagSet, flagNames AuthOverrideFlags) {
+ flagNames.ClientCertificate.BindStringFlag(flags, &authInfo.ClientCertificate)
+ flagNames.ClientKey.BindStringFlag(flags, &authInfo.ClientKey)
+ flagNames.Token.BindStringFlag(flags, &authInfo.Token)
+ flagNames.Impersonate.BindStringFlag(flags, &authInfo.Impersonate)
+ flagNames.Username.BindStringFlag(flags, &authInfo.Username)
+ flagNames.Password.BindStringFlag(flags, &authInfo.Password)
+}
+
+// BindClusterFlags is a convenience method to bind the specified flags to their associated variables
+func BindClusterFlags(clusterInfo *clientcmdapi.Cluster, flags *pflag.FlagSet, flagNames ClusterOverrideFlags) {
+ flagNames.APIServer.BindStringFlag(flags, &clusterInfo.Server)
+ // TODO: remove --api-version flag in 1.3.
+ flagNames.APIVersion.BindStringFlag(flags, &clusterInfo.APIVersion)
+ flags.MarkDeprecated(FlagAPIVersion, "flag is no longer respected and will be deleted in the next release")
+ flagNames.CertificateAuthority.BindStringFlag(flags, &clusterInfo.CertificateAuthority)
+ flagNames.InsecureSkipTLSVerify.BindBoolFlag(flags, &clusterInfo.InsecureSkipTLSVerify)
+}
+
+// BindOverrideFlags is a convenience method to bind the specified flags to their associated variables
+func BindOverrideFlags(overrides *ConfigOverrides, flags *pflag.FlagSet, flagNames ConfigOverrideFlags) {
+ BindAuthInfoFlags(&overrides.AuthInfo, flags, flagNames.AuthOverrideFlags)
+ BindClusterFlags(&overrides.ClusterInfo, flags, flagNames.ClusterOverrideFlags)
+ BindContextFlags(&overrides.Context, flags, flagNames.ContextOverrideFlags)
+ flagNames.CurrentContext.BindStringFlag(flags, &overrides.CurrentContext)
+}
+
+// BindFlags is a convenience method to bind the specified flags to their associated variables
+func BindContextFlags(contextInfo *clientcmdapi.Context, flags *pflag.FlagSet, flagNames ContextOverrideFlags) {
+ flagNames.ClusterName.BindStringFlag(flags, &contextInfo.Cluster)
+ flagNames.AuthInfoName.BindStringFlag(flags, &contextInfo.AuthInfo)
+ flagNames.Namespace.BindStringFlag(flags, &contextInfo.Namespace)
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/validation.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/validation.go
new file mode 100644
index 0000000..63f8ade
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clientcmd/validation.go
@@ -0,0 +1,270 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package clientcmd
+
+import (
+ "errors"
+ "fmt"
+ "os"
+ "reflect"
+ "strings"
+
+ clientcmdapi "k8s.io/kubernetes/pkg/client/unversioned/clientcmd/api"
+ utilerrors "k8s.io/kubernetes/pkg/util/errors"
+ "k8s.io/kubernetes/pkg/util/validation"
+)
+
+var (
+ ErrNoContext = errors.New("no context chosen")
+ ErrEmptyConfig = errors.New("no configuration has been provided")
+ // message is for consistency with old behavior
+ ErrEmptyCluster = errors.New("cluster has no server defined")
+)
+
+type errContextNotFound struct {
+ ContextName string
+}
+
+func (e *errContextNotFound) Error() string {
+ return fmt.Sprintf("context was not found for specified context: %v", e.ContextName)
+}
+
+// IsContextNotFound returns a boolean indicating whether the error is known to
+// report that a context was not found
+func IsContextNotFound(err error) bool {
+ if err == nil {
+ return false
+ }
+ if _, ok := err.(*errContextNotFound); ok || err == ErrNoContext {
+ return true
+ }
+ return strings.Contains(err.Error(), "context was not found for specified context")
+}
+
+// IsEmptyConfig returns true if the provided error indicates the provided configuration
+// is empty.
+func IsEmptyConfig(err error) bool {
+ switch t := err.(type) {
+ case errConfigurationInvalid:
+ return len(t) == 1 && t[0] == ErrEmptyConfig
+ }
+ return err == ErrEmptyConfig
+}
+
+// errConfigurationInvalid is a set of errors indicating the configuration is invalid.
+type errConfigurationInvalid []error
+
+// errConfigurationInvalid implements error and Aggregate
+var _ error = errConfigurationInvalid{}
+var _ utilerrors.Aggregate = errConfigurationInvalid{}
+
+func newErrConfigurationInvalid(errs []error) error {
+ switch len(errs) {
+ case 0:
+ return nil
+ default:
+ return errConfigurationInvalid(errs)
+ }
+}
+
+// Error implements the error interface
+func (e errConfigurationInvalid) Error() string {
+ return fmt.Sprintf("invalid configuration: %v", utilerrors.NewAggregate(e).Error())
+}
+
+// Errors implements the AggregateError interface
+func (e errConfigurationInvalid) Errors() []error {
+ return e
+}
+
+// IsConfigurationInvalid returns true if the provided error indicates the configuration is invalid.
+func IsConfigurationInvalid(err error) bool {
+ switch err.(type) {
+ case *errContextNotFound, errConfigurationInvalid:
+ return true
+ }
+ return IsContextNotFound(err)
+}
+
+// Validate checks for errors in the Config. It does not return early so that it can find as many errors as possible.
+func Validate(config clientcmdapi.Config) error {
+ validationErrors := make([]error, 0)
+
+ if clientcmdapi.IsConfigEmpty(&config) {
+ return newErrConfigurationInvalid([]error{ErrEmptyConfig})
+ }
+
+ if len(config.CurrentContext) != 0 {
+ if _, exists := config.Contexts[config.CurrentContext]; !exists {
+ validationErrors = append(validationErrors, &errContextNotFound{config.CurrentContext})
+ }
+ }
+
+ for contextName, context := range config.Contexts {
+ validationErrors = append(validationErrors, validateContext(contextName, *context, config)...)
+ }
+
+ for authInfoName, authInfo := range config.AuthInfos {
+ validationErrors = append(validationErrors, validateAuthInfo(authInfoName, *authInfo)...)
+ }
+
+ for clusterName, clusterInfo := range config.Clusters {
+ validationErrors = append(validationErrors, validateClusterInfo(clusterName, *clusterInfo)...)
+ }
+
+ return newErrConfigurationInvalid(validationErrors)
+}
+
+// ConfirmUsable looks a particular context and determines if that particular part of the config is useable. There might still be errors in the config,
+// but no errors in the sections requested or referenced. It does not return early so that it can find as many errors as possible.
+func ConfirmUsable(config clientcmdapi.Config, passedContextName string) error {
+ validationErrors := make([]error, 0)
+
+ if clientcmdapi.IsConfigEmpty(&config) {
+ return newErrConfigurationInvalid([]error{ErrEmptyConfig})
+ }
+
+ var contextName string
+ if len(passedContextName) != 0 {
+ contextName = passedContextName
+ } else {
+ contextName = config.CurrentContext
+ }
+
+ if len(contextName) == 0 {
+ return ErrNoContext
+ }
+
+ context, exists := config.Contexts[contextName]
+ if !exists {
+ validationErrors = append(validationErrors, &errContextNotFound{contextName})
+ }
+
+ if exists {
+ validationErrors = append(validationErrors, validateContext(contextName, *context, config)...)
+ validationErrors = append(validationErrors, validateAuthInfo(context.AuthInfo, *config.AuthInfos[context.AuthInfo])...)
+ validationErrors = append(validationErrors, validateClusterInfo(context.Cluster, *config.Clusters[context.Cluster])...)
+ }
+
+ return newErrConfigurationInvalid(validationErrors)
+}
+
+// validateClusterInfo looks for conflicts and errors in the cluster info
+func validateClusterInfo(clusterName string, clusterInfo clientcmdapi.Cluster) []error {
+ validationErrors := make([]error, 0)
+
+ if reflect.DeepEqual(clientcmdapi.Cluster{}, clusterInfo) {
+ return []error{ErrEmptyCluster}
+ }
+
+ if len(clusterInfo.Server) == 0 {
+ if len(clusterName) == 0 {
+ validationErrors = append(validationErrors, fmt.Errorf("default cluster has no server defined"))
+ } else {
+ validationErrors = append(validationErrors, fmt.Errorf("no server found for cluster %q", clusterName))
+ }
+ }
+ // Make sure CA data and CA file aren't both specified
+ if len(clusterInfo.CertificateAuthority) != 0 && len(clusterInfo.CertificateAuthorityData) != 0 {
+ validationErrors = append(validationErrors, fmt.Errorf("certificate-authority-data and certificate-authority are both specified for %v. certificate-authority-data will override.", clusterName))
+ }
+ if len(clusterInfo.CertificateAuthority) != 0 {
+ clientCertCA, err := os.Open(clusterInfo.CertificateAuthority)
+ defer clientCertCA.Close()
+ if err != nil {
+ validationErrors = append(validationErrors, fmt.Errorf("unable to read certificate-authority %v for %v due to %v", clusterInfo.CertificateAuthority, clusterName, err))
+ }
+ }
+
+ return validationErrors
+}
+
+// validateAuthInfo looks for conflicts and errors in the auth info
+func validateAuthInfo(authInfoName string, authInfo clientcmdapi.AuthInfo) []error {
+ validationErrors := make([]error, 0)
+
+ usingAuthPath := false
+ methods := make([]string, 0, 3)
+ if len(authInfo.Token) != 0 {
+ methods = append(methods, "token")
+ }
+ if len(authInfo.Username) != 0 || len(authInfo.Password) != 0 {
+ methods = append(methods, "basicAuth")
+ }
+
+ if len(authInfo.ClientCertificate) != 0 || len(authInfo.ClientCertificateData) != 0 {
+ // Make sure cert data and file aren't both specified
+ if len(authInfo.ClientCertificate) != 0 && len(authInfo.ClientCertificateData) != 0 {
+ validationErrors = append(validationErrors, fmt.Errorf("client-cert-data and client-cert are both specified for %v. client-cert-data will override.", authInfoName))
+ }
+ // Make sure key data and file aren't both specified
+ if len(authInfo.ClientKey) != 0 && len(authInfo.ClientKeyData) != 0 {
+ validationErrors = append(validationErrors, fmt.Errorf("client-key-data and client-key are both specified for %v; client-key-data will override", authInfoName))
+ }
+ // Make sure a key is specified
+ if len(authInfo.ClientKey) == 0 && len(authInfo.ClientKeyData) == 0 {
+ validationErrors = append(validationErrors, fmt.Errorf("client-key-data or client-key must be specified for %v to use the clientCert authentication method.", authInfoName))
+ }
+
+ if len(authInfo.ClientCertificate) != 0 {
+ clientCertFile, err := os.Open(authInfo.ClientCertificate)
+ defer clientCertFile.Close()
+ if err != nil {
+ validationErrors = append(validationErrors, fmt.Errorf("unable to read client-cert %v for %v due to %v", authInfo.ClientCertificate, authInfoName, err))
+ }
+ }
+ if len(authInfo.ClientKey) != 0 {
+ clientKeyFile, err := os.Open(authInfo.ClientKey)
+ defer clientKeyFile.Close()
+ if err != nil {
+ validationErrors = append(validationErrors, fmt.Errorf("unable to read client-key %v for %v due to %v", authInfo.ClientKey, authInfoName, err))
+ }
+ }
+ }
+
+ // authPath also provides information for the client to identify the server, so allow multiple auth methods in that case
+ if (len(methods) > 1) && (!usingAuthPath) {
+ validationErrors = append(validationErrors, fmt.Errorf("more than one authentication method found for %v; found %v, only one is allowed", authInfoName, methods))
+ }
+
+ return validationErrors
+}
+
+// validateContext looks for errors in the context. It is not transitive, so errors in the reference authInfo or cluster configs are not included in this return
+func validateContext(contextName string, context clientcmdapi.Context, config clientcmdapi.Config) []error {
+ validationErrors := make([]error, 0)
+
+ if len(context.AuthInfo) == 0 {
+ validationErrors = append(validationErrors, fmt.Errorf("user was not specified for context %q", contextName))
+ } else if _, exists := config.AuthInfos[context.AuthInfo]; !exists {
+ validationErrors = append(validationErrors, fmt.Errorf("user %q was not found for context %q", context.AuthInfo, contextName))
+ }
+
+ if len(context.Cluster) == 0 {
+ validationErrors = append(validationErrors, fmt.Errorf("cluster was not specified for context %q", contextName))
+ } else if _, exists := config.Clusters[context.Cluster]; !exists {
+ validationErrors = append(validationErrors, fmt.Errorf("cluster %q was not found for context %q", context.Cluster, contextName))
+ }
+
+ if len(context.Namespace) != 0 {
+ if len(validation.IsDNS1123Label(context.Namespace)) != 0 {
+ validationErrors = append(validationErrors, fmt.Errorf("namespace %q for context %q does not conform to the kubernetes DNS_LABEL rules", context.Namespace, contextName))
+ }
+ }
+
+ return validationErrors
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clusterrolebindings.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clusterrolebindings.go
new file mode 100644
index 0000000..fa9cad9
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clusterrolebindings.go
@@ -0,0 +1,92 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/rbac"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// ClusterRoleBindings has methods to work with ClusterRoleBinding resources in a namespace
+type ClusterRoleBindings interface {
+ ClusterRoleBindings() ClusterRoleBindingInterface
+}
+
+// ClusterRoleBindingInterface has methods to work with ClusterRoleBinding resources.
+type ClusterRoleBindingInterface interface {
+ List(opts api.ListOptions) (*rbac.ClusterRoleBindingList, error)
+ Get(name string) (*rbac.ClusterRoleBinding, error)
+ Delete(name string, options *api.DeleteOptions) error
+ Create(clusterRoleBinding *rbac.ClusterRoleBinding) (*rbac.ClusterRoleBinding, error)
+ Update(clusterRoleBinding *rbac.ClusterRoleBinding) (*rbac.ClusterRoleBinding, error)
+ Watch(opts api.ListOptions) (watch.Interface, error)
+}
+
+// clusterRoleBindings implements ClusterRoleBindingsNamespacer interface
+type clusterRoleBindings struct {
+ client *RbacClient
+}
+
+// newClusterRoleBindings returns a clusterRoleBindings
+func newClusterRoleBindings(c *RbacClient) *clusterRoleBindings {
+ return &clusterRoleBindings{
+ client: c,
+ }
+}
+
+// List takes label and field selectors, and returns the list of clusterRoleBindings that match those selectors.
+func (c *clusterRoleBindings) List(opts api.ListOptions) (result *rbac.ClusterRoleBindingList, err error) {
+ result = &rbac.ClusterRoleBindingList{}
+ err = c.client.Get().Resource("clusterrolebindings").VersionedParams(&opts, api.ParameterCodec).Do().Into(result)
+ return
+}
+
+// Get takes the name of the clusterRoleBinding, and returns the corresponding ClusterRoleBinding object, and an error if it occurs
+func (c *clusterRoleBindings) Get(name string) (result *rbac.ClusterRoleBinding, err error) {
+ result = &rbac.ClusterRoleBinding{}
+ err = c.client.Get().Resource("clusterrolebindings").Name(name).Do().Into(result)
+ return
+}
+
+// Delete takes the name of the clusterRoleBinding and deletes it. Returns an error if one occurs.
+func (c *clusterRoleBindings) Delete(name string, options *api.DeleteOptions) error {
+ return c.client.Delete().Resource("clusterrolebindings").Name(name).Body(options).Do().Error()
+}
+
+// Create takes the representation of a clusterRoleBinding and creates it. Returns the server's representation of the clusterRoleBinding, and an error, if it occurs.
+func (c *clusterRoleBindings) Create(clusterRoleBinding *rbac.ClusterRoleBinding) (result *rbac.ClusterRoleBinding, err error) {
+ result = &rbac.ClusterRoleBinding{}
+ err = c.client.Post().Resource("clusterrolebindings").Body(clusterRoleBinding).Do().Into(result)
+ return
+}
+
+// Update takes the representation of a clusterRoleBinding and updates it. Returns the server's representation of the clusterRoleBinding, and an error, if it occurs.
+func (c *clusterRoleBindings) Update(clusterRoleBinding *rbac.ClusterRoleBinding) (result *rbac.ClusterRoleBinding, err error) {
+ result = &rbac.ClusterRoleBinding{}
+ err = c.client.Put().Resource("clusterrolebindings").Name(clusterRoleBinding.Name).Body(clusterRoleBinding).Do().Into(result)
+ return
+}
+
+// Watch returns a watch.Interface that watches the requested clusterRoleBindings.
+func (c *clusterRoleBindings) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.client.Get().
+ Prefix("watch").
+ Resource("clusterrolebindings").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clusterroles.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clusterroles.go
new file mode 100644
index 0000000..165271a
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/clusterroles.go
@@ -0,0 +1,92 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/rbac"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// ClusterRoles has methods to work with ClusterRole resources in a namespace
+type ClusterRoles interface {
+ ClusterRoles() ClusterRoleInterface
+}
+
+// ClusterRoleInterface has methods to work with ClusterRole resources.
+type ClusterRoleInterface interface {
+ List(opts api.ListOptions) (*rbac.ClusterRoleList, error)
+ Get(name string) (*rbac.ClusterRole, error)
+ Delete(name string, options *api.DeleteOptions) error
+ Create(clusterRole *rbac.ClusterRole) (*rbac.ClusterRole, error)
+ Update(clusterRole *rbac.ClusterRole) (*rbac.ClusterRole, error)
+ Watch(opts api.ListOptions) (watch.Interface, error)
+}
+
+// clusterRoles implements ClusterRolesNamespacer interface
+type clusterRoles struct {
+ client *RbacClient
+}
+
+// newClusterRoles returns a clusterRoles
+func newClusterRoles(c *RbacClient) *clusterRoles {
+ return &clusterRoles{
+ client: c,
+ }
+}
+
+// List takes label and field selectors, and returns the list of clusterRoles that match those selectors.
+func (c *clusterRoles) List(opts api.ListOptions) (result *rbac.ClusterRoleList, err error) {
+ result = &rbac.ClusterRoleList{}
+ err = c.client.Get().Resource("clusterroles").VersionedParams(&opts, api.ParameterCodec).Do().Into(result)
+ return
+}
+
+// Get takes the name of the clusterRole, and returns the corresponding ClusterRole object, and an error if it occurs
+func (c *clusterRoles) Get(name string) (result *rbac.ClusterRole, err error) {
+ result = &rbac.ClusterRole{}
+ err = c.client.Get().Resource("clusterroles").Name(name).Do().Into(result)
+ return
+}
+
+// Delete takes the name of the clusterRole and deletes it. Returns an error if one occurs.
+func (c *clusterRoles) Delete(name string, options *api.DeleteOptions) error {
+ return c.client.Delete().Resource("clusterroles").Name(name).Body(options).Do().Error()
+}
+
+// Create takes the representation of a clusterRole and creates it. Returns the server's representation of the clusterRole, and an error, if it occurs.
+func (c *clusterRoles) Create(clusterRole *rbac.ClusterRole) (result *rbac.ClusterRole, err error) {
+ result = &rbac.ClusterRole{}
+ err = c.client.Post().Resource("clusterroles").Body(clusterRole).Do().Into(result)
+ return
+}
+
+// Update takes the representation of a clusterRole and updates it. Returns the server's representation of the clusterRole, and an error, if it occurs.
+func (c *clusterRoles) Update(clusterRole *rbac.ClusterRole) (result *rbac.ClusterRole, err error) {
+ result = &rbac.ClusterRole{}
+ err = c.client.Put().Resource("clusterroles").Name(clusterRole.Name).Body(clusterRole).Do().Into(result)
+ return
+}
+
+// Watch returns a watch.Interface that watches the requested clusterRoles.
+func (c *clusterRoles) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.client.Get().
+ Prefix("watch").
+ Resource("clusterroles").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/componentstatuses.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/componentstatuses.go
new file mode 100644
index 0000000..aca996b
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/componentstatuses.go
@@ -0,0 +1,60 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+)
+
+type ComponentStatusesInterface interface {
+ ComponentStatuses() ComponentStatusInterface
+}
+
+// ComponentStatusInterface contains methods to retrieve ComponentStatus
+type ComponentStatusInterface interface {
+ List(opts api.ListOptions) (*api.ComponentStatusList, error)
+ Get(name string) (*api.ComponentStatus, error)
+
+ // TODO: It'd be nice to have watch support at some point
+ //Watch(opts api.ListOptions) (watch.Interface, error)
+}
+
+// componentStatuses implements ComponentStatusesInterface
+type componentStatuses struct {
+ client *Client
+}
+
+func newComponentStatuses(c *Client) *componentStatuses {
+ return &componentStatuses{c}
+}
+
+func (c *componentStatuses) List(opts api.ListOptions) (result *api.ComponentStatusList, err error) {
+ result = &api.ComponentStatusList{}
+ err = c.client.Get().
+ Resource("componentStatuses").
+ VersionedParams(&opts, api.ParameterCodec).
+ Do().
+ Into(result)
+
+ return result, err
+}
+
+func (c *componentStatuses) Get(name string) (result *api.ComponentStatus, err error) {
+ result = &api.ComponentStatus{}
+ err = c.client.Get().Resource("componentStatuses").Name(name).Do().Into(result)
+ return
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/conditions.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/conditions.go
new file mode 100644
index 0000000..5c28429
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/conditions.go
@@ -0,0 +1,240 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "fmt"
+
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/api/errors"
+ "k8s.io/kubernetes/pkg/api/unversioned"
+ "k8s.io/kubernetes/pkg/apis/batch"
+ "k8s.io/kubernetes/pkg/apis/extensions"
+ "k8s.io/kubernetes/pkg/util/wait"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// ControllerHasDesiredReplicas returns a condition that will be true if and only if
+// the desired replica count for a controller's ReplicaSelector equals the Replicas count.
+func ControllerHasDesiredReplicas(c Interface, controller *api.ReplicationController) wait.ConditionFunc {
+
+ // If we're given a controller where the status lags the spec, it either means that the controller is stale,
+ // or that the rc manager hasn't noticed the update yet. Polling status.Replicas is not safe in the latter case.
+ desiredGeneration := controller.Generation
+
+ return func() (bool, error) {
+ ctrl, err := c.ReplicationControllers(controller.Namespace).Get(controller.Name)
+ if err != nil {
+ return false, err
+ }
+ // There's a chance a concurrent update modifies the Spec.Replicas causing this check to pass,
+ // or, after this check has passed, a modification causes the rc manager to create more pods.
+ // This will not be an issue once we've implemented graceful delete for rcs, but till then
+ // concurrent stop operations on the same rc might have unintended side effects.
+ return ctrl.Status.ObservedGeneration >= desiredGeneration && ctrl.Status.Replicas == ctrl.Spec.Replicas, nil
+ }
+}
+
+// ReplicaSetHasDesiredReplicas returns a condition that will be true if and only if
+// the desired replica count for a ReplicaSet's ReplicaSelector equals the Replicas count.
+func ReplicaSetHasDesiredReplicas(c ExtensionsInterface, replicaSet *extensions.ReplicaSet) wait.ConditionFunc {
+
+ // If we're given a ReplicaSet where the status lags the spec, it either means that the
+ // ReplicaSet is stale, or that the ReplicaSet manager hasn't noticed the update yet.
+ // Polling status.Replicas is not safe in the latter case.
+ desiredGeneration := replicaSet.Generation
+
+ return func() (bool, error) {
+ rs, err := c.ReplicaSets(replicaSet.Namespace).Get(replicaSet.Name)
+ if err != nil {
+ return false, err
+ }
+ // There's a chance a concurrent update modifies the Spec.Replicas causing this check to
+ // pass, or, after this check has passed, a modification causes the ReplicaSet manager to
+ // create more pods. This will not be an issue once we've implemented graceful delete for
+ // ReplicaSets, but till then concurrent stop operations on the same ReplicaSet might have
+ // unintended side effects.
+ return rs.Status.ObservedGeneration >= desiredGeneration && rs.Status.Replicas == rs.Spec.Replicas, nil
+ }
+}
+
+// JobHasDesiredParallelism returns a condition that will be true if the desired parallelism count
+// for a job equals the current active counts or is less by an appropriate successful/unsuccessful count.
+func JobHasDesiredParallelism(c BatchInterface, job *batch.Job) wait.ConditionFunc {
+
+ return func() (bool, error) {
+ job, err := c.Jobs(job.Namespace).Get(job.Name)
+ if err != nil {
+ return false, err
+ }
+
+ // desired parallelism can be either the exact number, in which case return immediately
+ if job.Status.Active == *job.Spec.Parallelism {
+ return true, nil
+ }
+ if job.Spec.Completions == nil {
+ // A job without specified completions needs to wait for Active to reach Parallelism.
+ return false, nil
+ } else {
+ // otherwise count successful
+ progress := *job.Spec.Completions - job.Status.Active - job.Status.Succeeded
+ return progress == 0, nil
+ }
+ }
+}
+
+// DeploymentHasDesiredReplicas returns a condition that will be true if and only if
+// the desired replica count for a deployment equals its updated replicas count.
+// (non-terminated pods that have the desired template spec).
+func DeploymentHasDesiredReplicas(c ExtensionsInterface, deployment *extensions.Deployment) wait.ConditionFunc {
+ // If we're given a deployment where the status lags the spec, it either
+ // means that the deployment is stale, or that the deployment manager hasn't
+ // noticed the update yet. Polling status.Replicas is not safe in the latter
+ // case.
+ desiredGeneration := deployment.Generation
+
+ return func() (bool, error) {
+ deployment, err := c.Deployments(deployment.Namespace).Get(deployment.Name)
+ if err != nil {
+ return false, err
+ }
+ return deployment.Status.ObservedGeneration >= desiredGeneration &&
+ deployment.Status.UpdatedReplicas == deployment.Spec.Replicas, nil
+ }
+}
+
+// ErrPodCompleted is returned by PodRunning or PodContainerRunning to indicate that
+// the pod has already reached completed state.
+var ErrPodCompleted = fmt.Errorf("pod ran to completion")
+
+// PodRunning returns true if the pod is running, false if the pod has not yet reached running state,
+// returns ErrPodCompleted if the pod has run to completion, or an error in any other case.
+func PodRunning(event watch.Event) (bool, error) {
+ switch event.Type {
+ case watch.Deleted:
+ return false, errors.NewNotFound(unversioned.GroupResource{Resource: "pods"}, "")
+ }
+ switch t := event.Object.(type) {
+ case *api.Pod:
+ switch t.Status.Phase {
+ case api.PodRunning:
+ return true, nil
+ case api.PodFailed, api.PodSucceeded:
+ return false, ErrPodCompleted
+ }
+ }
+ return false, nil
+}
+
+// PodCompleted returns true if the pod has run to completion, false if the pod has not yet
+// reached running state, or an error in any other case.
+func PodCompleted(event watch.Event) (bool, error) {
+ switch event.Type {
+ case watch.Deleted:
+ return false, errors.NewNotFound(unversioned.GroupResource{Resource: "pods"}, "")
+ }
+ switch t := event.Object.(type) {
+ case *api.Pod:
+ switch t.Status.Phase {
+ case api.PodFailed, api.PodSucceeded:
+ return true, nil
+ }
+ }
+ return false, nil
+}
+
+// PodRunningAndReady returns true if the pod is running and ready, false if the pod has not
+// yet reached those states, returns ErrPodCompleted if the pod has run to completion, or
+// an error in any other case.
+func PodRunningAndReady(event watch.Event) (bool, error) {
+ switch event.Type {
+ case watch.Deleted:
+ return false, errors.NewNotFound(unversioned.GroupResource{Resource: "pods"}, "")
+ }
+ switch t := event.Object.(type) {
+ case *api.Pod:
+ switch t.Status.Phase {
+ case api.PodFailed, api.PodSucceeded:
+ return false, ErrPodCompleted
+ case api.PodRunning:
+ return api.IsPodReady(t), nil
+ }
+ }
+ return false, nil
+}
+
+// PodNotPending returns true if the pod has left the pending state, false if it has not,
+// or an error in any other case (such as if the pod was deleted).
+func PodNotPending(event watch.Event) (bool, error) {
+ switch event.Type {
+ case watch.Deleted:
+ return false, errors.NewNotFound(unversioned.GroupResource{Resource: "pods"}, "")
+ }
+ switch t := event.Object.(type) {
+ case *api.Pod:
+ switch t.Status.Phase {
+ case api.PodPending:
+ return false, nil
+ default:
+ return true, nil
+ }
+ }
+ return false, nil
+}
+
+// PodContainerRunning returns false until the named container has ContainerStatus running (at least once),
+// and will return an error if the pod is deleted, runs to completion, or the container pod is not available.
+func PodContainerRunning(containerName string) watch.ConditionFunc {
+ return func(event watch.Event) (bool, error) {
+ switch event.Type {
+ case watch.Deleted:
+ return false, errors.NewNotFound(unversioned.GroupResource{Resource: "pods"}, "")
+ }
+ switch t := event.Object.(type) {
+ case *api.Pod:
+ switch t.Status.Phase {
+ case api.PodRunning, api.PodPending:
+ case api.PodFailed, api.PodSucceeded:
+ return false, ErrPodCompleted
+ default:
+ return false, nil
+ }
+ for _, s := range t.Status.ContainerStatuses {
+ if s.Name != containerName {
+ continue
+ }
+ return s.State.Running != nil, nil
+ }
+ return false, nil
+ }
+ return false, nil
+ }
+}
+
+// ServiceAccountHasSecrets returns true if the service account has at least one secret,
+// false if it does not, or an error.
+func ServiceAccountHasSecrets(event watch.Event) (bool, error) {
+ switch event.Type {
+ case watch.Deleted:
+ return false, errors.NewNotFound(unversioned.GroupResource{Resource: "serviceaccounts"}, "")
+ }
+ switch t := event.Object.(type) {
+ case *api.ServiceAccount:
+ return len(t.Secrets) > 0, nil
+ }
+ return false, nil
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/configmap.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/configmap.go
new file mode 100644
index 0000000..c2f2035
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/configmap.go
@@ -0,0 +1,122 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+const (
+ ConfigMapResourceName string = "configmaps"
+)
+
+type ConfigMapsNamespacer interface {
+ ConfigMaps(namespace string) ConfigMapsInterface
+}
+
+type ConfigMapsInterface interface {
+ Get(string) (*api.ConfigMap, error)
+ List(opts api.ListOptions) (*api.ConfigMapList, error)
+ Create(*api.ConfigMap) (*api.ConfigMap, error)
+ Delete(string) error
+ Update(*api.ConfigMap) (*api.ConfigMap, error)
+ Watch(api.ListOptions) (watch.Interface, error)
+}
+
+type ConfigMaps struct {
+ client *Client
+ namespace string
+}
+
+// ConfigMaps should implement ConfigMapsInterface
+var _ ConfigMapsInterface = &ConfigMaps{}
+
+func newConfigMaps(c *Client, ns string) *ConfigMaps {
+ return &ConfigMaps{
+ client: c,
+ namespace: ns,
+ }
+}
+
+func (c *ConfigMaps) Get(name string) (*api.ConfigMap, error) {
+ result := &api.ConfigMap{}
+ err := c.client.Get().
+ Namespace(c.namespace).
+ Resource(ConfigMapResourceName).
+ Name(name).
+ Do().
+ Into(result)
+
+ return result, err
+}
+
+func (c *ConfigMaps) List(opts api.ListOptions) (*api.ConfigMapList, error) {
+ result := &api.ConfigMapList{}
+ err := c.client.Get().
+ Namespace(c.namespace).
+ Resource(ConfigMapResourceName).
+ VersionedParams(&opts, api.ParameterCodec).
+ Do().
+ Into(result)
+
+ return result, err
+}
+
+func (c *ConfigMaps) Create(cfg *api.ConfigMap) (*api.ConfigMap, error) {
+ result := &api.ConfigMap{}
+ err := c.client.Post().
+ Namespace(c.namespace).
+ Resource(ConfigMapResourceName).
+ Body(cfg).
+ Do().
+ Into(result)
+
+ return result, err
+}
+
+func (c *ConfigMaps) Delete(name string) error {
+ return c.client.Delete().
+ Namespace(c.namespace).
+ Resource(ConfigMapResourceName).
+ Name(name).
+ Do().
+ Error()
+}
+
+func (c *ConfigMaps) Update(cfg *api.ConfigMap) (*api.ConfigMap, error) {
+ result := &api.ConfigMap{}
+
+ err := c.client.Put().
+ Namespace(c.namespace).
+ Resource(ConfigMapResourceName).
+ Name(cfg.Name).
+ Body(cfg).
+ Do().
+ Into(result)
+
+ return result, err
+}
+
+func (c *ConfigMaps) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.client.Get().
+ Prefix("watch").
+ Namespace(c.namespace).
+ Resource(ConfigMapResourceName).
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/containerinfo.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/containerinfo.go
new file mode 100644
index 0000000..2f9aae8
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/containerinfo.go
@@ -0,0 +1,123 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "bytes"
+ "encoding/json"
+ "fmt"
+ "io"
+ "net"
+ "net/http"
+ "strconv"
+
+ cadvisorapi "github.com/google/cadvisor/info/v1"
+)
+
+type ContainerInfoGetter interface {
+ // GetContainerInfo returns information about a container.
+ GetContainerInfo(host, podID, containerID string, req *cadvisorapi.ContainerInfoRequest) (*cadvisorapi.ContainerInfo, error)
+ // GetRootInfo returns information about the root container on a machine.
+ GetRootInfo(host string, req *cadvisorapi.ContainerInfoRequest) (*cadvisorapi.ContainerInfo, error)
+ // GetMachineInfo returns the machine's information like number of cores, memory capacity.
+ GetMachineInfo(host string) (*cadvisorapi.MachineInfo, error)
+}
+
+type HTTPContainerInfoGetter struct {
+ Client *http.Client
+ Port int
+}
+
+func (self *HTTPContainerInfoGetter) GetMachineInfo(host string) (*cadvisorapi.MachineInfo, error) {
+ request, err := http.NewRequest(
+ "GET",
+ fmt.Sprintf("http://%v/spec",
+ net.JoinHostPort(host, strconv.Itoa(self.Port)),
+ ),
+ nil,
+ )
+ if err != nil {
+ return nil, err
+ }
+
+ response, err := self.Client.Do(request)
+ if err != nil {
+ return nil, err
+ }
+ defer response.Body.Close()
+ if response.StatusCode != http.StatusOK {
+ return nil, fmt.Errorf("trying to get machine spec from %v; received status %v",
+ host, response.Status)
+ }
+ var minfo cadvisorapi.MachineInfo
+ err = json.NewDecoder(response.Body).Decode(&minfo)
+ if err != nil {
+ return nil, err
+ }
+ return &minfo, nil
+}
+
+func (self *HTTPContainerInfoGetter) getContainerInfo(host, path string, req *cadvisorapi.ContainerInfoRequest) (*cadvisorapi.ContainerInfo, error) {
+ var body io.Reader
+ if req != nil {
+ content, err := json.Marshal(req)
+ if err != nil {
+ return nil, err
+ }
+ body = bytes.NewBuffer(content)
+ }
+
+ request, err := http.NewRequest(
+ "GET",
+ fmt.Sprintf("http://%v/stats/%v",
+ net.JoinHostPort(host, strconv.Itoa(self.Port)),
+ path,
+ ),
+ body,
+ )
+ if err != nil {
+ return nil, err
+ }
+
+ response, err := self.Client.Do(request)
+ if err != nil {
+ return nil, err
+ }
+ defer response.Body.Close()
+ if response.StatusCode != http.StatusOK {
+ return nil, fmt.Errorf("trying to get info for %v from %v; received status %v",
+ path, host, response.Status)
+ }
+ var cinfo cadvisorapi.ContainerInfo
+ err = json.NewDecoder(response.Body).Decode(&cinfo)
+ if err != nil {
+ return nil, err
+ }
+ return &cinfo, nil
+}
+
+func (self *HTTPContainerInfoGetter) GetContainerInfo(host, podID, containerID string, req *cadvisorapi.ContainerInfoRequest) (*cadvisorapi.ContainerInfo, error) {
+ return self.getContainerInfo(
+ host,
+ fmt.Sprintf("%v/%v", podID, containerID),
+ req,
+ )
+}
+
+func (self *HTTPContainerInfoGetter) GetRootInfo(host string, req *cadvisorapi.ContainerInfoRequest) (*cadvisorapi.ContainerInfo, error) {
+ return self.getContainerInfo(host, "", req)
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/daemon_sets.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/daemon_sets.go
new file mode 100644
index 0000000..7ec9182
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/daemon_sets.go
@@ -0,0 +1,100 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/extensions"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// DaemonsSetsNamespacer has methods to work with DaemonSet resources in a namespace
+type DaemonSetsNamespacer interface {
+ DaemonSets(namespace string) DaemonSetInterface
+}
+
+type DaemonSetInterface interface {
+ List(opts api.ListOptions) (*extensions.DaemonSetList, error)
+ Get(name string) (*extensions.DaemonSet, error)
+ Create(ctrl *extensions.DaemonSet) (*extensions.DaemonSet, error)
+ Update(ctrl *extensions.DaemonSet) (*extensions.DaemonSet, error)
+ UpdateStatus(ctrl *extensions.DaemonSet) (*extensions.DaemonSet, error)
+ Delete(name string) error
+ Watch(opts api.ListOptions) (watch.Interface, error)
+}
+
+// daemonSets implements DaemonsSetsNamespacer interface
+type daemonSets struct {
+ r *ExtensionsClient
+ ns string
+}
+
+func newDaemonSets(c *ExtensionsClient, namespace string) *daemonSets {
+ return &daemonSets{c, namespace}
+}
+
+// Ensure statically that daemonSets implements DaemonSetsInterface.
+var _ DaemonSetInterface = &daemonSets{}
+
+func (c *daemonSets) List(opts api.ListOptions) (result *extensions.DaemonSetList, err error) {
+ result = &extensions.DaemonSetList{}
+ err = c.r.Get().Namespace(c.ns).Resource("daemonsets").VersionedParams(&opts, api.ParameterCodec).Do().Into(result)
+ return
+}
+
+// Get returns information about a particular daemon set.
+func (c *daemonSets) Get(name string) (result *extensions.DaemonSet, err error) {
+ result = &extensions.DaemonSet{}
+ err = c.r.Get().Namespace(c.ns).Resource("daemonsets").Name(name).Do().Into(result)
+ return
+}
+
+// Create creates a new daemon set.
+func (c *daemonSets) Create(daemon *extensions.DaemonSet) (result *extensions.DaemonSet, err error) {
+ result = &extensions.DaemonSet{}
+ err = c.r.Post().Namespace(c.ns).Resource("daemonsets").Body(daemon).Do().Into(result)
+ return
+}
+
+// Update updates an existing daemon set.
+func (c *daemonSets) Update(daemon *extensions.DaemonSet) (result *extensions.DaemonSet, err error) {
+ result = &extensions.DaemonSet{}
+ err = c.r.Put().Namespace(c.ns).Resource("daemonsets").Name(daemon.Name).Body(daemon).Do().Into(result)
+ return
+}
+
+// UpdateStatus updates an existing daemon set status
+func (c *daemonSets) UpdateStatus(daemon *extensions.DaemonSet) (result *extensions.DaemonSet, err error) {
+ result = &extensions.DaemonSet{}
+ err = c.r.Put().Namespace(c.ns).Resource("daemonsets").Name(daemon.Name).SubResource("status").Body(daemon).Do().Into(result)
+ return
+}
+
+// Delete deletes an existing daemon set.
+func (c *daemonSets) Delete(name string) error {
+ return c.r.Delete().Namespace(c.ns).Resource("daemonsets").Name(name).Do().Error()
+}
+
+// Watch returns a watch.Interface that watches the requested daemon sets.
+func (c *daemonSets) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.r.Get().
+ Prefix("watch").
+ Namespace(c.ns).
+ Resource("daemonsets").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/deployment.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/deployment.go
new file mode 100644
index 0000000..a5e8afe
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/deployment.go
@@ -0,0 +1,111 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/extensions"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// DeploymentsNamespacer has methods to work with Deployment resources in a namespace
+type DeploymentsNamespacer interface {
+ Deployments(namespace string) DeploymentInterface
+}
+
+// DeploymentInterface has methods to work with Deployment resources.
+type DeploymentInterface interface {
+ List(opts api.ListOptions) (*extensions.DeploymentList, error)
+ Get(name string) (*extensions.Deployment, error)
+ Delete(name string, options *api.DeleteOptions) error
+ Create(*extensions.Deployment) (*extensions.Deployment, error)
+ Update(*extensions.Deployment) (*extensions.Deployment, error)
+ UpdateStatus(*extensions.Deployment) (*extensions.Deployment, error)
+ Watch(opts api.ListOptions) (watch.Interface, error)
+ Rollback(*extensions.DeploymentRollback) error
+}
+
+// deployments implements DeploymentInterface
+type deployments struct {
+ client *ExtensionsClient
+ ns string
+}
+
+// Ensure statically that deployments implements DeploymentInterface.
+var _ DeploymentInterface = &deployments{}
+
+// newDeployments returns a Deployments
+func newDeployments(c *ExtensionsClient, namespace string) *deployments {
+ return &deployments{
+ client: c,
+ ns: namespace,
+ }
+}
+
+// List takes label and field selectors, and returns the list of Deployments that match those selectors.
+func (c *deployments) List(opts api.ListOptions) (result *extensions.DeploymentList, err error) {
+ result = &extensions.DeploymentList{}
+ err = c.client.Get().Namespace(c.ns).Resource("deployments").VersionedParams(&opts, api.ParameterCodec).Do().Into(result)
+ return
+}
+
+// Get takes name of the deployment, and returns the corresponding deployment object, and an error if there is any.
+func (c *deployments) Get(name string) (result *extensions.Deployment, err error) {
+ result = &extensions.Deployment{}
+ err = c.client.Get().Namespace(c.ns).Resource("deployments").Name(name).Do().Into(result)
+ return
+}
+
+// Delete takes name of the deployment and deletes it. Returns an error if one occurs.
+func (c *deployments) Delete(name string, options *api.DeleteOptions) error {
+ return c.client.Delete().Namespace(c.ns).Resource("deployments").Name(name).Body(options).Do().Error()
+}
+
+// Create takes the representation of a deployment and creates it. Returns the server's representation of the deployment, and an error, if there is any.
+func (c *deployments) Create(deployment *extensions.Deployment) (result *extensions.Deployment, err error) {
+ result = &extensions.Deployment{}
+ err = c.client.Post().Namespace(c.ns).Resource("deployments").Body(deployment).Do().Into(result)
+ return
+}
+
+// Update takes the representation of a deployment and updates it. Returns the server's representation of the deployment, and an error, if there is any.
+func (c *deployments) Update(deployment *extensions.Deployment) (result *extensions.Deployment, err error) {
+ result = &extensions.Deployment{}
+ err = c.client.Put().Namespace(c.ns).Resource("deployments").Name(deployment.Name).Body(deployment).Do().Into(result)
+ return
+}
+
+func (c *deployments) UpdateStatus(deployment *extensions.Deployment) (result *extensions.Deployment, err error) {
+ result = &extensions.Deployment{}
+ err = c.client.Put().Namespace(c.ns).Resource("deployments").Name(deployment.Name).SubResource("status").Body(deployment).Do().Into(result)
+ return
+}
+
+// Watch returns a watch.Interface that watches the requested deployments.
+func (c *deployments) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.client.Get().
+ Prefix("watch").
+ Namespace(c.ns).
+ Resource("deployments").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
+
+// Rollback applied the provided DeploymentRollback to the named deployment in the current namespace.
+func (c *deployments) Rollback(deploymentRollback *extensions.DeploymentRollback) error {
+ return c.client.Post().Namespace(c.ns).Resource("deployments").Name(deploymentRollback.Name).SubResource("rollback").Body(deploymentRollback).Do().Error()
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/doc.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/doc.go
new file mode 100644
index 0000000..dac3925
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/doc.go
@@ -0,0 +1,57 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+/*
+Package unversioned contains the implementation of the client side communication with the
+Kubernetes master. The Client class provides methods for reading, creating, updating,
+and deleting pods, replication controllers, daemons, services, and nodes.
+
+Most consumers should use the Config object to create a Client:
+
+ import (
+ client "k8s.io/kubernetes/pkg/client/unversioned"
+ "k8s.io/kubernetes/pkg/api"
+ )
+
+ [...]
+
+ config := &client.Config{
+ Host: "http://localhost:8080",
+ Username: "test",
+ Password: "password",
+ }
+ client, err := client.New(config)
+ if err != nil {
+ // handle error
+ }
+ pods, err := client.Pods(api.NamespaceDefault).List(api.ListOptions{})
+ if err != nil {
+ // handle error
+ }
+
+More advanced consumers may wish to provide their own transport via a http.RoundTripper:
+
+ config := &client.Config{
+ Host: "https://localhost:8080",
+ Transport: oauthclient.Transport(),
+ }
+ client, err := client.New(config)
+
+The RESTClient type implements the Kubernetes API conventions (see `docs/devel/api-conventions.md`)
+for a given API path and is intended for use by consumers implementing their own Kubernetes
+compatible APIs.
+*/
+package unversioned
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/endpoints.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/endpoints.go
new file mode 100644
index 0000000..6e20a34
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/endpoints.go
@@ -0,0 +1,101 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// EndpointsNamespacer has methods to work with Endpoints resources in a namespace
+type EndpointsNamespacer interface {
+ Endpoints(namespace string) EndpointsInterface
+}
+
+// EndpointsInterface has methods to work with Endpoints resources
+type EndpointsInterface interface {
+ Create(endpoints *api.Endpoints) (*api.Endpoints, error)
+ List(opts api.ListOptions) (*api.EndpointsList, error)
+ Get(name string) (*api.Endpoints, error)
+ Delete(name string) error
+ Update(endpoints *api.Endpoints) (*api.Endpoints, error)
+ Watch(opts api.ListOptions) (watch.Interface, error)
+}
+
+// endpoints implements EndpointsInterface
+type endpoints struct {
+ r *Client
+ ns string
+}
+
+// newEndpoints returns a endpoints
+func newEndpoints(c *Client, namespace string) *endpoints {
+ return &endpoints{c, namespace}
+}
+
+// Create creates a new endpoint.
+func (c *endpoints) Create(endpoints *api.Endpoints) (*api.Endpoints, error) {
+ result := &api.Endpoints{}
+ err := c.r.Post().Namespace(c.ns).Resource("endpoints").Body(endpoints).Do().Into(result)
+ return result, err
+}
+
+// List takes a selector, and returns the list of endpoints that match that selector
+func (c *endpoints) List(opts api.ListOptions) (result *api.EndpointsList, err error) {
+ result = &api.EndpointsList{}
+ err = c.r.Get().
+ Namespace(c.ns).
+ Resource("endpoints").
+ VersionedParams(&opts, api.ParameterCodec).
+ Do().
+ Into(result)
+ return
+}
+
+// Get returns information about the endpoints for a particular service.
+func (c *endpoints) Get(name string) (result *api.Endpoints, err error) {
+ result = &api.Endpoints{}
+ err = c.r.Get().Namespace(c.ns).Resource("endpoints").Name(name).Do().Into(result)
+ return
+}
+
+// Delete takes the name of the endpoint, and returns an error if one occurs
+func (c *endpoints) Delete(name string) error {
+ return c.r.Delete().Namespace(c.ns).Resource("endpoints").Name(name).Do().Error()
+}
+
+// Watch returns a watch.Interface that watches the requested endpoints for a service.
+func (c *endpoints) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.r.Get().
+ Prefix("watch").
+ Namespace(c.ns).
+ Resource("endpoints").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
+
+func (c *endpoints) Update(endpoints *api.Endpoints) (*api.Endpoints, error) {
+ result := &api.Endpoints{}
+ err := c.r.Put().
+ Namespace(c.ns).
+ Resource("endpoints").
+ Name(endpoints.Name).
+ Body(endpoints).
+ Do().
+ Into(result)
+ return result, err
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/events.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/events.go
new file mode 100644
index 0000000..3421bd8
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/events.go
@@ -0,0 +1,219 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "fmt"
+
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/fields"
+ "k8s.io/kubernetes/pkg/runtime"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// EventNamespacer can return an EventInterface for the given namespace.
+type EventNamespacer interface {
+ Events(namespace string) EventInterface
+}
+
+// EventInterface has methods to work with Event resources
+type EventInterface interface {
+ Create(event *api.Event) (*api.Event, error)
+ Update(event *api.Event) (*api.Event, error)
+ Patch(event *api.Event, data []byte) (*api.Event, error)
+ List(opts api.ListOptions) (*api.EventList, error)
+ Get(name string) (*api.Event, error)
+ Watch(opts api.ListOptions) (watch.Interface, error)
+ // Search finds events about the specified object
+ Search(objOrRef runtime.Object) (*api.EventList, error)
+ Delete(name string) error
+ // DeleteCollection deletes a collection of events.
+ DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error
+ // Returns the appropriate field selector based on the API version being used to communicate with the server.
+ // The returned field selector can be used with List and Watch to filter desired events.
+ GetFieldSelector(involvedObjectName, involvedObjectNamespace, involvedObjectKind, involvedObjectUID *string) fields.Selector
+}
+
+// events implements Events interface
+type events struct {
+ client *Client
+ namespace string
+}
+
+// newEvents returns a new events object.
+func newEvents(c *Client, ns string) *events {
+ return &events{
+ client: c,
+ namespace: ns,
+ }
+}
+
+// Create makes a new event. Returns the copy of the event the server returns,
+// or an error. The namespace to create the event within is deduced from the
+// event; it must either match this event client's namespace, or this event
+// client must have been created with the "" namespace.
+func (e *events) Create(event *api.Event) (*api.Event, error) {
+ if e.namespace != "" && event.Namespace != e.namespace {
+ return nil, fmt.Errorf("can't create an event with namespace '%v' in namespace '%v'", event.Namespace, e.namespace)
+ }
+ result := &api.Event{}
+ err := e.client.Post().
+ Namespace(event.Namespace).
+ Resource("events").
+ Body(event).
+ Do().
+ Into(result)
+ return result, err
+}
+
+// Update modifies an existing event. It returns the copy of the event that the server returns,
+// or an error. The namespace and key to update the event within is deduced from the event. The
+// namespace must either match this event client's namespace, or this event client must have been
+// created with the "" namespace. Update also requires the ResourceVersion to be set in the event
+// object.
+func (e *events) Update(event *api.Event) (*api.Event, error) {
+ result := &api.Event{}
+ err := e.client.Put().
+ Namespace(event.Namespace).
+ Resource("events").
+ Name(event.Name).
+ Body(event).
+ Do().
+ Into(result)
+ return result, err
+}
+
+// Patch modifies an existing event. It returns the copy of the event that the server returns, or an
+// error. The namespace and name of the target event is deduced from the incompleteEvent. The
+// namespace must either match this event client's namespace, or this event client must have been
+// created with the "" namespace.
+func (e *events) Patch(incompleteEvent *api.Event, data []byte) (*api.Event, error) {
+ result := &api.Event{}
+ err := e.client.Patch(api.StrategicMergePatchType).
+ Namespace(incompleteEvent.Namespace).
+ Resource("events").
+ Name(incompleteEvent.Name).
+ Body(data).
+ Do().
+ Into(result)
+ return result, err
+}
+
+// List returns a list of events matching the selectors.
+func (e *events) List(opts api.ListOptions) (*api.EventList, error) {
+ result := &api.EventList{}
+ err := e.client.Get().
+ Namespace(e.namespace).
+ Resource("events").
+ VersionedParams(&opts, api.ParameterCodec).
+ Do().
+ Into(result)
+ return result, err
+}
+
+// Get returns the given event, or an error.
+func (e *events) Get(name string) (*api.Event, error) {
+ result := &api.Event{}
+ err := e.client.Get().
+ Namespace(e.namespace).
+ Resource("events").
+ Name(name).
+ Do().
+ Into(result)
+ return result, err
+}
+
+// Watch starts watching for events matching the given selectors.
+func (e *events) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return e.client.Get().
+ Prefix("watch").
+ Namespace(e.namespace).
+ Resource("events").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
+
+// Search finds events about the specified object. The namespace of the
+// object must match this event's client namespace unless the event client
+// was made with the "" namespace.
+func (e *events) Search(objOrRef runtime.Object) (*api.EventList, error) {
+ ref, err := api.GetReference(objOrRef)
+ if err != nil {
+ return nil, err
+ }
+ if e.namespace != "" && ref.Namespace != e.namespace {
+ return nil, fmt.Errorf("won't be able to find any events of namespace '%v' in namespace '%v'", ref.Namespace, e.namespace)
+ }
+ stringRefKind := string(ref.Kind)
+ var refKind *string
+ if stringRefKind != "" {
+ refKind = &stringRefKind
+ }
+ stringRefUID := string(ref.UID)
+ var refUID *string
+ if stringRefUID != "" {
+ refUID = &stringRefUID
+ }
+ fieldSelector := e.GetFieldSelector(&ref.Name, &ref.Namespace, refKind, refUID)
+ return e.List(api.ListOptions{FieldSelector: fieldSelector})
+}
+
+// Delete deletes an existing event.
+func (e *events) Delete(name string) error {
+ return e.client.Delete().
+ Namespace(e.namespace).
+ Resource("events").
+ Name(name).
+ Do().
+ Error()
+}
+
+// DeleteCollection deletes a collection of objects.
+func (e *events) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error {
+ return e.client.Delete().
+ Namespace(e.namespace).
+ Resource("events").
+ VersionedParams(&listOptions, api.ParameterCodec).
+ Body(options).
+ Do().
+ Error()
+}
+
+// Returns the appropriate field selector based on the API version being used to communicate with the server.
+// The returned field selector can be used with List and Watch to filter desired events.
+func (e *events) GetFieldSelector(involvedObjectName, involvedObjectNamespace, involvedObjectKind, involvedObjectUID *string) fields.Selector {
+ apiVersion := e.client.APIVersion().String()
+ field := fields.Set{}
+ if involvedObjectName != nil {
+ field[GetInvolvedObjectNameFieldLabel(apiVersion)] = *involvedObjectName
+ }
+ if involvedObjectNamespace != nil {
+ field["involvedObject.namespace"] = *involvedObjectNamespace
+ }
+ if involvedObjectKind != nil {
+ field["involvedObject.kind"] = *involvedObjectKind
+ }
+ if involvedObjectUID != nil {
+ field["involvedObject.uid"] = *involvedObjectUID
+ }
+ return field.AsSelector()
+}
+
+// Returns the appropriate field label to use for name of the involved object as per the given API version.
+func GetInvolvedObjectNameFieldLabel(version string) string {
+ return "involvedObject.name"
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/extensions.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/extensions.go
new file mode 100644
index 0000000..39b3408
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/extensions.go
@@ -0,0 +1,131 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apimachinery/registered"
+ "k8s.io/kubernetes/pkg/apis/extensions"
+ "k8s.io/kubernetes/pkg/client/restclient"
+)
+
+// Interface holds the experimental methods for clients of Kubernetes
+// to allow mock testing.
+// Features of Extensions group are not supported and may be changed or removed in
+// incompatible ways at any time.
+type ExtensionsInterface interface {
+ ScaleNamespacer
+ DaemonSetsNamespacer
+ DeploymentsNamespacer
+ JobsNamespacer
+ IngressNamespacer
+ NetworkPolicyNamespacer
+ ThirdPartyResourceNamespacer
+ ReplicaSetsNamespacer
+ PodSecurityPoliciesInterface
+}
+
+// ExtensionsClient is used to interact with experimental Kubernetes features.
+// Features of Extensions group are not supported and may be changed or removed in
+// incompatible ways at any time.
+type ExtensionsClient struct {
+ *restclient.RESTClient
+}
+
+func (c *ExtensionsClient) PodSecurityPolicies() PodSecurityPolicyInterface {
+ return newPodSecurityPolicy(c)
+}
+
+func (c *ExtensionsClient) Scales(namespace string) ScaleInterface {
+ return newScales(c, namespace)
+}
+
+func (c *ExtensionsClient) DaemonSets(namespace string) DaemonSetInterface {
+ return newDaemonSets(c, namespace)
+}
+
+func (c *ExtensionsClient) Deployments(namespace string) DeploymentInterface {
+ return newDeployments(c, namespace)
+}
+
+func (c *ExtensionsClient) Jobs(namespace string) JobInterface {
+ return newJobs(c, namespace)
+}
+
+func (c *ExtensionsClient) Ingress(namespace string) IngressInterface {
+ return newIngress(c, namespace)
+}
+
+func (c *ExtensionsClient) NetworkPolicies(namespace string) NetworkPolicyInterface {
+ return newNetworkPolicies(c, namespace)
+}
+
+func (c *ExtensionsClient) ThirdPartyResources() ThirdPartyResourceInterface {
+ return newThirdPartyResources(c)
+}
+
+func (c *ExtensionsClient) ReplicaSets(namespace string) ReplicaSetInterface {
+ return newReplicaSets(c, namespace)
+}
+
+// NewExtensions creates a new ExtensionsClient for the given config. This client
+// provides access to experimental Kubernetes features.
+// Features of Extensions group are not supported and may be changed or removed in
+// incompatible ways at any time.
+func NewExtensions(c *restclient.Config) (*ExtensionsClient, error) {
+ config := *c
+ if err := setExtensionsDefaults(&config); err != nil {
+ return nil, err
+ }
+ client, err := restclient.RESTClientFor(&config)
+ if err != nil {
+ return nil, err
+ }
+ return &ExtensionsClient{client}, nil
+}
+
+// NewExtensionsOrDie creates a new ExtensionsClient for the given config and
+// panics if there is an error in the config.
+// Features of Extensions group are not supported and may be changed or removed in
+// incompatible ways at any time.
+func NewExtensionsOrDie(c *restclient.Config) *ExtensionsClient {
+ client, err := NewExtensions(c)
+ if err != nil {
+ panic(err)
+ }
+ return client
+}
+
+func setExtensionsDefaults(config *restclient.Config) error {
+ // if experimental group is not registered, return an error
+ g, err := registered.Group(extensions.GroupName)
+ if err != nil {
+ return err
+ }
+ config.APIPath = defaultAPIPath
+ if config.UserAgent == "" {
+ config.UserAgent = restclient.DefaultKubernetesUserAgent()
+ }
+ // TODO: Unconditionally set the config.Version, until we fix the config.
+ //if config.Version == "" {
+ copyGroupVersion := g.GroupVersion
+ config.GroupVersion = &copyGroupVersion
+ //}
+
+ config.NegotiatedSerializer = api.Codecs
+ return nil
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/flags.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/flags.go
new file mode 100644
index 0000000..7d32a25
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/flags.go
@@ -0,0 +1,31 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "time"
+)
+
+// FlagSet abstracts the flag interface for compatibility with both Golang "flag"
+// and cobra pflags (Posix style).
+type FlagSet interface {
+ StringVar(p *string, name, value, usage string)
+ BoolVar(p *bool, name string, value bool, usage string)
+ UintVar(p *uint, name string, value uint, usage string)
+ DurationVar(p *time.Duration, name string, value time.Duration, usage string)
+ IntVar(p *int, name string, value int, usage string)
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/helper.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/helper.go
new file mode 100644
index 0000000..8475769
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/helper.go
@@ -0,0 +1,273 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "fmt"
+
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/api/unversioned"
+ "k8s.io/kubernetes/pkg/apimachinery/registered"
+ "k8s.io/kubernetes/pkg/apis/apps"
+ "k8s.io/kubernetes/pkg/apis/autoscaling"
+ "k8s.io/kubernetes/pkg/apis/batch"
+ "k8s.io/kubernetes/pkg/apis/certificates"
+ "k8s.io/kubernetes/pkg/apis/extensions"
+ "k8s.io/kubernetes/pkg/apis/policy"
+ "k8s.io/kubernetes/pkg/apis/rbac"
+ "k8s.io/kubernetes/pkg/client/restclient"
+ "k8s.io/kubernetes/pkg/client/typed/discovery"
+ "k8s.io/kubernetes/pkg/util/sets"
+ "k8s.io/kubernetes/pkg/version"
+ // Import solely to initialize client auth plugins.
+ _ "k8s.io/kubernetes/plugin/pkg/client/auth"
+)
+
+const (
+ legacyAPIPath = "/api"
+ defaultAPIPath = "/apis"
+)
+
+// New creates a Kubernetes client for the given config. This client works with pods,
+// replication controllers, daemons, and services. It allows operations such as list, get, update
+// and delete on these objects. An error is returned if the provided configuration
+// is not valid.
+func New(c *restclient.Config) (*Client, error) {
+ config := *c
+ if err := SetKubernetesDefaults(&config); err != nil {
+ return nil, err
+ }
+ client, err := restclient.RESTClientFor(&config)
+ if err != nil {
+ return nil, err
+ }
+
+ discoveryConfig := *c
+ discoveryClient, err := discovery.NewDiscoveryClientForConfig(&discoveryConfig)
+ if err != nil {
+ return nil, err
+ }
+
+ var autoscalingClient *AutoscalingClient
+ if registered.IsRegistered(autoscaling.GroupName) {
+ autoscalingConfig := *c
+ autoscalingClient, err = NewAutoscaling(&autoscalingConfig)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ var batchClient *BatchClient
+ if registered.IsRegistered(batch.GroupName) {
+ batchConfig := *c
+ batchClient, err = NewBatch(&batchConfig)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ var extensionsClient *ExtensionsClient
+ if registered.IsRegistered(extensions.GroupName) {
+ extensionsConfig := *c
+ extensionsClient, err = NewExtensions(&extensionsConfig)
+ if err != nil {
+ return nil, err
+ }
+ }
+ var policyClient *PolicyClient
+ if registered.IsRegistered(policy.GroupName) {
+ policyConfig := *c
+ policyClient, err = NewPolicy(&policyConfig)
+ if err != nil {
+ return nil, err
+ }
+ }
+ var certsClient *CertificatesClient
+ if registered.IsRegistered(certificates.GroupName) {
+ certsConfig := *c
+ certsClient, err = NewCertificates(&certsConfig)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ var appsClient *AppsClient
+ if registered.IsRegistered(apps.GroupName) {
+ appsConfig := *c
+ appsClient, err = NewApps(&appsConfig)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ var rbacClient *RbacClient
+ if registered.IsRegistered(rbac.GroupName) {
+ rbacConfig := *c
+ rbacClient, err = NewRbac(&rbacConfig)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ return &Client{RESTClient: client, AutoscalingClient: autoscalingClient, BatchClient: batchClient, CertificatesClient: certsClient, ExtensionsClient: extensionsClient, DiscoveryClient: discoveryClient, AppsClient: appsClient, PolicyClient: policyClient, RbacClient: rbacClient}, nil
+}
+
+// MatchesServerVersion queries the server to compares the build version
+// (git hash) of the client with the server's build version. It returns an error
+// if it failed to contact the server or if the versions are not an exact match.
+func MatchesServerVersion(client *Client, c *restclient.Config) error {
+ var err error
+ if client == nil {
+ client, err = New(c)
+ if err != nil {
+ return err
+ }
+ }
+ cVer := version.Get()
+ sVer, err := client.Discovery().ServerVersion()
+ if err != nil {
+ return fmt.Errorf("couldn't read version from server: %v\n", err)
+ }
+ // GitVersion includes GitCommit and GitTreeState, but best to be safe?
+ if cVer.GitVersion != sVer.GitVersion || cVer.GitCommit != sVer.GitCommit || cVer.GitTreeState != sVer.GitTreeState {
+ return fmt.Errorf("server version (%#v) differs from client version (%#v)!\n", sVer, cVer)
+ }
+
+ return nil
+}
+
+// NegotiateVersion queries the server's supported api versions to find
+// a version that both client and server support.
+// - If no version is provided, try registered client versions in order of
+// preference.
+// - If version is provided, but not default config (explicitly requested via
+// commandline flag), and is unsupported by the server, print a warning to
+// stderr and try client's registered versions in order of preference.
+// - If version is config default, and the server does not support it,
+// return an error.
+func NegotiateVersion(client *Client, c *restclient.Config, requestedGV *unversioned.GroupVersion, clientRegisteredGVs []unversioned.GroupVersion) (*unversioned.GroupVersion, error) {
+ var err error
+ if client == nil {
+ client, err = New(c)
+ if err != nil {
+ return nil, err
+ }
+ }
+ clientVersions := sets.String{}
+ for _, gv := range clientRegisteredGVs {
+ clientVersions.Insert(gv.String())
+ }
+ groups, err := client.ServerGroups()
+ if err != nil {
+ // This is almost always a connection error, and higher level code should treat this as a generic error,
+ // not a negotiation specific error.
+ return nil, err
+ }
+ versions := unversioned.ExtractGroupVersions(groups)
+ serverVersions := sets.String{}
+ for _, v := range versions {
+ serverVersions.Insert(v)
+ }
+
+ // If no version requested, use config version (may also be empty).
+ // make a copy of the original so we don't risk mutating input here or in the returned value
+ var preferredGV *unversioned.GroupVersion
+ switch {
+ case requestedGV != nil:
+ t := *requestedGV
+ preferredGV = &t
+ case c.GroupVersion != nil:
+ t := *c.GroupVersion
+ preferredGV = &t
+ }
+
+ // If version explicitly requested verify that both client and server support it.
+ // If server does not support warn, but try to negotiate a lower version.
+ if preferredGV != nil {
+ if !clientVersions.Has(preferredGV.String()) {
+ return nil, fmt.Errorf("client does not support API version %q; client supported API versions: %v", preferredGV, clientVersions)
+
+ }
+ // If the server supports no versions, then we should just use the preferredGV
+ // This can happen because discovery fails due to 403 Forbidden errors
+ if len(serverVersions) == 0 {
+ return preferredGV, nil
+ }
+ if serverVersions.Has(preferredGV.String()) {
+ return preferredGV, nil
+ }
+ // If we are using an explicit config version the server does not support, fail.
+ if (c.GroupVersion != nil) && (*preferredGV == *c.GroupVersion) {
+ return nil, fmt.Errorf("server does not support API version %q", preferredGV)
+ }
+ }
+
+ for _, clientGV := range clientRegisteredGVs {
+ if serverVersions.Has(clientGV.String()) {
+ // Version was not explicitly requested in command config (--api-version).
+ // Ok to fall back to a supported version with a warning.
+ // TODO: caesarxuchao: enable the warning message when we have
+ // proper fix. Please refer to issue #14895.
+ // if len(version) != 0 {
+ // glog.Warningf("Server does not support API version '%s'. Falling back to '%s'.", version, clientVersion)
+ // }
+ t := clientGV
+ return &t, nil
+ }
+ }
+ return nil, fmt.Errorf("failed to negotiate an api version; server supports: %v, client supports: %v",
+ serverVersions, clientVersions)
+}
+
+// NewOrDie creates a Kubernetes client and panics if the provided API version is not recognized.
+func NewOrDie(c *restclient.Config) *Client {
+ client, err := New(c)
+ if err != nil {
+ panic(err)
+ }
+ return client
+}
+
+// NewInCluster is a shortcut for calling InClusterConfig() and then New().
+func NewInCluster() (*Client, error) {
+ cc, err := restclient.InClusterConfig()
+ if err != nil {
+ return nil, err
+ }
+ return New(cc)
+}
+
+// SetKubernetesDefaults sets default values on the provided client config for accessing the
+// Kubernetes API or returns an error if any of the defaults are impossible or invalid.
+// TODO: this method needs to be split into one that sets defaults per group, expected to be fix in PR "Refactoring clientcache.go and helper.go #14592"
+func SetKubernetesDefaults(config *restclient.Config) error {
+ if config.APIPath == "" {
+ config.APIPath = legacyAPIPath
+ }
+ g, err := registered.Group(api.GroupName)
+ if err != nil {
+ return err
+ }
+ // TODO: Unconditionally set the config.Version, until we fix the config.
+ copyGroupVersion := g.GroupVersion
+ config.GroupVersion = &copyGroupVersion
+ if config.NegotiatedSerializer == nil {
+ config.NegotiatedSerializer = api.Codecs
+ }
+
+ return restclient.SetKubernetesDefaults(config)
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/horizontalpodautoscaler.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/horizontalpodautoscaler.go
new file mode 100644
index 0000000..76c6a9c
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/horizontalpodautoscaler.go
@@ -0,0 +1,103 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/autoscaling"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// HorizontalPodAutoscalersNamespacer has methods to work with HorizontalPodAutoscaler resources in a namespace
+type HorizontalPodAutoscalersNamespacer interface {
+ HorizontalPodAutoscalers(namespace string) HorizontalPodAutoscalerInterface
+}
+
+// HorizontalPodAutoscalerInterface has methods to work with HorizontalPodAutoscaler resources.
+type HorizontalPodAutoscalerInterface interface {
+ List(opts api.ListOptions) (*autoscaling.HorizontalPodAutoscalerList, error)
+ Get(name string) (*autoscaling.HorizontalPodAutoscaler, error)
+ Delete(name string, options *api.DeleteOptions) error
+ Create(horizontalPodAutoscaler *autoscaling.HorizontalPodAutoscaler) (*autoscaling.HorizontalPodAutoscaler, error)
+ Update(horizontalPodAutoscaler *autoscaling.HorizontalPodAutoscaler) (*autoscaling.HorizontalPodAutoscaler, error)
+ UpdateStatus(horizontalPodAutoscaler *autoscaling.HorizontalPodAutoscaler) (*autoscaling.HorizontalPodAutoscaler, error)
+ Watch(opts api.ListOptions) (watch.Interface, error)
+}
+
+// horizontalPodAutoscalers implements HorizontalPodAutoscalersNamespacer interface using AutoscalingClient internally
+type horizontalPodAutoscalers struct {
+ client *AutoscalingClient
+ ns string
+}
+
+// newHorizontalPodAutoscalers returns a horizontalPodAutoscalers
+func newHorizontalPodAutoscalers(c *AutoscalingClient, namespace string) *horizontalPodAutoscalers {
+ return &horizontalPodAutoscalers{
+ client: c,
+ ns: namespace,
+ }
+}
+
+// List takes label and field selectors, and returns the list of horizontalPodAutoscalers that match those selectors.
+func (c *horizontalPodAutoscalers) List(opts api.ListOptions) (result *autoscaling.HorizontalPodAutoscalerList, err error) {
+ result = &autoscaling.HorizontalPodAutoscalerList{}
+ err = c.client.Get().Namespace(c.ns).Resource("horizontalPodAutoscalers").VersionedParams(&opts, api.ParameterCodec).Do().Into(result)
+ return
+}
+
+// Get takes the name of the horizontalPodAutoscaler, and returns the corresponding HorizontalPodAutoscaler object, and an error if it occurs
+func (c *horizontalPodAutoscalers) Get(name string) (result *autoscaling.HorizontalPodAutoscaler, err error) {
+ result = &autoscaling.HorizontalPodAutoscaler{}
+ err = c.client.Get().Namespace(c.ns).Resource("horizontalPodAutoscalers").Name(name).Do().Into(result)
+ return
+}
+
+// Delete takes the name of the horizontalPodAutoscaler and deletes it. Returns an error if one occurs.
+func (c *horizontalPodAutoscalers) Delete(name string, options *api.DeleteOptions) error {
+ return c.client.Delete().Namespace(c.ns).Resource("horizontalPodAutoscalers").Name(name).Body(options).Do().Error()
+}
+
+// Create takes the representation of a horizontalPodAutoscaler and creates it. Returns the server's representation of the horizontalPodAutoscaler, and an error, if it occurs.
+func (c *horizontalPodAutoscalers) Create(horizontalPodAutoscaler *autoscaling.HorizontalPodAutoscaler) (result *autoscaling.HorizontalPodAutoscaler, err error) {
+ result = &autoscaling.HorizontalPodAutoscaler{}
+ err = c.client.Post().Namespace(c.ns).Resource("horizontalPodAutoscalers").Body(horizontalPodAutoscaler).Do().Into(result)
+ return
+}
+
+// Update takes the representation of a horizontalPodAutoscaler and updates it. Returns the server's representation of the horizontalPodAutoscaler, and an error, if it occurs.
+func (c *horizontalPodAutoscalers) Update(horizontalPodAutoscaler *autoscaling.HorizontalPodAutoscaler) (result *autoscaling.HorizontalPodAutoscaler, err error) {
+ result = &autoscaling.HorizontalPodAutoscaler{}
+ err = c.client.Put().Namespace(c.ns).Resource("horizontalPodAutoscalers").Name(horizontalPodAutoscaler.Name).Body(horizontalPodAutoscaler).Do().Into(result)
+ return
+}
+
+// UpdateStatus takes the representation of a horizontalPodAutoscaler and updates it. Returns the server's representation of the horizontalPodAutoscaler, and an error, if it occurs.
+func (c *horizontalPodAutoscalers) UpdateStatus(horizontalPodAutoscaler *autoscaling.HorizontalPodAutoscaler) (result *autoscaling.HorizontalPodAutoscaler, err error) {
+ result = &autoscaling.HorizontalPodAutoscaler{}
+ err = c.client.Put().Namespace(c.ns).Resource("horizontalPodAutoscalers").Name(horizontalPodAutoscaler.Name).SubResource("status").Body(horizontalPodAutoscaler).Do().Into(result)
+ return
+}
+
+// Watch returns a watch.Interface that watches the requested horizontalPodAutoscalers.
+func (c *horizontalPodAutoscalers) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.client.Get().
+ Prefix("watch").
+ Namespace(c.ns).
+ Resource("horizontalPodAutoscalers").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/import_known_versions.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/import_known_versions.go
new file mode 100644
index 0000000..8508573
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/import_known_versions.go
@@ -0,0 +1,41 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+// These imports are the API groups the client will support.
+import (
+ "fmt"
+
+ _ "k8s.io/kubernetes/pkg/api/install"
+ "k8s.io/kubernetes/pkg/apimachinery/registered"
+ _ "k8s.io/kubernetes/pkg/apis/apps/install"
+ _ "k8s.io/kubernetes/pkg/apis/authentication.k8s.io/install"
+ _ "k8s.io/kubernetes/pkg/apis/authorization/install"
+ _ "k8s.io/kubernetes/pkg/apis/autoscaling/install"
+ _ "k8s.io/kubernetes/pkg/apis/batch/install"
+ _ "k8s.io/kubernetes/pkg/apis/certificates/install"
+ _ "k8s.io/kubernetes/pkg/apis/componentconfig/install"
+ _ "k8s.io/kubernetes/pkg/apis/extensions/install"
+ _ "k8s.io/kubernetes/pkg/apis/policy/install"
+ _ "k8s.io/kubernetes/pkg/apis/rbac/install"
+)
+
+func init() {
+ if missingVersions := registered.ValidateEnvRequestedVersions(); len(missingVersions) != 0 {
+ panic(fmt.Sprintf("KUBE_API_VERSIONS contains versions that are not installed: %q.", missingVersions))
+ }
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/ingress.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/ingress.go
new file mode 100644
index 0000000..59c6a6d
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/ingress.go
@@ -0,0 +1,100 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/extensions"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// IngressNamespacer has methods to work with Ingress resources in a namespace
+type IngressNamespacer interface {
+ Ingress(namespace string) IngressInterface
+}
+
+// IngressInterface exposes methods to work on Ingress resources.
+type IngressInterface interface {
+ List(opts api.ListOptions) (*extensions.IngressList, error)
+ Get(name string) (*extensions.Ingress, error)
+ Create(ingress *extensions.Ingress) (*extensions.Ingress, error)
+ Update(ingress *extensions.Ingress) (*extensions.Ingress, error)
+ Delete(name string, options *api.DeleteOptions) error
+ Watch(opts api.ListOptions) (watch.Interface, error)
+ UpdateStatus(ingress *extensions.Ingress) (*extensions.Ingress, error)
+}
+
+// ingress implements IngressNamespacer interface
+type ingress struct {
+ r *ExtensionsClient
+ ns string
+}
+
+// newIngress returns a ingress
+func newIngress(c *ExtensionsClient, namespace string) *ingress {
+ return &ingress{c, namespace}
+}
+
+// List returns a list of ingress that match the label and field selectors.
+func (c *ingress) List(opts api.ListOptions) (result *extensions.IngressList, err error) {
+ result = &extensions.IngressList{}
+ err = c.r.Get().Namespace(c.ns).Resource("ingresses").VersionedParams(&opts, api.ParameterCodec).Do().Into(result)
+ return
+}
+
+// Get returns information about a particular ingress.
+func (c *ingress) Get(name string) (result *extensions.Ingress, err error) {
+ result = &extensions.Ingress{}
+ err = c.r.Get().Namespace(c.ns).Resource("ingresses").Name(name).Do().Into(result)
+ return
+}
+
+// Create creates a new ingress.
+func (c *ingress) Create(ingress *extensions.Ingress) (result *extensions.Ingress, err error) {
+ result = &extensions.Ingress{}
+ err = c.r.Post().Namespace(c.ns).Resource("ingresses").Body(ingress).Do().Into(result)
+ return
+}
+
+// Update updates an existing ingress.
+func (c *ingress) Update(ingress *extensions.Ingress) (result *extensions.Ingress, err error) {
+ result = &extensions.Ingress{}
+ err = c.r.Put().Namespace(c.ns).Resource("ingresses").Name(ingress.Name).Body(ingress).Do().Into(result)
+ return
+}
+
+// Delete deletes a ingress, returns error if one occurs.
+func (c *ingress) Delete(name string, options *api.DeleteOptions) (err error) {
+ return c.r.Delete().Namespace(c.ns).Resource("ingresses").Name(name).Body(options).Do().Error()
+}
+
+// Watch returns a watch.Interface that watches the requested ingress.
+func (c *ingress) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.r.Get().
+ Prefix("watch").
+ Namespace(c.ns).
+ Resource("ingresses").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
+
+// UpdateStatus takes the name of the ingress and the new status. Returns the server's representation of the ingress, and an error, if it occurs.
+func (c *ingress) UpdateStatus(ingress *extensions.Ingress) (result *extensions.Ingress, err error) {
+ result = &extensions.Ingress{}
+ err = c.r.Put().Namespace(c.ns).Resource("ingresses").Name(ingress.Name).SubResource("status").Body(ingress).Do().Into(result)
+ return
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/jobs.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/jobs.go
new file mode 100644
index 0000000..14cfa3a
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/jobs.go
@@ -0,0 +1,167 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/batch"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// JobsNamespacer has methods to work with Job resources in a namespace
+type JobsNamespacer interface {
+ Jobs(namespace string) JobInterface
+}
+
+// JobInterface exposes methods to work on Job resources.
+type JobInterface interface {
+ List(opts api.ListOptions) (*batch.JobList, error)
+ Get(name string) (*batch.Job, error)
+ Create(job *batch.Job) (*batch.Job, error)
+ Update(job *batch.Job) (*batch.Job, error)
+ Delete(name string, options *api.DeleteOptions) error
+ Watch(opts api.ListOptions) (watch.Interface, error)
+ UpdateStatus(job *batch.Job) (*batch.Job, error)
+}
+
+// jobs implements JobsNamespacer interface
+type jobs struct {
+ r *ExtensionsClient
+ ns string
+}
+
+// newJobs returns a jobs
+func newJobs(c *ExtensionsClient, namespace string) *jobs {
+ return &jobs{c, namespace}
+}
+
+// Ensure statically that jobs implements JobInterface.
+var _ JobInterface = &jobs{}
+
+// List returns a list of jobs that match the label and field selectors.
+func (c *jobs) List(opts api.ListOptions) (result *batch.JobList, err error) {
+ result = &batch.JobList{}
+ err = c.r.Get().Namespace(c.ns).Resource("jobs").VersionedParams(&opts, api.ParameterCodec).Do().Into(result)
+ return
+}
+
+// Get returns information about a particular job.
+func (c *jobs) Get(name string) (result *batch.Job, err error) {
+ result = &batch.Job{}
+ err = c.r.Get().Namespace(c.ns).Resource("jobs").Name(name).Do().Into(result)
+ return
+}
+
+// Create creates a new job.
+func (c *jobs) Create(job *batch.Job) (result *batch.Job, err error) {
+ result = &batch.Job{}
+ err = c.r.Post().Namespace(c.ns).Resource("jobs").Body(job).Do().Into(result)
+ return
+}
+
+// Update updates an existing job.
+func (c *jobs) Update(job *batch.Job) (result *batch.Job, err error) {
+ result = &batch.Job{}
+ err = c.r.Put().Namespace(c.ns).Resource("jobs").Name(job.Name).Body(job).Do().Into(result)
+ return
+}
+
+// Delete deletes a job, returns error if one occurs.
+func (c *jobs) Delete(name string, options *api.DeleteOptions) (err error) {
+ return c.r.Delete().Namespace(c.ns).Resource("jobs").Name(name).Body(options).Do().Error()
+}
+
+// Watch returns a watch.Interface that watches the requested jobs.
+func (c *jobs) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.r.Get().
+ Prefix("watch").
+ Namespace(c.ns).
+ Resource("jobs").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
+
+// UpdateStatus takes the name of the job and the new status. Returns the server's representation of the job, and an error, if it occurs.
+func (c *jobs) UpdateStatus(job *batch.Job) (result *batch.Job, err error) {
+ result = &batch.Job{}
+ err = c.r.Put().Namespace(c.ns).Resource("jobs").Name(job.Name).SubResource("status").Body(job).Do().Into(result)
+ return
+}
+
+// jobsV1 implements JobsNamespacer interface using BatchClient internally
+type jobsV1 struct {
+ r *BatchClient
+ ns string
+}
+
+// newJobsV1 returns a jobsV1
+func newJobsV1(c *BatchClient, namespace string) *jobsV1 {
+ return &jobsV1{c, namespace}
+}
+
+// Ensure statically that jobsV1 implements JobInterface.
+var _ JobInterface = &jobsV1{}
+
+// List returns a list of jobs that match the label and field selectors.
+func (c *jobsV1) List(opts api.ListOptions) (result *batch.JobList, err error) {
+ result = &batch.JobList{}
+ err = c.r.Get().Namespace(c.ns).Resource("jobs").VersionedParams(&opts, api.ParameterCodec).Do().Into(result)
+ return
+}
+
+// Get returns information about a particular job.
+func (c *jobsV1) Get(name string) (result *batch.Job, err error) {
+ result = &batch.Job{}
+ err = c.r.Get().Namespace(c.ns).Resource("jobs").Name(name).Do().Into(result)
+ return
+}
+
+// Create creates a new job.
+func (c *jobsV1) Create(job *batch.Job) (result *batch.Job, err error) {
+ result = &batch.Job{}
+ err = c.r.Post().Namespace(c.ns).Resource("jobs").Body(job).Do().Into(result)
+ return
+}
+
+// Update updates an existing job.
+func (c *jobsV1) Update(job *batch.Job) (result *batch.Job, err error) {
+ result = &batch.Job{}
+ err = c.r.Put().Namespace(c.ns).Resource("jobs").Name(job.Name).Body(job).Do().Into(result)
+ return
+}
+
+// Delete deletes a job, returns error if one occurs.
+func (c *jobsV1) Delete(name string, options *api.DeleteOptions) (err error) {
+ return c.r.Delete().Namespace(c.ns).Resource("jobs").Name(name).Body(options).Do().Error()
+}
+
+// Watch returns a watch.Interface that watches the requested jobs.
+func (c *jobsV1) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.r.Get().
+ Prefix("watch").
+ Namespace(c.ns).
+ Resource("jobs").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
+
+// UpdateStatus takes the name of the job and the new status. Returns the server's representation of the job, and an error, if it occurs.
+func (c *jobsV1) UpdateStatus(job *batch.Job) (result *batch.Job, err error) {
+ result = &batch.Job{}
+ err = c.r.Put().Namespace(c.ns).Resource("jobs").Name(job.Name).SubResource("status").Body(job).Do().Into(result)
+ return
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/limit_ranges.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/limit_ranges.go
new file mode 100644
index 0000000..914a049
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/limit_ranges.go
@@ -0,0 +1,94 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// LimitRangesNamespacer has methods to work with LimitRange resources in a namespace
+type LimitRangesNamespacer interface {
+ LimitRanges(namespace string) LimitRangeInterface
+}
+
+// LimitRangeInterface has methods to work with LimitRange resources.
+type LimitRangeInterface interface {
+ List(opts api.ListOptions) (*api.LimitRangeList, error)
+ Get(name string) (*api.LimitRange, error)
+ Delete(name string) error
+ Create(limitRange *api.LimitRange) (*api.LimitRange, error)
+ Update(limitRange *api.LimitRange) (*api.LimitRange, error)
+ Watch(opts api.ListOptions) (watch.Interface, error)
+}
+
+// limitRanges implements LimitRangesNamespacer interface
+type limitRanges struct {
+ r *Client
+ ns string
+}
+
+// newLimitRanges returns a limitRanges
+func newLimitRanges(c *Client, namespace string) *limitRanges {
+ return &limitRanges{
+ r: c,
+ ns: namespace,
+ }
+}
+
+// List takes a selector, and returns the list of limitRanges that match that selector.
+func (c *limitRanges) List(opts api.ListOptions) (result *api.LimitRangeList, err error) {
+ result = &api.LimitRangeList{}
+ err = c.r.Get().Namespace(c.ns).Resource("limitRanges").VersionedParams(&opts, api.ParameterCodec).Do().Into(result)
+ return
+}
+
+// Get takes the name of the limitRange, and returns the corresponding Pod object, and an error if it occurs
+func (c *limitRanges) Get(name string) (result *api.LimitRange, err error) {
+ result = &api.LimitRange{}
+ err = c.r.Get().Namespace(c.ns).Resource("limitRanges").Name(name).Do().Into(result)
+ return
+}
+
+// Delete takes the name of the limitRange, and returns an error if one occurs
+func (c *limitRanges) Delete(name string) error {
+ return c.r.Delete().Namespace(c.ns).Resource("limitRanges").Name(name).Do().Error()
+}
+
+// Create takes the representation of a limitRange. Returns the server's representation of the limitRange, and an error, if it occurs.
+func (c *limitRanges) Create(limitRange *api.LimitRange) (result *api.LimitRange, err error) {
+ result = &api.LimitRange{}
+ err = c.r.Post().Namespace(c.ns).Resource("limitRanges").Body(limitRange).Do().Into(result)
+ return
+}
+
+// Update takes the representation of a limitRange to update. Returns the server's representation of the limitRange, and an error, if it occurs.
+func (c *limitRanges) Update(limitRange *api.LimitRange) (result *api.LimitRange, err error) {
+ result = &api.LimitRange{}
+ err = c.r.Put().Namespace(c.ns).Resource("limitRanges").Name(limitRange.Name).Body(limitRange).Do().Into(result)
+ return
+}
+
+// Watch returns a watch.Interface that watches the requested resource
+func (c *limitRanges) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.r.Get().
+ Prefix("watch").
+ Namespace(c.ns).
+ Resource("limitRanges").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/namespaces.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/namespaces.go
new file mode 100644
index 0000000..b4a3836
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/namespaces.go
@@ -0,0 +1,116 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "fmt"
+
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+type NamespacesInterface interface {
+ Namespaces() NamespaceInterface
+}
+
+type NamespaceInterface interface {
+ Create(item *api.Namespace) (*api.Namespace, error)
+ Get(name string) (result *api.Namespace, err error)
+ List(opts api.ListOptions) (*api.NamespaceList, error)
+ Delete(name string) error
+ Update(item *api.Namespace) (*api.Namespace, error)
+ Watch(opts api.ListOptions) (watch.Interface, error)
+ Finalize(item *api.Namespace) (*api.Namespace, error)
+ Status(item *api.Namespace) (*api.Namespace, error)
+}
+
+// namespaces implements NamespacesInterface
+type namespaces struct {
+ r *Client
+}
+
+// newNamespaces returns a namespaces object.
+func newNamespaces(c *Client) *namespaces {
+ return &namespaces{r: c}
+}
+
+// Create creates a new namespace.
+func (c *namespaces) Create(namespace *api.Namespace) (*api.Namespace, error) {
+ result := &api.Namespace{}
+ err := c.r.Post().Resource("namespaces").Body(namespace).Do().Into(result)
+ return result, err
+}
+
+// List lists all the namespaces in the cluster.
+func (c *namespaces) List(opts api.ListOptions) (*api.NamespaceList, error) {
+ result := &api.NamespaceList{}
+ err := c.r.Get().
+ Resource("namespaces").
+ VersionedParams(&opts, api.ParameterCodec).
+ Do().Into(result)
+ return result, err
+}
+
+// Update takes the representation of a namespace to update. Returns the server's representation of the namespace, and an error, if it occurs.
+func (c *namespaces) Update(namespace *api.Namespace) (result *api.Namespace, err error) {
+ result = &api.Namespace{}
+ err = c.r.Put().Resource("namespaces").Name(namespace.Name).Body(namespace).Do().Into(result)
+ return
+}
+
+// Finalize takes the representation of a namespace to update. Returns the server's representation of the namespace, and an error, if it occurs.
+func (c *namespaces) Finalize(namespace *api.Namespace) (result *api.Namespace, err error) {
+ result = &api.Namespace{}
+ if len(namespace.ResourceVersion) == 0 {
+ err = fmt.Errorf("invalid update object, missing resource version: %v", namespace)
+ return
+ }
+ err = c.r.Put().Resource("namespaces").Name(namespace.Name).SubResource("finalize").Body(namespace).Do().Into(result)
+ return
+}
+
+// Status takes the representation of a namespace to update. Returns the server's representation of the namespace, and an error, if it occurs.
+func (c *namespaces) Status(namespace *api.Namespace) (result *api.Namespace, err error) {
+ result = &api.Namespace{}
+ if len(namespace.ResourceVersion) == 0 {
+ err = fmt.Errorf("invalid update object, missing resource version: %v", namespace)
+ return
+ }
+ err = c.r.Put().Resource("namespaces").Name(namespace.Name).SubResource("status").Body(namespace).Do().Into(result)
+ return
+}
+
+// Get gets an existing namespace
+func (c *namespaces) Get(name string) (*api.Namespace, error) {
+ result := &api.Namespace{}
+ err := c.r.Get().Resource("namespaces").Name(name).Do().Into(result)
+ return result, err
+}
+
+// Delete deletes an existing namespace.
+func (c *namespaces) Delete(name string) error {
+ return c.r.Delete().Resource("namespaces").Name(name).Do().Error()
+}
+
+// Watch returns a watch.Interface that watches the requested namespaces.
+func (c *namespaces) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.r.Get().
+ Prefix("watch").
+ Resource("namespaces").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/network_policys.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/network_policys.go
new file mode 100644
index 0000000..3e3f610
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/network_policys.go
@@ -0,0 +1,92 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/extensions"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// NetworkPolicyNamespacer has methods to work with NetworkPolicy resources in a namespace
+type NetworkPolicyNamespacer interface {
+ NetworkPolicies(namespace string) NetworkPolicyInterface
+}
+
+// NetworkPolicyInterface exposes methods to work on NetworkPolicy resources.
+type NetworkPolicyInterface interface {
+ List(opts api.ListOptions) (*extensions.NetworkPolicyList, error)
+ Get(name string) (*extensions.NetworkPolicy, error)
+ Create(networkPolicy *extensions.NetworkPolicy) (*extensions.NetworkPolicy, error)
+ Update(networkPolicy *extensions.NetworkPolicy) (*extensions.NetworkPolicy, error)
+ Delete(name string, options *api.DeleteOptions) error
+ Watch(opts api.ListOptions) (watch.Interface, error)
+}
+
+// NetworkPolicies implements NetworkPolicyNamespacer interface
+type NetworkPolicies struct {
+ r *ExtensionsClient
+ ns string
+}
+
+// newNetworkPolicies returns a NetworkPolicies
+func newNetworkPolicies(c *ExtensionsClient, namespace string) *NetworkPolicies {
+ return &NetworkPolicies{c, namespace}
+}
+
+// List returns a list of networkPolicy that match the label and field selectors.
+func (c *NetworkPolicies) List(opts api.ListOptions) (result *extensions.NetworkPolicyList, err error) {
+ result = &extensions.NetworkPolicyList{}
+ err = c.r.Get().Namespace(c.ns).Resource("networkpolicies").VersionedParams(&opts, api.ParameterCodec).Do().Into(result)
+ return
+}
+
+// Get returns information about a particular networkPolicy.
+func (c *NetworkPolicies) Get(name string) (result *extensions.NetworkPolicy, err error) {
+ result = &extensions.NetworkPolicy{}
+ err = c.r.Get().Namespace(c.ns).Resource("networkpolicies").Name(name).Do().Into(result)
+ return
+}
+
+// Create creates a new networkPolicy.
+func (c *NetworkPolicies) Create(networkPolicy *extensions.NetworkPolicy) (result *extensions.NetworkPolicy, err error) {
+ result = &extensions.NetworkPolicy{}
+ err = c.r.Post().Namespace(c.ns).Resource("networkpolicies").Body(networkPolicy).Do().Into(result)
+ return
+}
+
+// Update updates an existing networkPolicy.
+func (c *NetworkPolicies) Update(networkPolicy *extensions.NetworkPolicy) (result *extensions.NetworkPolicy, err error) {
+ result = &extensions.NetworkPolicy{}
+ err = c.r.Put().Namespace(c.ns).Resource("networkpolicies").Name(networkPolicy.Name).Body(networkPolicy).Do().Into(result)
+ return
+}
+
+// Delete deletes a networkPolicy, returns error if one occurs.
+func (c *NetworkPolicies) Delete(name string, options *api.DeleteOptions) (err error) {
+ return c.r.Delete().Namespace(c.ns).Resource("networkpolicies").Name(name).Body(options).Do().Error()
+}
+
+// Watch returns a watch.Interface that watches the requested networkPolicy.
+func (c *NetworkPolicies) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.r.Get().
+ Prefix("watch").
+ Namespace(c.ns).
+ Resource("networkpolicies").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/nodes.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/nodes.go
new file mode 100644
index 0000000..15a7db2
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/nodes.go
@@ -0,0 +1,111 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+type NodesInterface interface {
+ Nodes() NodeInterface
+}
+
+type NodeInterface interface {
+ Get(name string) (result *api.Node, err error)
+ Create(node *api.Node) (*api.Node, error)
+ List(opts api.ListOptions) (*api.NodeList, error)
+ Delete(name string) error
+ DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error
+ Update(*api.Node) (*api.Node, error)
+ UpdateStatus(*api.Node) (*api.Node, error)
+ Watch(opts api.ListOptions) (watch.Interface, error)
+}
+
+// nodes implements NodesInterface
+type nodes struct {
+ r *Client
+}
+
+// newNodes returns a nodes object.
+func newNodes(c *Client) *nodes {
+ return &nodes{c}
+}
+
+// resourceName returns node's URL resource name.
+func (c *nodes) resourceName() string {
+ return "nodes"
+}
+
+// Create creates a new node.
+func (c *nodes) Create(node *api.Node) (*api.Node, error) {
+ result := &api.Node{}
+ err := c.r.Post().Resource(c.resourceName()).Body(node).Do().Into(result)
+ return result, err
+}
+
+// List takes a selector, and returns the list of nodes that match that selector in the cluster.
+func (c *nodes) List(opts api.ListOptions) (*api.NodeList, error) {
+ result := &api.NodeList{}
+ err := c.r.Get().Resource(c.resourceName()).VersionedParams(&opts, api.ParameterCodec).Do().Into(result)
+ return result, err
+}
+
+// Get gets an existing node.
+func (c *nodes) Get(name string) (*api.Node, error) {
+ result := &api.Node{}
+ err := c.r.Get().Resource(c.resourceName()).Name(name).Do().Into(result)
+ return result, err
+}
+
+// Delete deletes an existing node.
+func (c *nodes) Delete(name string) error {
+ return c.r.Delete().Resource(c.resourceName()).Name(name).Do().Error()
+}
+
+// DeleteCollection deletes a collection of nodes.
+func (c *nodes) DeleteCollection(options *api.DeleteOptions, listOptions api.ListOptions) error {
+ return c.r.Delete().
+ Resource(c.resourceName()).
+ VersionedParams(&listOptions, api.ParameterCodec).
+ Body(options).
+ Do().
+ Error()
+}
+
+// Update updates an existing node.
+func (c *nodes) Update(node *api.Node) (*api.Node, error) {
+ result := &api.Node{}
+ err := c.r.Put().Resource(c.resourceName()).Name(node.Name).Body(node).Do().Into(result)
+ return result, err
+}
+
+func (c *nodes) UpdateStatus(node *api.Node) (*api.Node, error) {
+ result := &api.Node{}
+ err := c.r.Put().Resource(c.resourceName()).Name(node.Name).SubResource("status").Body(node).Do().Into(result)
+ return result, err
+}
+
+// Watch returns a watch.Interface that watches the requested nodes.
+func (c *nodes) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.r.Get().
+ Prefix("watch").
+ Namespace(api.NamespaceAll).
+ Resource(c.resourceName()).
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/persistentvolumeclaim.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/persistentvolumeclaim.go
new file mode 100644
index 0000000..4ea3a95
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/persistentvolumeclaim.go
@@ -0,0 +1,99 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// PersistentVolumeClaimsNamespacer has methods to work with PersistentVolumeClaim resources in a namespace
+type PersistentVolumeClaimsNamespacer interface {
+ PersistentVolumeClaims(namespace string) PersistentVolumeClaimInterface
+}
+
+// PersistentVolumeClaimInterface has methods to work with PersistentVolumeClaim resources.
+type PersistentVolumeClaimInterface interface {
+ List(opts api.ListOptions) (*api.PersistentVolumeClaimList, error)
+ Get(name string) (*api.PersistentVolumeClaim, error)
+ Create(claim *api.PersistentVolumeClaim) (*api.PersistentVolumeClaim, error)
+ Update(claim *api.PersistentVolumeClaim) (*api.PersistentVolumeClaim, error)
+ UpdateStatus(claim *api.PersistentVolumeClaim) (*api.PersistentVolumeClaim, error)
+ Delete(name string) error
+ Watch(opts api.ListOptions) (watch.Interface, error)
+}
+
+// persistentVolumeClaims implements PersistentVolumeClaimsNamespacer interface
+type persistentVolumeClaims struct {
+ client *Client
+ namespace string
+}
+
+// newPersistentVolumeClaims returns a PodsClient
+func newPersistentVolumeClaims(c *Client, namespace string) *persistentVolumeClaims {
+ return &persistentVolumeClaims{c, namespace}
+}
+
+func (c *persistentVolumeClaims) List(opts api.ListOptions) (result *api.PersistentVolumeClaimList, err error) {
+ result = &api.PersistentVolumeClaimList{}
+
+ err = c.client.Get().
+ Namespace(c.namespace).
+ Resource("persistentVolumeClaims").
+ VersionedParams(&opts, api.ParameterCodec).
+ Do().
+ Into(result)
+
+ return result, err
+}
+
+func (c *persistentVolumeClaims) Get(name string) (result *api.PersistentVolumeClaim, err error) {
+ result = &api.PersistentVolumeClaim{}
+ err = c.client.Get().Namespace(c.namespace).Resource("persistentVolumeClaims").Name(name).Do().Into(result)
+ return
+}
+
+func (c *persistentVolumeClaims) Create(claim *api.PersistentVolumeClaim) (result *api.PersistentVolumeClaim, err error) {
+ result = &api.PersistentVolumeClaim{}
+ err = c.client.Post().Namespace(c.namespace).Resource("persistentVolumeClaims").Body(claim).Do().Into(result)
+ return
+}
+
+func (c *persistentVolumeClaims) Update(claim *api.PersistentVolumeClaim) (result *api.PersistentVolumeClaim, err error) {
+ result = &api.PersistentVolumeClaim{}
+ err = c.client.Put().Namespace(c.namespace).Resource("persistentVolumeClaims").Name(claim.Name).Body(claim).Do().Into(result)
+ return
+}
+
+func (c *persistentVolumeClaims) UpdateStatus(claim *api.PersistentVolumeClaim) (result *api.PersistentVolumeClaim, err error) {
+ result = &api.PersistentVolumeClaim{}
+ err = c.client.Put().Namespace(c.namespace).Resource("persistentVolumeClaims").Name(claim.Name).SubResource("status").Body(claim).Do().Into(result)
+ return
+}
+
+func (c *persistentVolumeClaims) Delete(name string) error {
+ return c.client.Delete().Namespace(c.namespace).Resource("persistentVolumeClaims").Name(name).Do().Error()
+}
+
+func (c *persistentVolumeClaims) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.client.Get().
+ Prefix("watch").
+ Namespace(c.namespace).
+ Resource("persistentVolumeClaims").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/persistentvolumes.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/persistentvolumes.go
new file mode 100644
index 0000000..5fce1f0
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/persistentvolumes.go
@@ -0,0 +1,93 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+type PersistentVolumesInterface interface {
+ PersistentVolumes() PersistentVolumeInterface
+}
+
+// PersistentVolumeInterface has methods to work with PersistentVolume resources.
+type PersistentVolumeInterface interface {
+ List(opts api.ListOptions) (*api.PersistentVolumeList, error)
+ Get(name string) (*api.PersistentVolume, error)
+ Create(volume *api.PersistentVolume) (*api.PersistentVolume, error)
+ Update(volume *api.PersistentVolume) (*api.PersistentVolume, error)
+ UpdateStatus(persistentVolume *api.PersistentVolume) (*api.PersistentVolume, error)
+ Delete(name string) error
+ Watch(opts api.ListOptions) (watch.Interface, error)
+}
+
+// persistentVolumes implements PersistentVolumesInterface
+type persistentVolumes struct {
+ client *Client
+}
+
+func newPersistentVolumes(c *Client) *persistentVolumes {
+ return &persistentVolumes{c}
+}
+
+func (c *persistentVolumes) List(opts api.ListOptions) (result *api.PersistentVolumeList, err error) {
+ result = &api.PersistentVolumeList{}
+ err = c.client.Get().
+ Resource("persistentVolumes").
+ VersionedParams(&opts, api.ParameterCodec).
+ Do().
+ Into(result)
+
+ return result, err
+}
+
+func (c *persistentVolumes) Get(name string) (result *api.PersistentVolume, err error) {
+ result = &api.PersistentVolume{}
+ err = c.client.Get().Resource("persistentVolumes").Name(name).Do().Into(result)
+ return
+}
+
+func (c *persistentVolumes) Create(volume *api.PersistentVolume) (result *api.PersistentVolume, err error) {
+ result = &api.PersistentVolume{}
+ err = c.client.Post().Resource("persistentVolumes").Body(volume).Do().Into(result)
+ return
+}
+
+func (c *persistentVolumes) Update(volume *api.PersistentVolume) (result *api.PersistentVolume, err error) {
+ result = &api.PersistentVolume{}
+ err = c.client.Put().Resource("persistentVolumes").Name(volume.Name).Body(volume).Do().Into(result)
+ return
+}
+
+func (c *persistentVolumes) UpdateStatus(volume *api.PersistentVolume) (result *api.PersistentVolume, err error) {
+ result = &api.PersistentVolume{}
+ err = c.client.Put().Resource("persistentVolumes").Name(volume.Name).SubResource("status").Body(volume).Do().Into(result)
+ return
+}
+
+func (c *persistentVolumes) Delete(name string) error {
+ return c.client.Delete().Resource("persistentVolumes").Name(name).Do().Error()
+}
+
+func (c *persistentVolumes) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.client.Get().
+ Prefix("watch").
+ Resource("persistentVolumes").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/pet_sets.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/pet_sets.go
new file mode 100644
index 0000000..954efcd
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/pet_sets.go
@@ -0,0 +1,100 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/apps"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// PetSetNamespacer has methods to work with PetSet resources in a namespace
+type PetSetNamespacer interface {
+ PetSets(namespace string) PetSetInterface
+}
+
+// PetSetInterface exposes methods to work on PetSet resources.
+type PetSetInterface interface {
+ List(opts api.ListOptions) (*apps.PetSetList, error)
+ Get(name string) (*apps.PetSet, error)
+ Create(petSet *apps.PetSet) (*apps.PetSet, error)
+ Update(petSet *apps.PetSet) (*apps.PetSet, error)
+ Delete(name string, options *api.DeleteOptions) error
+ Watch(opts api.ListOptions) (watch.Interface, error)
+ UpdateStatus(petSet *apps.PetSet) (*apps.PetSet, error)
+}
+
+// petSet implements PetSetNamespacer interface
+type petSet struct {
+ r *AppsClient
+ ns string
+}
+
+// newPetSet returns a petSet
+func newPetSet(c *AppsClient, namespace string) *petSet {
+ return &petSet{c, namespace}
+}
+
+// List returns a list of petSet that match the label and field selectors.
+func (c *petSet) List(opts api.ListOptions) (result *apps.PetSetList, err error) {
+ result = &apps.PetSetList{}
+ err = c.r.Get().Namespace(c.ns).Resource("petsets").VersionedParams(&opts, api.ParameterCodec).Do().Into(result)
+ return
+}
+
+// Get returns information about a particular petSet.
+func (c *petSet) Get(name string) (result *apps.PetSet, err error) {
+ result = &apps.PetSet{}
+ err = c.r.Get().Namespace(c.ns).Resource("petsets").Name(name).Do().Into(result)
+ return
+}
+
+// Create creates a new petSet.
+func (c *petSet) Create(petSet *apps.PetSet) (result *apps.PetSet, err error) {
+ result = &apps.PetSet{}
+ err = c.r.Post().Namespace(c.ns).Resource("petsets").Body(petSet).Do().Into(result)
+ return
+}
+
+// Update updates an existing petSet.
+func (c *petSet) Update(petSet *apps.PetSet) (result *apps.PetSet, err error) {
+ result = &apps.PetSet{}
+ err = c.r.Put().Namespace(c.ns).Resource("petsets").Name(petSet.Name).Body(petSet).Do().Into(result)
+ return
+}
+
+// Delete deletes a petSet, returns error if one occurs.
+func (c *petSet) Delete(name string, options *api.DeleteOptions) (err error) {
+ return c.r.Delete().Namespace(c.ns).Resource("petsets").Name(name).Body(options).Do().Error()
+}
+
+// Watch returns a watch.Interface that watches the requested petSet.
+func (c *petSet) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.r.Get().
+ Prefix("watch").
+ Namespace(c.ns).
+ Resource("petsets").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
+
+// UpdateStatus takes the name of the petSet and the new status. Returns the server's representation of the petSet, and an error, if it occurs.
+func (c *petSet) UpdateStatus(petSet *apps.PetSet) (result *apps.PetSet, err error) {
+ result = &apps.PetSet{}
+ err = c.r.Put().Namespace(c.ns).Resource("petsets").Name(petSet.Name).SubResource("status").Body(petSet).Do().Into(result)
+ return
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/pod_disruption_budgets.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/pod_disruption_budgets.go
new file mode 100644
index 0000000..0239623
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/pod_disruption_budgets.go
@@ -0,0 +1,100 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/policy"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// PodDisruptionBudgetNamespacer has methods to work with PodDisruptionBudget resources in a namespace
+type PodDisruptionBudgetNamespacer interface {
+ PodDisruptionBudgets(namespace string) PodDisruptionBudgetInterface
+}
+
+// PodDisruptionBudgetInterface exposes methods to work on PodDisruptionBudget resources.
+type PodDisruptionBudgetInterface interface {
+ List(opts api.ListOptions) (*policy.PodDisruptionBudgetList, error)
+ Get(name string) (*policy.PodDisruptionBudget, error)
+ Create(podDisruptionBudget *policy.PodDisruptionBudget) (*policy.PodDisruptionBudget, error)
+ Update(podDisruptionBudget *policy.PodDisruptionBudget) (*policy.PodDisruptionBudget, error)
+ Delete(name string, options *api.DeleteOptions) error
+ Watch(opts api.ListOptions) (watch.Interface, error)
+ UpdateStatus(podDisruptionBudget *policy.PodDisruptionBudget) (*policy.PodDisruptionBudget, error)
+}
+
+// podDisruptionBudget implements PodDisruptionBudgetNamespacer interface
+type podDisruptionBudget struct {
+ r *PolicyClient
+ ns string
+}
+
+// newPodDisruptionBudget returns a podDisruptionBudget
+func newPodDisruptionBudget(c *PolicyClient, namespace string) *podDisruptionBudget {
+ return &podDisruptionBudget{c, namespace}
+}
+
+// List returns a list of podDisruptionBudget that match the label and field selectors.
+func (c *podDisruptionBudget) List(opts api.ListOptions) (result *policy.PodDisruptionBudgetList, err error) {
+ result = &policy.PodDisruptionBudgetList{}
+ err = c.r.Get().Namespace(c.ns).Resource("poddisruptionbudgets").VersionedParams(&opts, api.ParameterCodec).Do().Into(result)
+ return
+}
+
+// Get returns information about a particular podDisruptionBudget.
+func (c *podDisruptionBudget) Get(name string) (result *policy.PodDisruptionBudget, err error) {
+ result = &policy.PodDisruptionBudget{}
+ err = c.r.Get().Namespace(c.ns).Resource("poddisruptionbudgets").Name(name).Do().Into(result)
+ return
+}
+
+// Create creates a new podDisruptionBudget.
+func (c *podDisruptionBudget) Create(podDisruptionBudget *policy.PodDisruptionBudget) (result *policy.PodDisruptionBudget, err error) {
+ result = &policy.PodDisruptionBudget{}
+ err = c.r.Post().Namespace(c.ns).Resource("poddisruptionbudgets").Body(podDisruptionBudget).Do().Into(result)
+ return
+}
+
+// Update updates an existing podDisruptionBudget.
+func (c *podDisruptionBudget) Update(podDisruptionBudget *policy.PodDisruptionBudget) (result *policy.PodDisruptionBudget, err error) {
+ result = &policy.PodDisruptionBudget{}
+ err = c.r.Put().Namespace(c.ns).Resource("poddisruptionbudgets").Name(podDisruptionBudget.Name).Body(podDisruptionBudget).Do().Into(result)
+ return
+}
+
+// Delete deletes a podDisruptionBudget, returns error if one occurs.
+func (c *podDisruptionBudget) Delete(name string, options *api.DeleteOptions) (err error) {
+ return c.r.Delete().Namespace(c.ns).Resource("poddisruptionbudgets").Name(name).Body(options).Do().Error()
+}
+
+// Watch returns a watch.Interface that watches the requested podDisruptionBudget.
+func (c *podDisruptionBudget) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.r.Get().
+ Prefix("watch").
+ Namespace(c.ns).
+ Resource("poddisruptionbudgets").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
+
+// UpdateStatus takes the name of the podDisruptionBudget and the new status. Returns the server's representation of the podDisruptionBudget, and an error, if it occurs.
+func (c *podDisruptionBudget) UpdateStatus(podDisruptionBudget *policy.PodDisruptionBudget) (result *policy.PodDisruptionBudget, err error) {
+ result = &policy.PodDisruptionBudget{}
+ err = c.r.Put().Namespace(c.ns).Resource("poddisruptionbudgets").Name(podDisruptionBudget.Name).SubResource("status").Body(podDisruptionBudget).Do().Into(result)
+ return
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/pod_templates.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/pod_templates.go
new file mode 100644
index 0000000..7627d73
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/pod_templates.go
@@ -0,0 +1,94 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// PodTemplatesNamespacer has methods to work with PodTemplate resources in a namespace
+type PodTemplatesNamespacer interface {
+ PodTemplates(namespace string) PodTemplateInterface
+}
+
+// PodTemplateInterface has methods to work with PodTemplate resources.
+type PodTemplateInterface interface {
+ List(opts api.ListOptions) (*api.PodTemplateList, error)
+ Get(name string) (*api.PodTemplate, error)
+ Delete(name string, options *api.DeleteOptions) error
+ Create(podTemplate *api.PodTemplate) (*api.PodTemplate, error)
+ Update(podTemplate *api.PodTemplate) (*api.PodTemplate, error)
+ Watch(opts api.ListOptions) (watch.Interface, error)
+}
+
+// podTemplates implements PodTemplatesNamespacer interface
+type podTemplates struct {
+ r *Client
+ ns string
+}
+
+// newPodTemplates returns a podTemplates
+func newPodTemplates(c *Client, namespace string) *podTemplates {
+ return &podTemplates{
+ r: c,
+ ns: namespace,
+ }
+}
+
+// List takes label and field selectors, and returns the list of podTemplates that match those selectors.
+func (c *podTemplates) List(opts api.ListOptions) (result *api.PodTemplateList, err error) {
+ result = &api.PodTemplateList{}
+ err = c.r.Get().Namespace(c.ns).Resource("podTemplates").VersionedParams(&opts, api.ParameterCodec).Do().Into(result)
+ return
+}
+
+// Get takes the name of the podTemplate, and returns the corresponding PodTemplate object, and an error if it occurs
+func (c *podTemplates) Get(name string) (result *api.PodTemplate, err error) {
+ result = &api.PodTemplate{}
+ err = c.r.Get().Namespace(c.ns).Resource("podTemplates").Name(name).Do().Into(result)
+ return
+}
+
+// Delete takes the name of the podTemplate, and returns an error if one occurs
+func (c *podTemplates) Delete(name string, options *api.DeleteOptions) error {
+ return c.r.Delete().Namespace(c.ns).Resource("podTemplates").Name(name).Body(options).Do().Error()
+}
+
+// Create takes the representation of a podTemplate. Returns the server's representation of the podTemplate, and an error, if it occurs.
+func (c *podTemplates) Create(podTemplate *api.PodTemplate) (result *api.PodTemplate, err error) {
+ result = &api.PodTemplate{}
+ err = c.r.Post().Namespace(c.ns).Resource("podTemplates").Body(podTemplate).Do().Into(result)
+ return
+}
+
+// Update takes the representation of a podTemplate to update. Returns the server's representation of the podTemplate, and an error, if it occurs.
+func (c *podTemplates) Update(podTemplate *api.PodTemplate) (result *api.PodTemplate, err error) {
+ result = &api.PodTemplate{}
+ err = c.r.Put().Namespace(c.ns).Resource("podTemplates").Name(podTemplate.Name).Body(podTemplate).Do().Into(result)
+ return
+}
+
+// Watch returns a watch.Interface that watches the requested podTemplates.
+func (c *podTemplates) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.r.Get().
+ Prefix("watch").
+ Namespace(c.ns).
+ Resource("podTemplates").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/pods.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/pods.go
new file mode 100644
index 0000000..ea16fb8
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/pods.go
@@ -0,0 +1,115 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/client/restclient"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// PodsNamespacer has methods to work with Pod resources in a namespace
+type PodsNamespacer interface {
+ Pods(namespace string) PodInterface
+}
+
+// PodInterface has methods to work with Pod resources.
+type PodInterface interface {
+ List(opts api.ListOptions) (*api.PodList, error)
+ Get(name string) (*api.Pod, error)
+ Delete(name string, options *api.DeleteOptions) error
+ Create(pod *api.Pod) (*api.Pod, error)
+ Update(pod *api.Pod) (*api.Pod, error)
+ Watch(opts api.ListOptions) (watch.Interface, error)
+ Bind(binding *api.Binding) error
+ UpdateStatus(pod *api.Pod) (*api.Pod, error)
+ GetLogs(name string, opts *api.PodLogOptions) *restclient.Request
+}
+
+// pods implements PodsNamespacer interface
+type pods struct {
+ r *Client
+ ns string
+}
+
+// newPods returns a pods
+func newPods(c *Client, namespace string) *pods {
+ return &pods{
+ r: c,
+ ns: namespace,
+ }
+}
+
+// List takes label and field selectors, and returns the list of pods that match those selectors.
+func (c *pods) List(opts api.ListOptions) (result *api.PodList, err error) {
+ result = &api.PodList{}
+ err = c.r.Get().Namespace(c.ns).Resource("pods").VersionedParams(&opts, api.ParameterCodec).Do().Into(result)
+ return
+}
+
+// Get takes the name of the pod, and returns the corresponding Pod object, and an error if it occurs
+func (c *pods) Get(name string) (result *api.Pod, err error) {
+ result = &api.Pod{}
+ err = c.r.Get().Namespace(c.ns).Resource("pods").Name(name).Do().Into(result)
+ return
+}
+
+// Delete takes the name of the pod, and returns an error if one occurs
+func (c *pods) Delete(name string, options *api.DeleteOptions) error {
+ return c.r.Delete().Namespace(c.ns).Resource("pods").Name(name).Body(options).Do().Error()
+}
+
+// Create takes the representation of a pod. Returns the server's representation of the pod, and an error, if it occurs.
+func (c *pods) Create(pod *api.Pod) (result *api.Pod, err error) {
+ result = &api.Pod{}
+ err = c.r.Post().Namespace(c.ns).Resource("pods").Body(pod).Do().Into(result)
+ return
+}
+
+// Update takes the representation of a pod to update. Returns the server's representation of the pod, and an error, if it occurs.
+func (c *pods) Update(pod *api.Pod) (result *api.Pod, err error) {
+ result = &api.Pod{}
+ err = c.r.Put().Namespace(c.ns).Resource("pods").Name(pod.Name).Body(pod).Do().Into(result)
+ return
+}
+
+// Watch returns a watch.Interface that watches the requested pods.
+func (c *pods) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.r.Get().
+ Prefix("watch").
+ Namespace(c.ns).
+ Resource("pods").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
+
+// Bind applies the provided binding to the named pod in the current namespace (binding.Namespace is ignored).
+func (c *pods) Bind(binding *api.Binding) error {
+ return c.r.Post().Namespace(c.ns).Resource("pods").Name(binding.Name).SubResource("binding").Body(binding).Do().Error()
+}
+
+// UpdateStatus takes the name of the pod and the new status. Returns the server's representation of the pod, and an error, if it occurs.
+func (c *pods) UpdateStatus(pod *api.Pod) (result *api.Pod, err error) {
+ result = &api.Pod{}
+ err = c.r.Put().Namespace(c.ns).Resource("pods").Name(pod.Name).SubResource("status").Body(pod).Do().Into(result)
+ return
+}
+
+// Get constructs a request for getting the logs for a pod
+func (c *pods) GetLogs(name string, opts *api.PodLogOptions) *restclient.Request {
+ return c.r.Get().Namespace(c.ns).Name(name).Resource("pods").SubResource("log").VersionedParams(opts, api.ParameterCodec)
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/podsecuritypolicy.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/podsecuritypolicy.go
new file mode 100644
index 0000000..f03e643
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/podsecuritypolicy.go
@@ -0,0 +1,111 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/extensions"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+type PodSecurityPoliciesInterface interface {
+ PodSecurityPolicies() PodSecurityPolicyInterface
+}
+
+type PodSecurityPolicyInterface interface {
+ Get(name string) (result *extensions.PodSecurityPolicy, err error)
+ Create(psp *extensions.PodSecurityPolicy) (*extensions.PodSecurityPolicy, error)
+ List(opts api.ListOptions) (*extensions.PodSecurityPolicyList, error)
+ Delete(name string) error
+ Update(*extensions.PodSecurityPolicy) (*extensions.PodSecurityPolicy, error)
+ Watch(opts api.ListOptions) (watch.Interface, error)
+}
+
+// podSecurityPolicy implements PodSecurityPolicyInterface
+type podSecurityPolicy struct {
+ client *ExtensionsClient
+}
+
+// newPodSecurityPolicy returns a podSecurityPolicy object.
+func newPodSecurityPolicy(c *ExtensionsClient) *podSecurityPolicy {
+ return &podSecurityPolicy{c}
+}
+
+func (s *podSecurityPolicy) Create(psp *extensions.PodSecurityPolicy) (*extensions.PodSecurityPolicy, error) {
+ result := &extensions.PodSecurityPolicy{}
+ err := s.client.Post().
+ Resource("podsecuritypolicies").
+ Body(psp).
+ Do().
+ Into(result)
+
+ return result, err
+}
+
+// List returns a list of PodSecurityPolicies matching the selectors.
+func (s *podSecurityPolicy) List(opts api.ListOptions) (*extensions.PodSecurityPolicyList, error) {
+ result := &extensions.PodSecurityPolicyList{}
+
+ err := s.client.Get().
+ Resource("podsecuritypolicies").
+ VersionedParams(&opts, api.ParameterCodec).
+ Do().
+ Into(result)
+
+ return result, err
+}
+
+// Get returns the given PodSecurityPolicy, or an error.
+func (s *podSecurityPolicy) Get(name string) (*extensions.PodSecurityPolicy, error) {
+ result := &extensions.PodSecurityPolicy{}
+ err := s.client.Get().
+ Resource("podsecuritypolicies").
+ Name(name).
+ Do().
+ Into(result)
+
+ return result, err
+}
+
+// Watch starts watching for PodSecurityPolicies matching the given selectors.
+func (s *podSecurityPolicy) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return s.client.Get().
+ Prefix("watch").
+ Resource("podsecuritypolicies").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
+
+func (s *podSecurityPolicy) Delete(name string) error {
+ return s.client.Delete().
+ Resource("podsecuritypolicies").
+ Name(name).
+ Do().
+ Error()
+}
+
+func (s *podSecurityPolicy) Update(psp *extensions.PodSecurityPolicy) (result *extensions.PodSecurityPolicy, err error) {
+ result = &extensions.PodSecurityPolicy{}
+ err = s.client.Put().
+ Resource("podsecuritypolicies").
+ Name(psp.Name).
+ Body(psp).
+ Do().
+ Into(result)
+
+ return
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/policy.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/policy.go
new file mode 100644
index 0000000..9a47d79
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/policy.go
@@ -0,0 +1,76 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apimachinery/registered"
+ "k8s.io/kubernetes/pkg/apis/policy"
+ "k8s.io/kubernetes/pkg/client/restclient"
+)
+
+type PolicyInterface interface {
+ PodDisruptionBudgetNamespacer
+}
+
+// PolicyClient is used to interact with Kubernetes batch features.
+type PolicyClient struct {
+ *restclient.RESTClient
+}
+
+func (c *PolicyClient) PodDisruptionBudgets(namespace string) PodDisruptionBudgetInterface {
+ return newPodDisruptionBudget(c, namespace)
+}
+
+func NewPolicy(c *restclient.Config) (*PolicyClient, error) {
+ config := *c
+ if err := setPolicyDefaults(&config); err != nil {
+ return nil, err
+ }
+ client, err := restclient.RESTClientFor(&config)
+ if err != nil {
+ return nil, err
+ }
+ return &PolicyClient{client}, nil
+}
+
+func NewPolicyOrDie(c *restclient.Config) *PolicyClient {
+ client, err := NewPolicy(c)
+ if err != nil {
+ panic(err)
+ }
+ return client
+}
+
+func setPolicyDefaults(config *restclient.Config) error {
+ g, err := registered.Group(policy.GroupName)
+ if err != nil {
+ return err
+ }
+ config.APIPath = defaultAPIPath
+ if config.UserAgent == "" {
+ config.UserAgent = restclient.DefaultKubernetesUserAgent()
+ }
+ // TODO: Unconditionally set the config.Version, until we fix the config.
+ //if config.Version == "" {
+ copyGroupVersion := g.GroupVersion
+ config.GroupVersion = &copyGroupVersion
+ //}
+
+ config.NegotiatedSerializer = api.Codecs
+ return nil
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/rbac.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/rbac.go
new file mode 100644
index 0000000..09b2b40
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/rbac.go
@@ -0,0 +1,96 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apimachinery/registered"
+ "k8s.io/kubernetes/pkg/apis/rbac"
+ "k8s.io/kubernetes/pkg/client/restclient"
+)
+
+// Interface holds the methods for clients of Kubernetes to allow mock testing.
+type RbacInterface interface {
+ RoleBindingsNamespacer
+ RolesNamespacer
+ ClusterRoleBindings
+ ClusterRoles
+}
+
+type RbacClient struct {
+ *restclient.RESTClient
+}
+
+func (c *RbacClient) RoleBindings(namespace string) RoleBindingInterface {
+ return newRoleBindings(c, namespace)
+}
+
+func (c *RbacClient) Roles(namespace string) RoleInterface {
+ return newRoles(c, namespace)
+}
+
+func (c *RbacClient) ClusterRoleBindings() ClusterRoleBindingInterface {
+ return newClusterRoleBindings(c)
+}
+
+func (c *RbacClient) ClusterRoles() ClusterRoleInterface {
+ return newClusterRoles(c)
+}
+
+// NewRbac creates a new RbacClient for the given config.
+func NewRbac(c *restclient.Config) (*RbacClient, error) {
+ config := *c
+ if err := setRbacDefaults(&config); err != nil {
+ return nil, err
+ }
+ client, err := restclient.RESTClientFor(&config)
+ if err != nil {
+ return nil, err
+ }
+ return &RbacClient{client}, nil
+}
+
+// NewRbacOrDie creates a new RbacClient for the given config and
+// panics if there is an error in the config.
+func NewRbacOrDie(c *restclient.Config) *RbacClient {
+ client, err := NewRbac(c)
+ if err != nil {
+ panic(err)
+ }
+ return client
+}
+
+func setRbacDefaults(config *restclient.Config) error {
+ // if rbac group is not registered, return an error
+ g, err := registered.Group(rbac.GroupName)
+ if err != nil {
+ return err
+ }
+ config.APIPath = defaultAPIPath
+ if config.UserAgent == "" {
+ config.UserAgent = restclient.DefaultKubernetesUserAgent()
+ }
+
+ // TODO: Unconditionally set the config.Version, until we fix the config.
+ //if config.Version == "" {
+ copyGroupVersion := g.GroupVersion
+ config.GroupVersion = &copyGroupVersion
+ //}
+
+ config.NegotiatedSerializer = api.Codecs
+ return nil
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/replica_sets.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/replica_sets.go
new file mode 100644
index 0000000..191a006
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/replica_sets.go
@@ -0,0 +1,100 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/extensions"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// ReplicaSetsNamespacer has methods to work with ReplicaSet resources in a namespace
+type ReplicaSetsNamespacer interface {
+ ReplicaSets(namespace string) ReplicaSetInterface
+}
+
+// ReplicaSetInterface has methods to work with ReplicaSet resources.
+type ReplicaSetInterface interface {
+ List(opts api.ListOptions) (*extensions.ReplicaSetList, error)
+ Get(name string) (*extensions.ReplicaSet, error)
+ Create(ctrl *extensions.ReplicaSet) (*extensions.ReplicaSet, error)
+ Update(ctrl *extensions.ReplicaSet) (*extensions.ReplicaSet, error)
+ UpdateStatus(ctrl *extensions.ReplicaSet) (*extensions.ReplicaSet, error)
+ Delete(name string, options *api.DeleteOptions) error
+ Watch(opts api.ListOptions) (watch.Interface, error)
+}
+
+// replicaSets implements ReplicaSetsNamespacer interface
+type replicaSets struct {
+ client *ExtensionsClient
+ ns string
+}
+
+// newReplicaSets returns a ReplicaSetClient
+func newReplicaSets(c *ExtensionsClient, namespace string) *replicaSets {
+ return &replicaSets{c, namespace}
+}
+
+// List takes a selector, and returns the list of ReplicaSets that match that selector.
+func (c *replicaSets) List(opts api.ListOptions) (result *extensions.ReplicaSetList, err error) {
+ result = &extensions.ReplicaSetList{}
+ err = c.client.Get().Namespace(c.ns).Resource("replicasets").VersionedParams(&opts, api.ParameterCodec).Do().Into(result)
+ return
+}
+
+// Get returns information about a particular ReplicaSet.
+func (c *replicaSets) Get(name string) (result *extensions.ReplicaSet, err error) {
+ result = &extensions.ReplicaSet{}
+ err = c.client.Get().Namespace(c.ns).Resource("replicasets").Name(name).Do().Into(result)
+ return
+}
+
+// Create creates a new ReplicaSet.
+func (c *replicaSets) Create(rs *extensions.ReplicaSet) (result *extensions.ReplicaSet, err error) {
+ result = &extensions.ReplicaSet{}
+ err = c.client.Post().Namespace(c.ns).Resource("replicasets").Body(rs).Do().Into(result)
+ return
+}
+
+// Update updates an existing ReplicaSet.
+func (c *replicaSets) Update(rs *extensions.ReplicaSet) (result *extensions.ReplicaSet, err error) {
+ result = &extensions.ReplicaSet{}
+ err = c.client.Put().Namespace(c.ns).Resource("replicasets").Name(rs.Name).Body(rs).Do().Into(result)
+ return
+}
+
+// UpdateStatus updates an existing ReplicaSet status
+func (c *replicaSets) UpdateStatus(rs *extensions.ReplicaSet) (result *extensions.ReplicaSet, err error) {
+ result = &extensions.ReplicaSet{}
+ err = c.client.Put().Namespace(c.ns).Resource("replicasets").Name(rs.Name).SubResource("status").Body(rs).Do().Into(result)
+ return
+}
+
+// Delete deletes an existing ReplicaSet.
+func (c *replicaSets) Delete(name string, options *api.DeleteOptions) (err error) {
+ return c.client.Delete().Namespace(c.ns).Resource("replicasets").Name(name).Body(options).Do().Error()
+}
+
+// Watch returns a watch.Interface that watches the requested ReplicaSets.
+func (c *replicaSets) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.client.Get().
+ Prefix("watch").
+ Namespace(c.ns).
+ Resource("replicasets").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/replication_controllers.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/replication_controllers.go
new file mode 100644
index 0000000..e4b9e2d
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/replication_controllers.go
@@ -0,0 +1,99 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// ReplicationControllersNamespacer has methods to work with ReplicationController resources in a namespace
+type ReplicationControllersNamespacer interface {
+ ReplicationControllers(namespace string) ReplicationControllerInterface
+}
+
+// ReplicationControllerInterface has methods to work with ReplicationController resources.
+type ReplicationControllerInterface interface {
+ List(opts api.ListOptions) (*api.ReplicationControllerList, error)
+ Get(name string) (*api.ReplicationController, error)
+ Create(ctrl *api.ReplicationController) (*api.ReplicationController, error)
+ Update(ctrl *api.ReplicationController) (*api.ReplicationController, error)
+ UpdateStatus(ctrl *api.ReplicationController) (*api.ReplicationController, error)
+ Delete(name string) error
+ Watch(opts api.ListOptions) (watch.Interface, error)
+}
+
+// replicationControllers implements ReplicationControllersNamespacer interface
+type replicationControllers struct {
+ r *Client
+ ns string
+}
+
+// newReplicationControllers returns a PodsClient
+func newReplicationControllers(c *Client, namespace string) *replicationControllers {
+ return &replicationControllers{c, namespace}
+}
+
+// List takes a selector, and returns the list of replication controllers that match that selector.
+func (c *replicationControllers) List(opts api.ListOptions) (result *api.ReplicationControllerList, err error) {
+ result = &api.ReplicationControllerList{}
+ err = c.r.Get().Namespace(c.ns).Resource("replicationControllers").VersionedParams(&opts, api.ParameterCodec).Do().Into(result)
+ return
+}
+
+// Get returns information about a particular replication controller.
+func (c *replicationControllers) Get(name string) (result *api.ReplicationController, err error) {
+ result = &api.ReplicationController{}
+ err = c.r.Get().Namespace(c.ns).Resource("replicationControllers").Name(name).Do().Into(result)
+ return
+}
+
+// Create creates a new replication controller.
+func (c *replicationControllers) Create(controller *api.ReplicationController) (result *api.ReplicationController, err error) {
+ result = &api.ReplicationController{}
+ err = c.r.Post().Namespace(c.ns).Resource("replicationControllers").Body(controller).Do().Into(result)
+ return
+}
+
+// Update updates an existing replication controller.
+func (c *replicationControllers) Update(controller *api.ReplicationController) (result *api.ReplicationController, err error) {
+ result = &api.ReplicationController{}
+ err = c.r.Put().Namespace(c.ns).Resource("replicationControllers").Name(controller.Name).Body(controller).Do().Into(result)
+ return
+}
+
+// UpdateStatus updates an existing replication controller status
+func (c *replicationControllers) UpdateStatus(controller *api.ReplicationController) (result *api.ReplicationController, err error) {
+ result = &api.ReplicationController{}
+ err = c.r.Put().Namespace(c.ns).Resource("replicationControllers").Name(controller.Name).SubResource("status").Body(controller).Do().Into(result)
+ return
+}
+
+// Delete deletes an existing replication controller.
+func (c *replicationControllers) Delete(name string) error {
+ return c.r.Delete().Namespace(c.ns).Resource("replicationControllers").Name(name).Do().Error()
+}
+
+// Watch returns a watch.Interface that watches the requested controllers.
+func (c *replicationControllers) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.r.Get().
+ Prefix("watch").
+ Namespace(c.ns).
+ Resource("replicationControllers").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/resource_quotas.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/resource_quotas.go
new file mode 100644
index 0000000..9944cef
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/resource_quotas.go
@@ -0,0 +1,102 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// ResourceQuotasNamespacer has methods to work with ResourceQuota resources in a namespace
+type ResourceQuotasNamespacer interface {
+ ResourceQuotas(namespace string) ResourceQuotaInterface
+}
+
+// ResourceQuotaInterface has methods to work with ResourceQuota resources.
+type ResourceQuotaInterface interface {
+ List(opts api.ListOptions) (*api.ResourceQuotaList, error)
+ Get(name string) (*api.ResourceQuota, error)
+ Delete(name string) error
+ Create(resourceQuota *api.ResourceQuota) (*api.ResourceQuota, error)
+ Update(resourceQuota *api.ResourceQuota) (*api.ResourceQuota, error)
+ UpdateStatus(resourceQuota *api.ResourceQuota) (*api.ResourceQuota, error)
+ Watch(opts api.ListOptions) (watch.Interface, error)
+}
+
+// resourceQuotas implements ResourceQuotasNamespacer interface
+type resourceQuotas struct {
+ r *Client
+ ns string
+}
+
+// newResourceQuotas returns a resourceQuotas
+func newResourceQuotas(c *Client, namespace string) *resourceQuotas {
+ return &resourceQuotas{
+ r: c,
+ ns: namespace,
+ }
+}
+
+// List takes a selector, and returns the list of resourceQuotas that match that selector.
+func (c *resourceQuotas) List(opts api.ListOptions) (result *api.ResourceQuotaList, err error) {
+ result = &api.ResourceQuotaList{}
+ err = c.r.Get().Namespace(c.ns).Resource("resourceQuotas").VersionedParams(&opts, api.ParameterCodec).Do().Into(result)
+ return
+}
+
+// Get takes the name of the resourceQuota, and returns the corresponding ResourceQuota object, and an error if it occurs
+func (c *resourceQuotas) Get(name string) (result *api.ResourceQuota, err error) {
+ result = &api.ResourceQuota{}
+ err = c.r.Get().Namespace(c.ns).Resource("resourceQuotas").Name(name).Do().Into(result)
+ return
+}
+
+// Delete takes the name of the resourceQuota, and returns an error if one occurs
+func (c *resourceQuotas) Delete(name string) error {
+ return c.r.Delete().Namespace(c.ns).Resource("resourceQuotas").Name(name).Do().Error()
+}
+
+// Create takes the representation of a resourceQuota. Returns the server's representation of the resourceQuota, and an error, if it occurs.
+func (c *resourceQuotas) Create(resourceQuota *api.ResourceQuota) (result *api.ResourceQuota, err error) {
+ result = &api.ResourceQuota{}
+ err = c.r.Post().Namespace(c.ns).Resource("resourceQuotas").Body(resourceQuota).Do().Into(result)
+ return
+}
+
+// Update takes the representation of a resourceQuota to update spec. Returns the server's representation of the resourceQuota, and an error, if it occurs.
+func (c *resourceQuotas) Update(resourceQuota *api.ResourceQuota) (result *api.ResourceQuota, err error) {
+ result = &api.ResourceQuota{}
+ err = c.r.Put().Namespace(c.ns).Resource("resourceQuotas").Name(resourceQuota.Name).Body(resourceQuota).Do().Into(result)
+ return
+}
+
+// Status takes the representation of a resourceQuota to update status. Returns the server's representation of the resourceQuota, and an error, if it occurs.
+func (c *resourceQuotas) UpdateStatus(resourceQuota *api.ResourceQuota) (result *api.ResourceQuota, err error) {
+ result = &api.ResourceQuota{}
+ err = c.r.Put().Namespace(c.ns).Resource("resourceQuotas").Name(resourceQuota.Name).SubResource("status").Body(resourceQuota).Do().Into(result)
+ return
+}
+
+// Watch returns a watch.Interface that watches the requested resource
+func (c *resourceQuotas) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.r.Get().
+ Prefix("watch").
+ Namespace(c.ns).
+ Resource("resourceQuotas").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/rolebindings.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/rolebindings.go
new file mode 100644
index 0000000..b798380
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/rolebindings.go
@@ -0,0 +1,95 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/rbac"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// RoleBindingsNamespacer has methods to work with RoleBinding resources in a namespace
+type RoleBindingsNamespacer interface {
+ RoleBindings(namespace string) RoleBindingInterface
+}
+
+// RoleBindingInterface has methods to work with RoleBinding resources.
+type RoleBindingInterface interface {
+ List(opts api.ListOptions) (*rbac.RoleBindingList, error)
+ Get(name string) (*rbac.RoleBinding, error)
+ Delete(name string, options *api.DeleteOptions) error
+ Create(roleBinding *rbac.RoleBinding) (*rbac.RoleBinding, error)
+ Update(roleBinding *rbac.RoleBinding) (*rbac.RoleBinding, error)
+ Watch(opts api.ListOptions) (watch.Interface, error)
+}
+
+// roleBindings implements RoleBindingsNamespacer interface
+type roleBindings struct {
+ client *RbacClient
+ ns string
+}
+
+// newRoleBindings returns a roleBindings
+func newRoleBindings(c *RbacClient, namespace string) *roleBindings {
+ return &roleBindings{
+ client: c,
+ ns: namespace,
+ }
+}
+
+// List takes label and field selectors, and returns the list of roleBindings that match those selectors.
+func (c *roleBindings) List(opts api.ListOptions) (result *rbac.RoleBindingList, err error) {
+ result = &rbac.RoleBindingList{}
+ err = c.client.Get().Namespace(c.ns).Resource("rolebindings").VersionedParams(&opts, api.ParameterCodec).Do().Into(result)
+ return
+}
+
+// Get takes the name of the roleBinding, and returns the corresponding RoleBinding object, and an error if it occurs
+func (c *roleBindings) Get(name string) (result *rbac.RoleBinding, err error) {
+ result = &rbac.RoleBinding{}
+ err = c.client.Get().Namespace(c.ns).Resource("rolebindings").Name(name).Do().Into(result)
+ return
+}
+
+// Delete takes the name of the roleBinding and deletes it. Returns an error if one occurs.
+func (c *roleBindings) Delete(name string, options *api.DeleteOptions) error {
+ return c.client.Delete().Namespace(c.ns).Resource("rolebindings").Name(name).Body(options).Do().Error()
+}
+
+// Create takes the representation of a roleBinding and creates it. Returns the server's representation of the roleBinding, and an error, if it occurs.
+func (c *roleBindings) Create(roleBinding *rbac.RoleBinding) (result *rbac.RoleBinding, err error) {
+ result = &rbac.RoleBinding{}
+ err = c.client.Post().Namespace(c.ns).Resource("rolebindings").Body(roleBinding).Do().Into(result)
+ return
+}
+
+// Update takes the representation of a roleBinding and updates it. Returns the server's representation of the roleBinding, and an error, if it occurs.
+func (c *roleBindings) Update(roleBinding *rbac.RoleBinding) (result *rbac.RoleBinding, err error) {
+ result = &rbac.RoleBinding{}
+ err = c.client.Put().Namespace(c.ns).Resource("rolebindings").Name(roleBinding.Name).Body(roleBinding).Do().Into(result)
+ return
+}
+
+// Watch returns a watch.Interface that watches the requested roleBindings.
+func (c *roleBindings) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.client.Get().
+ Prefix("watch").
+ Namespace(c.ns).
+ Resource("rolebindings").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/roles.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/roles.go
new file mode 100644
index 0000000..b265e78
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/roles.go
@@ -0,0 +1,95 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/rbac"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// RolesNamespacer has methods to work with Role resources in a namespace
+type RolesNamespacer interface {
+ Roles(namespace string) RoleInterface
+}
+
+// RoleInterface has methods to work with Role resources.
+type RoleInterface interface {
+ List(opts api.ListOptions) (*rbac.RoleList, error)
+ Get(name string) (*rbac.Role, error)
+ Delete(name string, options *api.DeleteOptions) error
+ Create(role *rbac.Role) (*rbac.Role, error)
+ Update(role *rbac.Role) (*rbac.Role, error)
+ Watch(opts api.ListOptions) (watch.Interface, error)
+}
+
+// roles implements RolesNamespacer interface
+type roles struct {
+ client *RbacClient
+ ns string
+}
+
+// newRoles returns a roles
+func newRoles(c *RbacClient, namespace string) *roles {
+ return &roles{
+ client: c,
+ ns: namespace,
+ }
+}
+
+// List takes label and field selectors, and returns the list of roles that match those selectors.
+func (c *roles) List(opts api.ListOptions) (result *rbac.RoleList, err error) {
+ result = &rbac.RoleList{}
+ err = c.client.Get().Namespace(c.ns).Resource("roles").VersionedParams(&opts, api.ParameterCodec).Do().Into(result)
+ return
+}
+
+// Get takes the name of the role, and returns the corresponding Role object, and an error if it occurs
+func (c *roles) Get(name string) (result *rbac.Role, err error) {
+ result = &rbac.Role{}
+ err = c.client.Get().Namespace(c.ns).Resource("roles").Name(name).Do().Into(result)
+ return
+}
+
+// Delete takes the name of the role and deletes it. Returns an error if one occurs.
+func (c *roles) Delete(name string, options *api.DeleteOptions) error {
+ return c.client.Delete().Namespace(c.ns).Resource("roles").Name(name).Body(options).Do().Error()
+}
+
+// Create takes the representation of a role and creates it. Returns the server's representation of the role, and an error, if it occurs.
+func (c *roles) Create(role *rbac.Role) (result *rbac.Role, err error) {
+ result = &rbac.Role{}
+ err = c.client.Post().Namespace(c.ns).Resource("roles").Body(role).Do().Into(result)
+ return
+}
+
+// Update takes the representation of a role and updates it. Returns the server's representation of the role, and an error, if it occurs.
+func (c *roles) Update(role *rbac.Role) (result *rbac.Role, err error) {
+ result = &rbac.Role{}
+ err = c.client.Put().Namespace(c.ns).Resource("roles").Name(role.Name).Body(role).Do().Into(result)
+ return
+}
+
+// Watch returns a watch.Interface that watches the requested roles.
+func (c *roles) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.client.Get().
+ Prefix("watch").
+ Namespace(c.ns).
+ Resource("roles").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/scale.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/scale.go
new file mode 100644
index 0000000..a55b077
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/scale.go
@@ -0,0 +1,77 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api/meta"
+ "k8s.io/kubernetes/pkg/api/unversioned"
+ "k8s.io/kubernetes/pkg/apis/extensions"
+)
+
+type ScaleNamespacer interface {
+ Scales(namespace string) ScaleInterface
+}
+
+// ScaleInterface has methods to work with Scale (sub)resources.
+type ScaleInterface interface {
+ Get(string, string) (*extensions.Scale, error)
+ Update(string, *extensions.Scale) (*extensions.Scale, error)
+}
+
+// horizontalPodAutoscalers implements HorizontalPodAutoscalersNamespacer interface
+type scales struct {
+ client *ExtensionsClient
+ ns string
+}
+
+// newHorizontalPodAutoscalers returns a horizontalPodAutoscalers
+func newScales(c *ExtensionsClient, namespace string) *scales {
+ return &scales{
+ client: c,
+ ns: namespace,
+ }
+}
+
+// Get takes the reference to scale subresource and returns the subresource or error, if one occurs.
+func (c *scales) Get(kind string, name string) (result *extensions.Scale, err error) {
+ result = &extensions.Scale{}
+
+ // TODO this method needs to take a proper unambiguous kind
+ fullyQualifiedKind := unversioned.GroupVersionKind{Kind: kind}
+ resource, _ := meta.KindToResource(fullyQualifiedKind)
+
+ err = c.client.Get().Namespace(c.ns).Resource(resource.Resource).Name(name).SubResource("scale").Do().Into(result)
+ return
+}
+
+func (c *scales) Update(kind string, scale *extensions.Scale) (result *extensions.Scale, err error) {
+ result = &extensions.Scale{}
+
+ // TODO this method needs to take a proper unambiguous kind
+ fullyQualifiedKind := unversioned.GroupVersionKind{Kind: kind}
+ resource, _ := meta.KindToResource(fullyQualifiedKind)
+
+ err = c.client.Put().
+ Namespace(scale.Namespace).
+ Resource(resource.Resource).
+ Name(scale.Name).
+ SubResource("scale").
+ Body(scale).
+ Do().
+ Into(result)
+ return
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/scheduledjobs.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/scheduledjobs.go
new file mode 100644
index 0000000..de07a7e
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/scheduledjobs.go
@@ -0,0 +1,103 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/batch"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// ScheduledJobsNamespacer has methods to work with ScheduledJob resources in a namespace
+type ScheduledJobsNamespacer interface {
+ ScheduledJobs(namespace string) ScheduledJobInterface
+}
+
+// ScheduledJobInterface exposes methods to work on ScheduledJob resources.
+type ScheduledJobInterface interface {
+ List(opts api.ListOptions) (*batch.ScheduledJobList, error)
+ Get(name string) (*batch.ScheduledJob, error)
+ Create(scheduledJob *batch.ScheduledJob) (*batch.ScheduledJob, error)
+ Update(scheduledJob *batch.ScheduledJob) (*batch.ScheduledJob, error)
+ Delete(name string, options *api.DeleteOptions) error
+ Watch(opts api.ListOptions) (watch.Interface, error)
+ UpdateStatus(scheduledJob *batch.ScheduledJob) (*batch.ScheduledJob, error)
+}
+
+// scheduledJobs implements ScheduledJobsNamespacer interface
+type scheduledJobs struct {
+ r *BatchClient
+ ns string
+}
+
+// newScheduledJobs returns a scheduledJobs
+func newScheduledJobs(c *BatchClient, namespace string) *scheduledJobs {
+ return &scheduledJobs{c, namespace}
+}
+
+// Ensure statically that scheduledJobs implements ScheduledJobInterface.
+var _ ScheduledJobInterface = &scheduledJobs{}
+
+// List returns a list of scheduled jobs that match the label and field selectors.
+func (c *scheduledJobs) List(opts api.ListOptions) (result *batch.ScheduledJobList, err error) {
+ result = &batch.ScheduledJobList{}
+ err = c.r.Get().Namespace(c.ns).Resource("scheduledJobs").VersionedParams(&opts, api.ParameterCodec).Do().Into(result)
+ return
+}
+
+// Get returns information about a particular scheduled job.
+func (c *scheduledJobs) Get(name string) (result *batch.ScheduledJob, err error) {
+ result = &batch.ScheduledJob{}
+ err = c.r.Get().Namespace(c.ns).Resource("scheduledJobs").Name(name).Do().Into(result)
+ return
+}
+
+// Create creates a new scheduled job.
+func (c *scheduledJobs) Create(job *batch.ScheduledJob) (result *batch.ScheduledJob, err error) {
+ result = &batch.ScheduledJob{}
+ err = c.r.Post().Namespace(c.ns).Resource("scheduledJobs").Body(job).Do().Into(result)
+ return
+}
+
+// Update updates an existing scheduled job.
+func (c *scheduledJobs) Update(job *batch.ScheduledJob) (result *batch.ScheduledJob, err error) {
+ result = &batch.ScheduledJob{}
+ err = c.r.Put().Namespace(c.ns).Resource("scheduledJobs").Name(job.Name).Body(job).Do().Into(result)
+ return
+}
+
+// Delete deletes a scheduled job, returns error if one occurs.
+func (c *scheduledJobs) Delete(name string, options *api.DeleteOptions) (err error) {
+ return c.r.Delete().Namespace(c.ns).Resource("scheduledJobs").Name(name).Body(options).Do().Error()
+}
+
+// Watch returns a watch.Interface that watches the requested scheduled jobs.
+func (c *scheduledJobs) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.r.Get().
+ Prefix("watch").
+ Namespace(c.ns).
+ Resource("scheduledJobs").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
+
+// UpdateStatus takes the name of the scheduled job and the new status. Returns the server's representation of the scheduled job, and an error, if it occurs.
+func (c *scheduledJobs) UpdateStatus(job *batch.ScheduledJob) (result *batch.ScheduledJob, err error) {
+ result = &batch.ScheduledJob{}
+ err = c.r.Put().Namespace(c.ns).Resource("scheduledJobs").Name(job.Name).SubResource("status").Body(job).Do().Into(result)
+ return
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/secrets.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/secrets.go
new file mode 100644
index 0000000..bba3fd9
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/secrets.go
@@ -0,0 +1,120 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+type SecretsNamespacer interface {
+ Secrets(namespace string) SecretsInterface
+}
+
+type SecretsInterface interface {
+ Create(secret *api.Secret) (*api.Secret, error)
+ Update(secret *api.Secret) (*api.Secret, error)
+ Delete(name string) error
+ List(opts api.ListOptions) (*api.SecretList, error)
+ Get(name string) (*api.Secret, error)
+ Watch(opts api.ListOptions) (watch.Interface, error)
+}
+
+// events implements Secrets interface
+type secrets struct {
+ client *Client
+ namespace string
+}
+
+// newSecrets returns a new secrets object.
+func newSecrets(c *Client, ns string) *secrets {
+ return &secrets{
+ client: c,
+ namespace: ns,
+ }
+}
+
+func (s *secrets) Create(secret *api.Secret) (*api.Secret, error) {
+ result := &api.Secret{}
+ err := s.client.Post().
+ Namespace(s.namespace).
+ Resource("secrets").
+ Body(secret).
+ Do().
+ Into(result)
+
+ return result, err
+}
+
+// List returns a list of secrets matching the selectors.
+func (s *secrets) List(opts api.ListOptions) (*api.SecretList, error) {
+ result := &api.SecretList{}
+
+ err := s.client.Get().
+ Namespace(s.namespace).
+ Resource("secrets").
+ VersionedParams(&opts, api.ParameterCodec).
+ Do().
+ Into(result)
+
+ return result, err
+}
+
+// Get returns the given secret, or an error.
+func (s *secrets) Get(name string) (*api.Secret, error) {
+ result := &api.Secret{}
+ err := s.client.Get().
+ Namespace(s.namespace).
+ Resource("secrets").
+ Name(name).
+ Do().
+ Into(result)
+
+ return result, err
+}
+
+// Watch starts watching for secrets matching the given selectors.
+func (s *secrets) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return s.client.Get().
+ Prefix("watch").
+ Namespace(s.namespace).
+ Resource("secrets").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
+
+func (s *secrets) Delete(name string) error {
+ return s.client.Delete().
+ Namespace(s.namespace).
+ Resource("secrets").
+ Name(name).
+ Do().
+ Error()
+}
+
+func (s *secrets) Update(secret *api.Secret) (result *api.Secret, err error) {
+ result = &api.Secret{}
+ err = s.client.Put().
+ Namespace(s.namespace).
+ Resource("secrets").
+ Name(secret.Name).
+ Body(secret).
+ Do().
+ Into(result)
+
+ return
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/service_accounts.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/service_accounts.go
new file mode 100644
index 0000000..68d1b21
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/service_accounts.go
@@ -0,0 +1,120 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+type ServiceAccountsNamespacer interface {
+ ServiceAccounts(namespace string) ServiceAccountsInterface
+}
+
+type ServiceAccountsInterface interface {
+ Create(serviceAccount *api.ServiceAccount) (*api.ServiceAccount, error)
+ Update(serviceAccount *api.ServiceAccount) (*api.ServiceAccount, error)
+ Delete(name string) error
+ List(opts api.ListOptions) (*api.ServiceAccountList, error)
+ Get(name string) (*api.ServiceAccount, error)
+ Watch(opts api.ListOptions) (watch.Interface, error)
+}
+
+// serviceAccounts implements ServiceAccounts interface
+type serviceAccounts struct {
+ client *Client
+ namespace string
+}
+
+// newServiceAccounts returns a new serviceAccounts object.
+func newServiceAccounts(c *Client, ns string) ServiceAccountsInterface {
+ return &serviceAccounts{
+ client: c,
+ namespace: ns,
+ }
+}
+
+func (s *serviceAccounts) Create(serviceAccount *api.ServiceAccount) (*api.ServiceAccount, error) {
+ result := &api.ServiceAccount{}
+ err := s.client.Post().
+ Namespace(s.namespace).
+ Resource("serviceAccounts").
+ Body(serviceAccount).
+ Do().
+ Into(result)
+
+ return result, err
+}
+
+// List returns a list of serviceAccounts matching the selectors.
+func (s *serviceAccounts) List(opts api.ListOptions) (*api.ServiceAccountList, error) {
+ result := &api.ServiceAccountList{}
+
+ err := s.client.Get().
+ Namespace(s.namespace).
+ Resource("serviceAccounts").
+ VersionedParams(&opts, api.ParameterCodec).
+ Do().
+ Into(result)
+
+ return result, err
+}
+
+// Get returns the given serviceAccount, or an error.
+func (s *serviceAccounts) Get(name string) (*api.ServiceAccount, error) {
+ result := &api.ServiceAccount{}
+ err := s.client.Get().
+ Namespace(s.namespace).
+ Resource("serviceAccounts").
+ Name(name).
+ Do().
+ Into(result)
+
+ return result, err
+}
+
+// Watch starts watching for serviceAccounts matching the given selectors.
+func (s *serviceAccounts) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return s.client.Get().
+ Prefix("watch").
+ Namespace(s.namespace).
+ Resource("serviceAccounts").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
+
+func (s *serviceAccounts) Delete(name string) error {
+ return s.client.Delete().
+ Namespace(s.namespace).
+ Resource("serviceAccounts").
+ Name(name).
+ Do().
+ Error()
+}
+
+func (s *serviceAccounts) Update(serviceAccount *api.ServiceAccount) (result *api.ServiceAccount, err error) {
+ result = &api.ServiceAccount{}
+ err = s.client.Put().
+ Namespace(s.namespace).
+ Resource("serviceAccounts").
+ Name(serviceAccount.Name).
+ Body(serviceAccount).
+ Do().
+ Into(result)
+
+ return
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/services.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/services.go
new file mode 100644
index 0000000..aada5c1
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/services.go
@@ -0,0 +1,121 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/client/restclient"
+ "k8s.io/kubernetes/pkg/util/net"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// ServicesNamespacer has methods to work with Service resources in a namespace
+type ServicesNamespacer interface {
+ Services(namespace string) ServiceInterface
+}
+
+// ServiceInterface has methods to work with Service resources.
+type ServiceInterface interface {
+ List(opts api.ListOptions) (*api.ServiceList, error)
+ Get(name string) (*api.Service, error)
+ Create(srv *api.Service) (*api.Service, error)
+ Update(srv *api.Service) (*api.Service, error)
+ UpdateStatus(srv *api.Service) (*api.Service, error)
+ Delete(name string) error
+ Watch(opts api.ListOptions) (watch.Interface, error)
+ ProxyGet(scheme, name, port, path string, params map[string]string) restclient.ResponseWrapper
+}
+
+// services implements ServicesNamespacer interface
+type services struct {
+ r *Client
+ ns string
+}
+
+// newServices returns a services
+func newServices(c *Client, namespace string) *services {
+ return &services{c, namespace}
+}
+
+// List takes a selector, and returns the list of services that match that selector
+func (c *services) List(opts api.ListOptions) (result *api.ServiceList, err error) {
+ result = &api.ServiceList{}
+ err = c.r.Get().
+ Namespace(c.ns).
+ Resource("services").
+ VersionedParams(&opts, api.ParameterCodec).
+ Do().
+ Into(result)
+ return
+}
+
+// Get returns information about a particular service.
+func (c *services) Get(name string) (result *api.Service, err error) {
+ result = &api.Service{}
+ err = c.r.Get().Namespace(c.ns).Resource("services").Name(name).Do().Into(result)
+ return
+}
+
+// Create creates a new service.
+func (c *services) Create(svc *api.Service) (result *api.Service, err error) {
+ result = &api.Service{}
+ err = c.r.Post().Namespace(c.ns).Resource("services").Body(svc).Do().Into(result)
+ return
+}
+
+// Update updates an existing service.
+func (c *services) Update(svc *api.Service) (result *api.Service, err error) {
+ result = &api.Service{}
+ err = c.r.Put().Namespace(c.ns).Resource("services").Name(svc.Name).Body(svc).Do().Into(result)
+ return
+}
+
+// UpdateStatus takes a Service object with the new status and applies it as an update to the existing Service.
+func (c *services) UpdateStatus(service *api.Service) (result *api.Service, err error) {
+ result = &api.Service{}
+ err = c.r.Put().Namespace(c.ns).Resource("services").Name(service.Name).SubResource("status").Body(service).Do().Into(result)
+ return
+}
+
+// Delete deletes an existing service.
+func (c *services) Delete(name string) error {
+ return c.r.Delete().Namespace(c.ns).Resource("services").Name(name).Do().Error()
+}
+
+// Watch returns a watch.Interface that watches the requested services.
+func (c *services) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.r.Get().
+ Prefix("watch").
+ Namespace(c.ns).
+ Resource("services").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
+
+// ProxyGet returns a response of the service by calling it through the proxy.
+func (c *services) ProxyGet(scheme, name, port, path string, params map[string]string) restclient.ResponseWrapper {
+ request := c.r.Get().
+ Namespace(c.ns).
+ Resource("services").
+ SubResource("proxy").
+ Name(net.JoinSchemeNamePort(scheme, name, port)).
+ Suffix(path)
+ for k, v := range params {
+ request = request.Param(k, v)
+ }
+ return request
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/thirdpartyresources.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/thirdpartyresources.go
new file mode 100644
index 0000000..68adddb
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/thirdpartyresources.go
@@ -0,0 +1,98 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/extensions"
+ "k8s.io/kubernetes/pkg/watch"
+)
+
+// ThirdPartyResourceNamespacer has methods to work with ThirdPartyResource resources in a namespace
+type ThirdPartyResourceNamespacer interface {
+ ThirdPartyResources() ThirdPartyResourceInterface
+}
+
+type ThirdPartyResourceInterface interface {
+ List(opts api.ListOptions) (*extensions.ThirdPartyResourceList, error)
+ Get(name string) (*extensions.ThirdPartyResource, error)
+ Create(ctrl *extensions.ThirdPartyResource) (*extensions.ThirdPartyResource, error)
+ Update(ctrl *extensions.ThirdPartyResource) (*extensions.ThirdPartyResource, error)
+ UpdateStatus(ctrl *extensions.ThirdPartyResource) (*extensions.ThirdPartyResource, error)
+ Delete(name string) error
+ Watch(opts api.ListOptions) (watch.Interface, error)
+}
+
+// thirdPartyResources implements DaemonsSetsNamespacer interface
+type thirdPartyResources struct {
+ r *ExtensionsClient
+}
+
+func newThirdPartyResources(c *ExtensionsClient) *thirdPartyResources {
+ return &thirdPartyResources{c}
+}
+
+// Ensure statically that thirdPartyResources implements ThirdPartyResourcesInterface.
+var _ ThirdPartyResourceInterface = &thirdPartyResources{}
+
+func (c *thirdPartyResources) List(opts api.ListOptions) (result *extensions.ThirdPartyResourceList, err error) {
+ result = &extensions.ThirdPartyResourceList{}
+ err = c.r.Get().Resource("thirdpartyresources").VersionedParams(&opts, api.ParameterCodec).Do().Into(result)
+ return
+}
+
+// Get returns information about a particular third party resource.
+func (c *thirdPartyResources) Get(name string) (result *extensions.ThirdPartyResource, err error) {
+ result = &extensions.ThirdPartyResource{}
+ err = c.r.Get().Resource("thirdpartyresources").Name(name).Do().Into(result)
+ return
+}
+
+// Create creates a new third party resource.
+func (c *thirdPartyResources) Create(resource *extensions.ThirdPartyResource) (result *extensions.ThirdPartyResource, err error) {
+ result = &extensions.ThirdPartyResource{}
+ err = c.r.Post().Resource("thirdpartyresources").Body(resource).Do().Into(result)
+ return
+}
+
+// Update updates an existing third party resource.
+func (c *thirdPartyResources) Update(resource *extensions.ThirdPartyResource) (result *extensions.ThirdPartyResource, err error) {
+ result = &extensions.ThirdPartyResource{}
+ err = c.r.Put().Resource("thirdpartyresources").Name(resource.Name).Body(resource).Do().Into(result)
+ return
+}
+
+// UpdateStatus updates an existing third party resource status
+func (c *thirdPartyResources) UpdateStatus(resource *extensions.ThirdPartyResource) (result *extensions.ThirdPartyResource, err error) {
+ result = &extensions.ThirdPartyResource{}
+ err = c.r.Put().Resource("thirdpartyresources").Name(resource.Name).SubResource("status").Body(resource).Do().Into(result)
+ return
+}
+
+// Delete deletes an existing third party resource.
+func (c *thirdPartyResources) Delete(name string) error {
+ return c.r.Delete().Resource("thirdpartyresources").Name(name).Do().Error()
+}
+
+// Watch returns a watch.Interface that watches the requested third party resources.
+func (c *thirdPartyResources) Watch(opts api.ListOptions) (watch.Interface, error) {
+ return c.r.Get().
+ Prefix("watch").
+ Resource("thirdpartyresources").
+ VersionedParams(&opts, api.ParameterCodec).
+ Watch()
+}
diff --git a/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/util.go b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/util.go
new file mode 100644
index 0000000..9657ff2
--- /dev/null
+++ b/kube2msb/src/vendor/k8s.io/kubernetes/pkg/client/unversioned/util.go
@@ -0,0 +1,79 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package unversioned
+
+import (
+ "time"
+
+ "k8s.io/kubernetes/pkg/api/errors"
+ "k8s.io/kubernetes/pkg/util/wait"
+)
+
+// DefaultRetry is the recommended retry for a conflict where multiple clients
+// are making changes to the same resource.
+var DefaultRetry = wait.Backoff{
+ Steps: 5,
+ Duration: 10 * time.Millisecond,
+ Factor: 1.0,
+ Jitter: 0.1,
+}
+
+// DefaultBackoff is the recommended backoff for a conflict where a client
+// may be attempting to make an unrelated modification to a resource under
+// active management by one or more controllers.
+var DefaultBackoff = wait.Backoff{
+ Steps: 4,
+ Duration: 10 * time.Millisecond,
+ Factor: 5.0,
+ Jitter: 0.1,
+}
+
+// RetryConflict executes the provided function repeatedly, retrying if the server returns a conflicting
+// write. Callers should preserve previous executions if they wish to retry changes. It performs an
+// exponential backoff.
+//
+// var pod *api.Pod
+// err := RetryOnConflict(DefaultBackoff, func() (err error) {
+// pod, err = c.Pods("mynamespace").UpdateStatus(podStatus)
+// return
+// })
+// if err != nil {
+// // may be conflict if max retries were hit
+// return err
+// }
+// ...
+//
+// TODO: Make Backoff an interface?
+func RetryOnConflict(backoff wait.Backoff, fn func() error) error {
+ var lastConflictErr error
+ err := wait.ExponentialBackoff(backoff, func() (bool, error) {
+ err := fn()
+ switch {
+ case err == nil:
+ return true, nil
+ case errors.IsConflict(err):
+ lastConflictErr = err
+ return false, nil
+ default:
+ return false, err
+ }
+ })
+ if err == wait.ErrWaitTimeout {
+ err = lastConflictErr
+ }
+ return err
+}