Merge branch 'master' into master

This commit is contained in:
Jeff Chan 2018-05-11 10:03:32 +08:00 committed by GitHub
commit f8386d5b0f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
681 changed files with 10184 additions and 7721 deletions

View File

@ -1,8 +1,8 @@
<!-- Thanks for sending a pull request! Here are some tips for you: <!-- Thanks for sending a pull request! Here are some tips for you:
1. If this is your first time, read our contributor guidelines https://git.k8s.io/community/contributors/devel/pull-requests.md#the-pr-submit-process and developer guide https://git.k8s.io/community/contributors/devel/development.md#development-guide 1. If this is your first time, read our contributor guidelines https://git.k8s.io/community/contributors/guide#your-first-contribution and developer guide https://git.k8s.io/community/contributors/devel/development.md#development-guide
2. If you want *faster* PR reviews, read how: https://git.k8s.io/community/contributors/devel/pull-requests.md#best-practices-for-faster-reviews 2. If you want *faster* PR reviews, read how: https://git.k8s.io/community/contributors/guide/pull-requests.md#best-practices-for-faster-reviews
3. Follow the instructions for writing a release note: https://git.k8s.io/community/contributors/devel/pull-requests.md#write-release-notes-if-needed 3. Follow the instructions for writing a release note: https://git.k8s.io/community/contributors/guide/release-notes.md
4. If the PR is unfinished, see how to mark it: https://github.com/kubernetes/community/blob/master/contributors/devel/pull-requests.md#marking-unfinished-pull-requests 4. If the PR is unfinished, see how to mark it: https://git.k8s.io/community/contributors/guide/pull-requests.md#marking-unfinished-pull-requests
--> -->
**What this PR does / why we need it**: **What this PR does / why we need it**:

16
Godeps/Godeps.json generated
View File

@ -3299,35 +3299,35 @@
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/aggregator", "ImportPath": "k8s.io/kube-openapi/pkg/aggregator",
"Rev": "f08db293d3ef80052d6513ece19792642a289fea" "Rev": "61db125d227fc9d4e373819a059516f32f7f23c7"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/builder", "ImportPath": "k8s.io/kube-openapi/pkg/builder",
"Rev": "f08db293d3ef80052d6513ece19792642a289fea" "Rev": "61db125d227fc9d4e373819a059516f32f7f23c7"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/common", "ImportPath": "k8s.io/kube-openapi/pkg/common",
"Rev": "f08db293d3ef80052d6513ece19792642a289fea" "Rev": "61db125d227fc9d4e373819a059516f32f7f23c7"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/generators", "ImportPath": "k8s.io/kube-openapi/pkg/generators",
"Rev": "f08db293d3ef80052d6513ece19792642a289fea" "Rev": "61db125d227fc9d4e373819a059516f32f7f23c7"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/handler", "ImportPath": "k8s.io/kube-openapi/pkg/handler",
"Rev": "f08db293d3ef80052d6513ece19792642a289fea" "Rev": "61db125d227fc9d4e373819a059516f32f7f23c7"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/util", "ImportPath": "k8s.io/kube-openapi/pkg/util",
"Rev": "f08db293d3ef80052d6513ece19792642a289fea" "Rev": "61db125d227fc9d4e373819a059516f32f7f23c7"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/util/proto", "ImportPath": "k8s.io/kube-openapi/pkg/util/proto",
"Rev": "f08db293d3ef80052d6513ece19792642a289fea" "Rev": "61db125d227fc9d4e373819a059516f32f7f23c7"
}, },
{ {
"ImportPath": "k8s.io/kube-openapi/pkg/util/proto/validation", "ImportPath": "k8s.io/kube-openapi/pkg/util/proto/validation",
"Rev": "f08db293d3ef80052d6513ece19792642a289fea" "Rev": "61db125d227fc9d4e373819a059516f32f7f23c7"
}, },
{ {
"ImportPath": "k8s.io/utils/clock", "ImportPath": "k8s.io/utils/clock",

View File

@ -75671,6 +75671,36 @@
} }
] ]
}, },
"io.k8s.api.core.v1.ConfigMapNodeConfigSource": {
"description": "ConfigMapNodeConfigSource contains the information to reference a ConfigMap as a config source for the Node.",
"required": [
"namespace",
"name",
"kubeletConfigKey"
],
"properties": {
"kubeletConfigKey": {
"description": "KubeletConfigKey declares which key of the referenced ConfigMap corresponds to the KubeletConfiguration structure This field is required in all cases.",
"type": "string"
},
"name": {
"description": "Name is the metadata.name of the referenced ConfigMap. This field is required in all cases.",
"type": "string"
},
"namespace": {
"description": "Namespace is the metadata.namespace of the referenced ConfigMap. This field is required in all cases.",
"type": "string"
},
"resourceVersion": {
"description": "ResourceVersion is the metadata.ResourceVersion of the referenced ConfigMap. This field is forbidden in Node.Spec.",
"type": "string"
},
"uid": {
"description": "UID is the metadata.UID of the referenced ConfigMap. This field is currently reqired in Node.Spec.",
"type": "string"
}
}
},
"io.k8s.api.core.v1.ConfigMapProjection": { "io.k8s.api.core.v1.ConfigMapProjection": {
"description": "Adapts a ConfigMap into a projected volume.\n\nThe contents of the target ConfigMap's Data field will be presented in a projected volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. Note that this is identical to a configmap volume source without the default mode.", "description": "Adapts a ConfigMap into a projected volume.\n\nThe contents of the target ConfigMap's Data field will be presented in a projected volume as files using the keys in the Data field as the file names, unless the items element is populated with specific mappings of keys to paths. Note that this is identical to a configmap volume source without the default mode.",
"properties": { "properties": {
@ -77242,25 +77272,11 @@
"io.k8s.api.core.v1.NodeConfigSource": { "io.k8s.api.core.v1.NodeConfigSource": {
"description": "NodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil.", "description": "NodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil.",
"properties": { "properties": {
"apiVersion": { "configMap": {
"description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", "description": "ConfigMap is a reference to a Node's ConfigMap",
"type": "string" "$ref": "#/definitions/io.k8s.api.core.v1.ConfigMapNodeConfigSource"
},
"configMapRef": {
"$ref": "#/definitions/io.k8s.api.core.v1.ObjectReference"
},
"kind": {
"description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds",
"type": "string"
} }
}, }
"x-kubernetes-group-version-kind": [
{
"group": "",
"kind": "NodeConfigSource",
"version": "v1"
}
]
}, },
"io.k8s.api.core.v1.NodeDaemonEndpoints": { "io.k8s.api.core.v1.NodeDaemonEndpoints": {
"description": "NodeDaemonEndpoints lists ports opened by daemons running on the Node.", "description": "NodeDaemonEndpoints lists ports opened by daemons running on the Node.",

View File

@ -18718,16 +18718,40 @@
"id": "v1.NodeConfigSource", "id": "v1.NodeConfigSource",
"description": "NodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil.", "description": "NodeConfigSource specifies a source of node configuration. Exactly one subfield (excluding metadata) must be non-nil.",
"properties": { "properties": {
"kind": { "configMap": {
"$ref": "v1.ConfigMapNodeConfigSource",
"description": "ConfigMap is a reference to a Node's ConfigMap"
}
}
},
"v1.ConfigMapNodeConfigSource": {
"id": "v1.ConfigMapNodeConfigSource",
"description": "ConfigMapNodeConfigSource contains the information to reference a ConfigMap as a config source for the Node.",
"required": [
"namespace",
"name",
"kubeletConfigKey"
],
"properties": {
"namespace": {
"type": "string", "type": "string",
"description": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds" "description": "Namespace is the metadata.namespace of the referenced ConfigMap. This field is required in all cases."
}, },
"apiVersion": { "name": {
"type": "string", "type": "string",
"description": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources" "description": "Name is the metadata.name of the referenced ConfigMap. This field is required in all cases."
}, },
"configMapRef": { "uid": {
"$ref": "v1.ObjectReference" "type": "string",
"description": "UID is the metadata.UID of the referenced ConfigMap. This field is currently reqired in Node.Spec."
},
"resourceVersion": {
"type": "string",
"description": "ResourceVersion is the metadata.ResourceVersion of the referenced ConfigMap. This field is forbidden in Node.Spec."
},
"kubeletConfigKey": {
"type": "string",
"description": "KubeletConfigKey declares which key of the referenced ConfigMap corresponds to the KubeletConfiguration structure This field is required in all cases."
} }
} }
}, },

View File

@ -15,31 +15,35 @@
prefix = "https://storage.googleapis.com/k8s-bazel-cache/" prefix = "https://storage.googleapis.com/k8s-bazel-cache/"
def mirror(url): def mirror(url):
"""Try downloading a URL from a GCS mirror first, then from the original. """Try downloading a URL from a GCS mirror first, then from the original.
Update the GCS bucket using bazel run //hack:update-mirror""" Update the GCS bucket using bazel run //hack:update-mirror"""
return [prefix + url, url] return [prefix + url, url]
# This function only gives proper results when executed from WORKSPACE,
# but the data is needed in sh_binary, which can only be in a BUILD file.
# Thus, it is be exported by a repository_rule (which executes in WORKSPACE)
# to be used by the sh_binary.
def mirror_urls(): def mirror_urls():
urls = [] # This function only gives proper results when executed from WORKSPACE,
for k, v in native.existing_rules().items(): # but the data is needed in sh_binary, which can only be in a BUILD file.
us = list(v.get('urls', [])) # Thus, it is be exported by a repository_rule (which executes in WORKSPACE)
if 'url' in v: # to be used by the sh_binary.
us.append(v['url']) urls = []
for u in us: for k, v in native.existing_rules().items():
if u and not u.startswith(prefix): us = list(v.get("urls", []))
urls.append(u) if "url" in v:
return sorted(urls) us.append(v["url"])
for u in us:
if u and not u.startswith(prefix):
urls.append(u)
return sorted(urls)
def export_urls_impl(repo_ctx): def export_urls_impl(repo_ctx):
repo_ctx.file(repo_ctx.path("BUILD.bazel"), """ repo_ctx.file(repo_ctx.path("BUILD.bazel"), """
exports_files(glob(["**"]), visibility=["//visibility:public"]) exports_files(glob(["**"]), visibility=["//visibility:public"])
""") """)
repo_ctx.file(repo_ctx.path("urls.txt"), content="\n".join(repo_ctx.attr.urls)) repo_ctx.file(
repo_ctx.path("urls.txt"),
# Add a trailing newline, since the "while read" loop needs it
content = ("\n".join(repo_ctx.attr.urls) + "\n"),
)
_export_urls = repository_rule( _export_urls = repository_rule(
attrs = { attrs = {
@ -50,4 +54,4 @@ _export_urls = repository_rule(
) )
def export_urls(name): def export_urls(name):
return _export_urls(name=name, urls=mirror_urls()) return _export_urls(name = name, urls = mirror_urls())

View File

@ -36,30 +36,30 @@ data:
apiVersion: extensions/v1beta1 apiVersion: extensions/v1beta1
kind: Deployment kind: Deployment
metadata: metadata:
name: heapster-v1.5.2 name: heapster-v1.5.3
namespace: kube-system namespace: kube-system
labels: labels:
k8s-app: heapster k8s-app: heapster
kubernetes.io/cluster-service: "true" kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile addonmanager.kubernetes.io/mode: Reconcile
version: v1.5.2 version: v1.5.3
spec: spec:
replicas: 1 replicas: 1
selector: selector:
matchLabels: matchLabels:
k8s-app: heapster k8s-app: heapster
version: v1.5.2 version: v1.5.3
template: template:
metadata: metadata:
labels: labels:
k8s-app: heapster k8s-app: heapster
version: v1.5.2 version: v1.5.3
annotations: annotations:
scheduler.alpha.kubernetes.io/critical-pod: '' scheduler.alpha.kubernetes.io/critical-pod: ''
spec: spec:
priorityClassName: system-cluster-critical priorityClassName: system-cluster-critical
containers: containers:
- image: k8s.gcr.io/heapster-amd64:v1.5.2 - image: k8s.gcr.io/heapster-amd64:v1.5.3
name: heapster name: heapster
livenessProbe: livenessProbe:
httpGet: httpGet:
@ -72,7 +72,7 @@ spec:
- /heapster - /heapster
- --source=kubernetes.summary_api:'' - --source=kubernetes.summary_api:''
- --sink=gcm - --sink=gcm
- image: k8s.gcr.io/heapster-amd64:v1.5.2 - image: k8s.gcr.io/heapster-amd64:v1.5.3
name: eventer name: eventer
command: command:
- /eventer - /eventer
@ -107,7 +107,7 @@ spec:
- --memory={{ base_metrics_memory }} - --memory={{ base_metrics_memory }}
- --extra-memory={{metrics_memory_per_node}}Mi - --extra-memory={{metrics_memory_per_node}}Mi
- --threshold=5 - --threshold=5
- --deployment=heapster-v1.5.2 - --deployment=heapster-v1.5.3
- --container=heapster - --container=heapster
- --poll-period=300000 - --poll-period=300000
- --estimator=exponential - --estimator=exponential
@ -140,7 +140,7 @@ spec:
- --memory={{base_eventer_memory}} - --memory={{base_eventer_memory}}
- --extra-memory={{eventer_memory_per_node}}Ki - --extra-memory={{eventer_memory_per_node}}Ki
- --threshold=5 - --threshold=5
- --deployment=heapster-v1.5.2 - --deployment=heapster-v1.5.3
- --container=eventer - --container=eventer
- --poll-period=300000 - --poll-period=300000
- --estimator=exponential - --estimator=exponential

View File

@ -36,30 +36,30 @@ data:
apiVersion: extensions/v1beta1 apiVersion: extensions/v1beta1
kind: Deployment kind: Deployment
metadata: metadata:
name: heapster-v1.5.2 name: heapster-v1.5.3
namespace: kube-system namespace: kube-system
labels: labels:
k8s-app: heapster k8s-app: heapster
kubernetes.io/cluster-service: "true" kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile addonmanager.kubernetes.io/mode: Reconcile
version: v1.5.2 version: v1.5.3
spec: spec:
replicas: 1 replicas: 1
selector: selector:
matchLabels: matchLabels:
k8s-app: heapster k8s-app: heapster
version: v1.5.2 version: v1.5.3
template: template:
metadata: metadata:
labels: labels:
k8s-app: heapster k8s-app: heapster
version: v1.5.2 version: v1.5.3
annotations: annotations:
scheduler.alpha.kubernetes.io/critical-pod: '' scheduler.alpha.kubernetes.io/critical-pod: ''
spec: spec:
priorityClassName: system-cluster-critical priorityClassName: system-cluster-critical
containers: containers:
- image: k8s.gcr.io/heapster-amd64:v1.5.2 - image: k8s.gcr.io/heapster-amd64:v1.5.3
name: heapster name: heapster
livenessProbe: livenessProbe:
httpGet: httpGet:
@ -73,7 +73,7 @@ spec:
- --source=kubernetes.summary_api:'' - --source=kubernetes.summary_api:''
- --sink=influxdb:http://monitoring-influxdb:8086 - --sink=influxdb:http://monitoring-influxdb:8086
- --sink=gcm:?metrics=autoscaling - --sink=gcm:?metrics=autoscaling
- image: k8s.gcr.io/heapster-amd64:v1.5.2 - image: k8s.gcr.io/heapster-amd64:v1.5.3
name: eventer name: eventer
command: command:
- /eventer - /eventer
@ -108,7 +108,7 @@ spec:
- --memory={{ base_metrics_memory }} - --memory={{ base_metrics_memory }}
- --extra-memory={{ metrics_memory_per_node }}Mi - --extra-memory={{ metrics_memory_per_node }}Mi
- --threshold=5 - --threshold=5
- --deployment=heapster-v1.5.2 - --deployment=heapster-v1.5.3
- --container=heapster - --container=heapster
- --poll-period=300000 - --poll-period=300000
- --estimator=exponential - --estimator=exponential
@ -141,7 +141,7 @@ spec:
- --memory={{ base_eventer_memory }} - --memory={{ base_eventer_memory }}
- --extra-memory={{ eventer_memory_per_node }}Ki - --extra-memory={{ eventer_memory_per_node }}Ki
- --threshold=5 - --threshold=5
- --deployment=heapster-v1.5.2 - --deployment=heapster-v1.5.3
- --container=eventer - --container=eventer
- --poll-period=300000 - --poll-period=300000
- --estimator=exponential - --estimator=exponential

View File

@ -36,30 +36,30 @@ data:
apiVersion: extensions/v1beta1 apiVersion: extensions/v1beta1
kind: Deployment kind: Deployment
metadata: metadata:
name: heapster-v1.5.2 name: heapster-v1.5.3
namespace: kube-system namespace: kube-system
labels: labels:
k8s-app: heapster k8s-app: heapster
kubernetes.io/cluster-service: "true" kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile addonmanager.kubernetes.io/mode: Reconcile
version: v1.5.2 version: v1.5.3
spec: spec:
replicas: 1 replicas: 1
selector: selector:
matchLabels: matchLabels:
k8s-app: heapster k8s-app: heapster
version: v1.5.2 version: v1.5.3
template: template:
metadata: metadata:
labels: labels:
k8s-app: heapster k8s-app: heapster
version: v1.5.2 version: v1.5.3
annotations: annotations:
scheduler.alpha.kubernetes.io/critical-pod: '' scheduler.alpha.kubernetes.io/critical-pod: ''
spec: spec:
priorityClassName: system-cluster-critical priorityClassName: system-cluster-critical
containers: containers:
- image: k8s.gcr.io/heapster-amd64:v1.5.2 - image: k8s.gcr.io/heapster-amd64:v1.5.3
name: heapster name: heapster
livenessProbe: livenessProbe:
httpGet: httpGet:
@ -72,7 +72,7 @@ spec:
- /heapster - /heapster
- --source=kubernetes.summary_api:'' - --source=kubernetes.summary_api:''
- --sink=influxdb:http://monitoring-influxdb:8086 - --sink=influxdb:http://monitoring-influxdb:8086
- image: k8s.gcr.io/heapster-amd64:v1.5.2 - image: k8s.gcr.io/heapster-amd64:v1.5.3
name: eventer name: eventer
command: command:
- /eventer - /eventer
@ -107,7 +107,7 @@ spec:
- --memory={{ base_metrics_memory }} - --memory={{ base_metrics_memory }}
- --extra-memory={{ metrics_memory_per_node }}Mi - --extra-memory={{ metrics_memory_per_node }}Mi
- --threshold=5 - --threshold=5
- --deployment=heapster-v1.5.2 - --deployment=heapster-v1.5.3
- --container=heapster - --container=heapster
- --poll-period=300000 - --poll-period=300000
- --estimator=exponential - --estimator=exponential
@ -140,7 +140,7 @@ spec:
- --memory={{ base_eventer_memory }} - --memory={{ base_eventer_memory }}
- --extra-memory={{ eventer_memory_per_node }}Ki - --extra-memory={{ eventer_memory_per_node }}Ki
- --threshold=5 - --threshold=5
- --deployment=heapster-v1.5.2 - --deployment=heapster-v1.5.3
- --container=eventer - --container=eventer
- --poll-period=300000 - --poll-period=300000
- --estimator=exponential - --estimator=exponential

View File

@ -23,30 +23,30 @@ data:
apiVersion: extensions/v1beta1 apiVersion: extensions/v1beta1
kind: Deployment kind: Deployment
metadata: metadata:
name: heapster-v1.5.2 name: heapster-v1.5.3
namespace: kube-system namespace: kube-system
labels: labels:
k8s-app: heapster k8s-app: heapster
kubernetes.io/cluster-service: "true" kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile addonmanager.kubernetes.io/mode: Reconcile
version: v1.5.2 version: v1.5.3
spec: spec:
replicas: 1 replicas: 1
selector: selector:
matchLabels: matchLabels:
k8s-app: heapster k8s-app: heapster
version: v1.5.2 version: v1.5.3
template: template:
metadata: metadata:
labels: labels:
k8s-app: heapster k8s-app: heapster
version: v1.5.2 version: v1.5.3
annotations: annotations:
scheduler.alpha.kubernetes.io/critical-pod: '' scheduler.alpha.kubernetes.io/critical-pod: ''
spec: spec:
priorityClassName: system-cluster-critical priorityClassName: system-cluster-critical
containers: containers:
- image: k8s.gcr.io/heapster-amd64:v1.5.2 - image: k8s.gcr.io/heapster-amd64:v1.5.3
name: heapster name: heapster
livenessProbe: livenessProbe:
httpGet: httpGet:
@ -108,7 +108,7 @@ spec:
- --memory={{ base_metrics_memory }} - --memory={{ base_metrics_memory }}
- --extra-memory={{metrics_memory_per_node}}Mi - --extra-memory={{metrics_memory_per_node}}Mi
- --threshold=5 - --threshold=5
- --deployment=heapster-v1.5.2 - --deployment=heapster-v1.5.3
- --container=heapster - --container=heapster
- --poll-period=300000 - --poll-period=300000
- --estimator=exponential - --estimator=exponential

View File

@ -23,30 +23,30 @@ data:
apiVersion: extensions/v1beta1 apiVersion: extensions/v1beta1
kind: Deployment kind: Deployment
metadata: metadata:
name: heapster-v1.5.2 name: heapster-v1.5.3
namespace: kube-system namespace: kube-system
labels: labels:
k8s-app: heapster k8s-app: heapster
kubernetes.io/cluster-service: "true" kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile addonmanager.kubernetes.io/mode: Reconcile
version: v1.5.2 version: v1.5.3
spec: spec:
replicas: 1 replicas: 1
selector: selector:
matchLabels: matchLabels:
k8s-app: heapster k8s-app: heapster
version: v1.5.2 version: v1.5.3
template: template:
metadata: metadata:
labels: labels:
k8s-app: heapster k8s-app: heapster
version: v1.5.2 version: v1.5.3
annotations: annotations:
scheduler.alpha.kubernetes.io/critical-pod: '' scheduler.alpha.kubernetes.io/critical-pod: ''
spec: spec:
priorityClassName: system-cluster-critical priorityClassName: system-cluster-critical
containers: containers:
- image: k8s.gcr.io/heapster-amd64:v1.5.2 - image: k8s.gcr.io/heapster-amd64:v1.5.3
name: heapster name: heapster
livenessProbe: livenessProbe:
httpGet: httpGet:
@ -87,7 +87,7 @@ spec:
- --memory={{ base_metrics_memory }} - --memory={{ base_metrics_memory }}
- --extra-memory={{ metrics_memory_per_node }}Mi - --extra-memory={{ metrics_memory_per_node }}Mi
- --threshold=5 - --threshold=5
- --deployment=heapster-v1.5.2 - --deployment=heapster-v1.5.3
- --container=heapster - --container=heapster
- --poll-period=300000 - --poll-period=300000
- --estimator=exponential - --estimator=exponential

View File

@ -20,4 +20,4 @@
# For systems without journald # For systems without journald
mkdir -p /var/log/journal mkdir -p /var/log/journal
/usr/local/bin/fluentd $@ exec /usr/local/bin/fluentd $@

View File

@ -38,13 +38,13 @@ spec:
- name: config-volume - name: config-volume
mountPath: /etc/google-fluentd/config.d mountPath: /etc/google-fluentd/config.d
env: env:
- name: STACKDRIVER_METADATA_AGENT_URL
value: {{ stackdriver_metadata_agent_url }}
- name: NODE_NAME - name: NODE_NAME
valueFrom: valueFrom:
fieldRef: fieldRef:
apiVersion: v1 apiVersion: v1
fieldPath: spec.nodeName fieldPath: spec.nodeName
- name: STACKDRIVER_METADATA_AGENT_URL
value: http://$(NODE_NAME):8799
# Liveness probe is aimed to help in situarions where fluentd # Liveness probe is aimed to help in situarions where fluentd
# silently hangs for no apparent reasons until manual restart. # silently hangs for no apparent reasons until manual restart.
# The idea of this probe is that if fluentd is not queueing or # The idea of this probe is that if fluentd is not queueing or

View File

@ -405,7 +405,7 @@ HEAPSTER_GCP_BASE_CPU="${HEAPSTER_GCP_BASE_CPU:-80m}"
HEAPSTER_GCP_CPU_PER_NODE="${HEAPSTER_GCP_CPU_PER_NODE:-0.5}" HEAPSTER_GCP_CPU_PER_NODE="${HEAPSTER_GCP_CPU_PER_NODE:-0.5}"
# Adding to PROVIDER_VARS, since this is GCP-specific. # Adding to PROVIDER_VARS, since this is GCP-specific.
PROVIDER_VARS="${PROVIDER_VARS:-} FLUENTD_GCP_VERSION FLUENTD_GCP_MEMORY_LIMIT FLUENTD_GCP_CPU_REQUEST FLUENTD_GCP_MEMORY_REQUEST HEAPSTER_GCP_BASE_MEMORY HEAPSTER_GCP_MEMORY_PER_NODE HEAPSTER_GCP_BASE_CPU HEAPSTER_GCP_CPU_PER_NODE CUSTOM_KUBE_DASHBOARD_BANNER LOGGING_STACKDRIVER_RESOURCE_TYPES STACKDRIVER_METADATA_AGENT_URL" PROVIDER_VARS="${PROVIDER_VARS:-} FLUENTD_GCP_VERSION FLUENTD_GCP_MEMORY_LIMIT FLUENTD_GCP_CPU_REQUEST FLUENTD_GCP_MEMORY_REQUEST HEAPSTER_GCP_BASE_MEMORY HEAPSTER_GCP_MEMORY_PER_NODE HEAPSTER_GCP_BASE_CPU HEAPSTER_GCP_CPU_PER_NODE CUSTOM_KUBE_DASHBOARD_BANNER LOGGING_STACKDRIVER_RESOURCE_TYPES"
# Fluentd configuration for node-journal # Fluentd configuration for node-journal
ENABLE_NODE_JOURNAL="${ENABLE_NODE_JOURNAL:-false}" ENABLE_NODE_JOURNAL="${ENABLE_NODE_JOURNAL:-false}"

View File

@ -76,7 +76,7 @@ ALLOWED_NOTREADY_NODES="${ALLOWED_NOTREADY_NODES:-$((NUM_NODES / 100))}"
# Also please update corresponding image for node e2e at: # Also please update corresponding image for node e2e at:
# https://github.com/kubernetes/kubernetes/blob/master/test/e2e_node/jenkins/image-config.yaml # https://github.com/kubernetes/kubernetes/blob/master/test/e2e_node/jenkins/image-config.yaml
CVM_VERSION=${CVM_VERSION:-container-vm-v20170627} CVM_VERSION=${CVM_VERSION:-container-vm-v20170627}
GCI_VERSION=${KUBE_GCI_VERSION:-cos-beta-66-10452-28-0} GCI_VERSION=${KUBE_GCI_VERSION:-cos-stable-65-10323-64-0}
MASTER_IMAGE=${KUBE_GCE_MASTER_IMAGE:-} MASTER_IMAGE=${KUBE_GCE_MASTER_IMAGE:-}
MASTER_IMAGE_PROJECT=${KUBE_GCE_MASTER_PROJECT:-cos-cloud} MASTER_IMAGE_PROJECT=${KUBE_GCE_MASTER_PROJECT:-cos-cloud}
NODE_IMAGE=${KUBE_GCE_NODE_IMAGE:-${GCI_VERSION}} NODE_IMAGE=${KUBE_GCE_NODE_IMAGE:-${GCI_VERSION}}
@ -421,7 +421,7 @@ HEAPSTER_GCP_BASE_CPU="${HEAPSTER_GCP_BASE_CPU:-80m}"
HEAPSTER_GCP_CPU_PER_NODE="${HEAPSTER_GCP_CPU_PER_NODE:-0.5}" HEAPSTER_GCP_CPU_PER_NODE="${HEAPSTER_GCP_CPU_PER_NODE:-0.5}"
# Adding to PROVIDER_VARS, since this is GCP-specific. # Adding to PROVIDER_VARS, since this is GCP-specific.
PROVIDER_VARS="${PROVIDER_VARS:-} FLUENTD_GCP_VERSION FLUENTD_GCP_MEMORY_LIMIT FLUENTD_GCP_CPU_REQUEST FLUENTD_GCP_MEMORY_REQUEST HEAPSTER_GCP_BASE_MEMORY HEAPSTER_GCP_MEMORY_PER_NODE HEAPSTER_GCP_BASE_CPU HEAPSTER_GCP_CPU_PER_NODE CUSTOM_KUBE_DASHBOARD_BANNER LOGGING_STACKDRIVER_RESOURCE_TYPES STACKDRIVER_METADATA_AGENT_URL" PROVIDER_VARS="${PROVIDER_VARS:-} FLUENTD_GCP_VERSION FLUENTD_GCP_MEMORY_LIMIT FLUENTD_GCP_CPU_REQUEST FLUENTD_GCP_MEMORY_REQUEST HEAPSTER_GCP_BASE_MEMORY HEAPSTER_GCP_MEMORY_PER_NODE HEAPSTER_GCP_BASE_CPU HEAPSTER_GCP_CPU_PER_NODE CUSTOM_KUBE_DASHBOARD_BANNER LOGGING_STACKDRIVER_RESOURCE_TYPES"
# Fluentd configuration for node-journal # Fluentd configuration for node-journal
ENABLE_NODE_JOURNAL="${ENABLE_NODE_JOURNAL:-false}" ENABLE_NODE_JOURNAL="${ENABLE_NODE_JOURNAL:-false}"

View File

@ -892,8 +892,9 @@ function create-kubelet-kubeconfig() {
echo "Must provide API server address to create Kubelet kubeconfig file!" echo "Must provide API server address to create Kubelet kubeconfig file!"
exit 1 exit 1
fi fi
echo "Creating kubelet kubeconfig file" if [[ "${CREATE_BOOTSTRAP_KUBECONFIG:-true}" == "true" ]]; then
cat <<EOF >/var/lib/kubelet/bootstrap-kubeconfig echo "Creating kubelet bootstrap-kubeconfig file"
cat <<EOF >/var/lib/kubelet/bootstrap-kubeconfig
apiVersion: v1 apiVersion: v1
kind: Config kind: Config
users: users:
@ -913,6 +914,13 @@ contexts:
name: service-account-context name: service-account-context
current-context: service-account-context current-context: service-account-context
EOF EOF
elif [[ "${FETCH_BOOTSTRAP_KUBECONFIG:-false}" == "true" ]]; then
echo "Fetching kubelet bootstrap-kubeconfig file from metadata"
get-metadata-value "instance/attributes/bootstrap-kubeconfig" >/var/lib/kubelet/bootstrap-kubeconfig
else
echo "Fetching kubelet kubeconfig file from metadata"
get-metadata-value "instance/attributes/kubeconfig" >/var/lib/kubelet/kubeconfig
fi
} }
# Uses KUBELET_CA_CERT (falling back to CA_CERT), KUBELET_CERT, and KUBELET_KEY # Uses KUBELET_CA_CERT (falling back to CA_CERT), KUBELET_CERT, and KUBELET_KEY
@ -1584,6 +1592,9 @@ function start-kube-apiserver {
if [[ "${ENABLE_APISERVER_LOGS_HANDLER:-}" == "false" ]]; then if [[ "${ENABLE_APISERVER_LOGS_HANDLER:-}" == "false" ]]; then
params+=" --enable-logs-handler=false" params+=" --enable-logs-handler=false"
fi fi
if [[ -n "${APISERVER_KUBELET_CA:-}" ]]; then
params+=" --kubelet-certificate-authority=${APISERVER_KUBELET_CA}"
fi
local admission_controller_config_mount="" local admission_controller_config_mount=""
local admission_controller_config_volume="" local admission_controller_config_volume=""
@ -1612,7 +1623,7 @@ function start-kube-apiserver {
params+=" --feature-gates=${FEATURE_GATES}" params+=" --feature-gates=${FEATURE_GATES}"
fi fi
if [[ -n "${PROJECT_ID:-}" && -n "${TOKEN_URL:-}" && -n "${TOKEN_BODY:-}" && -n "${NODE_NETWORK:-}" ]]; then if [[ -n "${PROJECT_ID:-}" && -n "${TOKEN_URL:-}" && -n "${TOKEN_BODY:-}" && -n "${NODE_NETWORK:-}" ]]; then
local -r vm_external_ip=$(curl --retry 5 --retry-delay 3 ${CURL_RETRY_CONNREFUSED} --fail --silent -H 'Metadata-Flavor: Google' "http://metadata/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip") local -r vm_external_ip=$(get-metadata-value "instance/network-interfaces/0/access-configs/0/external-ip")
if [[ -n "${PROXY_SSH_USER:-}" ]]; then if [[ -n "${PROXY_SSH_USER:-}" ]]; then
params+=" --advertise-address=${vm_external_ip}" params+=" --advertise-address=${vm_external_ip}"
params+=" --ssh-user=${PROXY_SSH_USER}" params+=" --ssh-user=${PROXY_SSH_USER}"
@ -2008,6 +2019,20 @@ function download-extra-addons {
"${curl_cmd[@]}" "${curl_cmd[@]}"
} }
# A function that fetches a GCE metadata value and echoes it out.
#
# $1: URL path after /computeMetadata/v1/ (without heading slash).
function get-metadata-value {
curl \
--retry 5 \
--retry-delay 3 \
${CURL_RETRY_CONNREFUSED} \
--fail \
--silent \
-H 'Metadata-Flavor: Google' \
"http://metadata/computeMetadata/v1/${1}"
}
# A helper function for copying manifests and setting dir/files # A helper function for copying manifests and setting dir/files
# permissions. # permissions.
# #
@ -2161,12 +2186,6 @@ function setup-fluentd {
sed -i -e "s@{{ fluentd_gcp_configmap_name }}@${fluentd_gcp_configmap_name}@g" "${fluentd_gcp_yaml}" sed -i -e "s@{{ fluentd_gcp_configmap_name }}@${fluentd_gcp_configmap_name}@g" "${fluentd_gcp_yaml}"
fluentd_gcp_version="${FLUENTD_GCP_VERSION:-0.2-1.5.30-1-k8s}" fluentd_gcp_version="${FLUENTD_GCP_VERSION:-0.2-1.5.30-1-k8s}"
sed -i -e "s@{{ fluentd_gcp_version }}@${fluentd_gcp_version}@g" "${fluentd_gcp_yaml}" sed -i -e "s@{{ fluentd_gcp_version }}@${fluentd_gcp_version}@g" "${fluentd_gcp_yaml}"
if [[ "${STACKDRIVER_METADATA_AGENT_URL:-}" != "" ]]; then
metadata_agent_url="${STACKDRIVER_METADATA_AGENT_URL}"
else
metadata_agent_url="http://${HOSTNAME}:8799"
fi
sed -i -e "s@{{ stackdriver_metadata_agent_url }}@${metadata_agent_url}@g" "${fluentd_gcp_yaml}"
update-prometheus-to-sd-parameters ${fluentd_gcp_yaml} update-prometheus-to-sd-parameters ${fluentd_gcp_yaml}
start-fluentd-resource-update ${fluentd_gcp_yaml} start-fluentd-resource-update ${fluentd_gcp_yaml}
update-container-runtime ${fluentd_gcp_configmap_yaml} update-container-runtime ${fluentd_gcp_configmap_yaml}
@ -2590,4 +2609,4 @@ if [[ "$#" -eq 1 && "${1}" == "--source-only" ]]; then
: :
else else
main "${@}" main "${@}"
fi fi

View File

@ -342,15 +342,21 @@ function do-single-node-upgrade() {
sleep 1 sleep 1
done done
# Wait for the node to not have SchedulingDisabled=True and also to have # Uncordon the node.
# Ready=True. echo "== Uncordon ${instance}. == " >&2
local uncordon_rc
"${KUBE_ROOT}/cluster/kubectl.sh" uncordon "${instance}" \
&& uncordon_rc=$? || uncordon_rc=$?
if [[ "${uncordon_rc}" != 0 ]]; then
echo "== FAILED to uncordon ${instance} =="
return ${uncordon_rc}
fi
# Wait for the node to have Ready=True.
echo "== Waiting for ${instance} to become ready. ==" >&2 echo "== Waiting for ${instance} to become ready. ==" >&2
while true; do while true; do
local cordoned=$("${KUBE_ROOT}/cluster/kubectl.sh" get node "${instance}" --output='jsonpath={.status.conditions[?(@.type == "SchedulingDisabled")].status}')
local ready=$("${KUBE_ROOT}/cluster/kubectl.sh" get node "${instance}" --output='jsonpath={.status.conditions[?(@.type == "Ready")].status}') local ready=$("${KUBE_ROOT}/cluster/kubectl.sh" get node "${instance}" --output='jsonpath={.status.conditions[?(@.type == "Ready")].status}')
if [[ "${cordoned}" == 'True' ]]; then if [[ "${ready}" != 'True' ]]; then
echo "Node ${instance} is still not ready: SchedulingDisabled=${ready}"
elif [[ "${ready}" != 'True' ]]; then
echo "Node ${instance} is still not ready: Ready=${ready}" echo "Node ${instance} is still not ready: Ready=${ready}"
else else
echo "Node ${instance} Ready=${ready}" echo "Node ${instance} Ready=${ready}"

View File

@ -1,6 +1,7 @@
repo: https://github.com/kubernetes/kubernetes.git repo: https://github.com/kubernetes/kubernetes.git
includes: includes:
- 'layer:basic' - 'layer:basic'
- 'layer:status'
- 'layer:snap' - 'layer:snap'
- 'layer:tls-client' - 'layer:tls-client'
- 'layer:leadership' - 'layer:leadership'
@ -15,6 +16,7 @@ includes:
- 'interface:kube-dns' - 'interface:kube-dns'
- 'interface:kube-control' - 'interface:kube-control'
- 'interface:public-address' - 'interface:public-address'
- 'interface:aws'
options: options:
basic: basic:
packages: packages:

View File

@ -40,6 +40,8 @@ requires:
interface: public-address interface: public-address
ceph-storage: ceph-storage:
interface: ceph-admin interface: ceph-admin
aws:
interface: aws
resources: resources:
kubectl: kubectl:
type: file type: file

View File

@ -39,6 +39,7 @@ from charms.reactive import hook
from charms.reactive import remove_state from charms.reactive import remove_state
from charms.reactive import set_state from charms.reactive import set_state
from charms.reactive import is_state from charms.reactive import is_state
from charms.reactive import endpoint_from_flag
from charms.reactive import when, when_any, when_not from charms.reactive import when, when_any, when_not
from charms.reactive.helpers import data_changed, any_file_changed from charms.reactive.helpers import data_changed, any_file_changed
from charms.kubernetes.common import get_version from charms.kubernetes.common import get_version
@ -1224,6 +1225,9 @@ def configure_apiserver(etcd_connection_string, leader_etcd_version):
api_opts['enable-aggregator-routing'] = 'true' api_opts['enable-aggregator-routing'] = 'true'
api_opts['client-ca-file'] = ca_cert_path api_opts['client-ca-file'] = ca_cert_path
if is_state('endpoint.aws.ready'):
api_opts['cloud-provider'] = 'aws'
configure_kubernetes_service('kube-apiserver', api_opts, 'api-extra-args') configure_kubernetes_service('kube-apiserver', api_opts, 'api-extra-args')
restart_apiserver() restart_apiserver()
@ -1245,6 +1249,9 @@ def configure_controller_manager():
controller_opts['service-account-private-key-file'] = \ controller_opts['service-account-private-key-file'] = \
'/root/cdk/serviceaccount.key' '/root/cdk/serviceaccount.key'
if is_state('endpoint.aws.ready'):
controller_opts['cloud-provider'] = 'aws'
configure_kubernetes_service('kube-controller-manager', controller_opts, configure_kubernetes_service('kube-controller-manager', controller_opts,
'controller-manager-extra-args') 'controller-manager-extra-args')
restart_controller_manager() restart_controller_manager()
@ -1377,3 +1384,61 @@ def getStorageBackend():
if storage_backend == 'auto': if storage_backend == 'auto':
storage_backend = leader_get('auto_storage_backend') storage_backend = leader_get('auto_storage_backend')
return storage_backend return storage_backend
@when('leadership.is_leader')
@when_not('leadership.set.cluster_tag')
def create_cluster_tag():
cluster_tag = 'kubernetes-{}'.format(token_generator())
leader_set(cluster_tag=cluster_tag)
@when('leadership.set.cluster_tag',
'kube-control.connected')
@when_not('kubernetes-master.cluster-tag-sent')
def send_cluster_tag():
cluster_tag = leader_get('cluster_tag')
kube_control = endpoint_from_flag('kube-control.connected')
kube_control.set_cluster_tag(cluster_tag)
set_state('kubernetes-master.cluster-tag-sent')
@when_not('kube-control.connected')
def clear_cluster_tag_sent():
remove_state('kubernetes-master.cluster-tag-sent')
@when('endpoint.aws.joined',
'leadership.set.cluster_tag')
@when_not('kubernetes-master.aws-request-sent')
def request_integration():
hookenv.status_set('maintenance', 'requesting aws integration')
aws = endpoint_from_flag('endpoint.aws.joined')
cluster_tag = leader_get('cluster_tag')
aws.tag_instance({
'KubernetesCluster': cluster_tag,
'k8s.io/role/master': 'true',
})
aws.tag_instance_security_group({
'KubernetesCluster': cluster_tag,
})
aws.enable_instance_inspection()
aws.enable_network_management()
aws.enable_dns_management()
aws.enable_load_balancer_management()
aws.enable_block_storage_management()
aws.enable_object_storage_management(['kubernetes-*'])
set_state('kubernetes-master.aws-request-sent')
hookenv.status_set('waiting', 'waiting for aws integration')
@when_not('endpoint.aws.joined')
def clear_requested_integration():
remove_state('kubernetes-master.aws-request-sent')
@when('endpoint.aws.ready')
@when_not('kubernetes-master.restarted-for-aws')
def restart_for_aws():
set_state('kubernetes-master.restarted-for-aws')
remove_state('kubernetes-master.components.started') # force restart

View File

@ -25,7 +25,7 @@ from base64 import b64encode
from charmhelpers.core.hookenv import action_get from charmhelpers.core.hookenv import action_get
from charmhelpers.core.hookenv import action_set from charmhelpers.core.hookenv import action_set
from charms.templating.jinja2 import render from charms.templating.jinja2 import render
from subprocess import call from subprocess import call, check_output
os.environ['PATH'] += os.pathsep + os.path.join(os.sep, 'snap', 'bin') os.environ['PATH'] += os.pathsep + os.path.join(os.sep, 'snap', 'bin')
@ -33,6 +33,9 @@ deletion = action_get('delete')
context = {} context = {}
arch = check_output(['dpkg', '--print-architecture']).rstrip()
context['arch'] = arch.decode('utf-8')
# These config options must be defined in the case of a creation # These config options must be defined in the case of a creation
param_error = False param_error = False
for param in ('tlscert', 'tlskey', 'domain', 'htpasswd', 'htpasswd-plain'): for param in ('tlscert', 'tlskey', 'domain', 'htpasswd', 'htpasswd-plain'):

View File

@ -1,6 +1,7 @@
repo: https://github.com/kubernetes/kubernetes.git repo: https://github.com/kubernetes/kubernetes.git
includes: includes:
- 'layer:basic' - 'layer:basic'
- 'layer:status'
- 'layer:debug' - 'layer:debug'
- 'layer:snap' - 'layer:snap'
- 'layer:docker' - 'layer:docker'
@ -12,6 +13,7 @@ includes:
- 'interface:kubernetes-cni' - 'interface:kubernetes-cni'
- 'interface:kube-dns' - 'interface:kube-dns'
- 'interface:kube-control' - 'interface:kube-control'
- 'interface:aws'
config: config:
deletes: deletes:
- install_from_upstream - install_from_upstream

View File

@ -28,6 +28,8 @@ requires:
interface: kube-dns interface: kube-dns
kube-control: kube-control:
interface: kube-control interface: kube-control
aws:
interface: aws
provides: provides:
cni: cni:
interface: kubernetes-cni interface: kubernetes-cni

View File

@ -29,6 +29,7 @@ from socket import gethostname, getfqdn
from charms import layer from charms import layer
from charms.layer import snap from charms.layer import snap
from charms.reactive import hook from charms.reactive import hook
from charms.reactive import endpoint_from_flag
from charms.reactive import set_state, remove_state, is_state from charms.reactive import set_state, remove_state, is_state
from charms.reactive import when, when_any, when_not from charms.reactive import when, when_any, when_not
@ -623,6 +624,9 @@ def configure_kubelet(dns, ingress_ip):
'to kubelet') 'to kubelet')
kubelet_opts['feature-gates'] = 'DevicePlugins=true' kubelet_opts['feature-gates'] = 'DevicePlugins=true'
if is_state('endpoint.aws.ready'):
kubelet_opts['cloud-provider'] = 'aws'
configure_kubernetes_service('kubelet', kubelet_opts, 'kubelet-extra-args') configure_kubernetes_service('kubelet', kubelet_opts, 'kubelet-extra-args')
@ -738,7 +742,7 @@ def launch_default_ingress_controller():
"k8s.gcr.io/nginx-ingress-controller-arm64:0.9.0-beta.15" "k8s.gcr.io/nginx-ingress-controller-arm64:0.9.0-beta.15"
else: else:
context['ingress_image'] = \ context['ingress_image'] = \
"k8s.gcr.io/nginx-ingress-controller:0.9.0-beta.15" # noqa "k8s.gcr.io/nginx-ingress-controller:0.9.0-beta.15" # noqa
if get_version('kubelet') < (1, 9): if get_version('kubelet') < (1, 9):
context['daemonset_api_version'] = 'extensions/v1beta1' context['daemonset_api_version'] = 'extensions/v1beta1'
else: else:
@ -1067,3 +1071,39 @@ def remove_label(label):
retry = 'Failed to remove label {0}. Will retry.'.format(label) retry = 'Failed to remove label {0}. Will retry.'.format(label)
if not persistent_call(cmd, retry): if not persistent_call(cmd, retry):
raise ApplyNodeLabelFailed(retry) raise ApplyNodeLabelFailed(retry)
@when('endpoint.aws.joined',
'kube-control.cluster_tag.available')
@when_not('kubernetes-worker.aws-request-sent')
def request_integration():
kube_control = endpoint_from_flag('kube-control.cluster_tag.available')
hookenv.status_set('maintenance', 'requesting aws integration')
aws = endpoint_from_flag('endpoint.aws.joined')
cluster_tag = kube_control.get_cluster_tag()
aws.tag_instance({
'KubernetesCluster': cluster_tag,
})
aws.tag_instance_security_group({
'KubernetesCluster': cluster_tag,
})
aws.tag_instance_subnet({
'KubernetesCluster': cluster_tag,
})
aws.enable_instance_inspection()
aws.enable_dns_management()
aws.enable_object_storage_management(['kubernetes-*'])
set_state('kubernetes-worker.aws-request-sent')
hookenv.status_set('waiting', 'waiting for aws integration')
@when_not('endpoint.aws.joined')
def clear_requested_integration():
remove_state('kubernetes-worker.aws-request-sent')
@when('endpoint.aws.ready')
@when_not('kubernetes-worker.restarted-for-aws')
def restart_for_aws():
set_state('kubernetes-worker.restarted-for-aws')
set_state('kubernetes-worker.restart-needed')

View File

@ -37,7 +37,7 @@ spec:
spec: spec:
containers: containers:
- name: registry - name: registry
image: registry:2 image: cdkbot/registry-{{ arch }}:2.6
resources: resources:
# keep request = limit to keep this container in guaranteed class # keep request = limit to keep this container in guaranteed class
limits: limits:

View File

@ -17,7 +17,6 @@ go_library(
importpath = "k8s.io/kubernetes/cmd/clicheck", importpath = "k8s.io/kubernetes/cmd/clicheck",
deps = [ deps = [
"//pkg/kubectl/cmd:go_default_library", "//pkg/kubectl/cmd:go_default_library",
"//pkg/kubectl/cmd/util:go_default_library",
"//pkg/kubectl/cmd/util/sanity:go_default_library", "//pkg/kubectl/cmd/util/sanity:go_default_library",
], ],
) )

View File

@ -22,7 +22,6 @@ import (
"os" "os"
"k8s.io/kubernetes/pkg/kubectl/cmd" "k8s.io/kubernetes/pkg/kubectl/cmd"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
cmdsanity "k8s.io/kubernetes/pkg/kubectl/cmd/util/sanity" cmdsanity "k8s.io/kubernetes/pkg/kubectl/cmd/util/sanity"
) )
@ -33,7 +32,7 @@ var (
func main() { func main() {
var errorCount int var errorCount int
kubectl := cmd.NewKubectlCommand(cmdutil.NewFactory(nil), os.Stdin, ioutil.Discard, ioutil.Discard) kubectl := cmd.NewKubectlCommand(os.Stdin, ioutil.Discard, ioutil.Discard)
errors := cmdsanity.RunCmdChecks(kubectl, cmdsanity.AllCmdChecks, []string{}) errors := cmdsanity.RunCmdChecks(kubectl, cmdsanity.AllCmdChecks, []string{})
for _, err := range errors { for _, err := range errors {
errorCount++ errorCount++

View File

@ -18,7 +18,6 @@ go_library(
deps = [ deps = [
"//cmd/genutils:go_default_library", "//cmd/genutils:go_default_library",
"//pkg/kubectl/cmd:go_default_library", "//pkg/kubectl/cmd:go_default_library",
"//pkg/kubectl/cmd/util:go_default_library",
"//vendor/github.com/spf13/cobra/doc:go_default_library", "//vendor/github.com/spf13/cobra/doc:go_default_library",
], ],
) )

View File

@ -24,7 +24,6 @@ import (
"github.com/spf13/cobra/doc" "github.com/spf13/cobra/doc"
"k8s.io/kubernetes/cmd/genutils" "k8s.io/kubernetes/cmd/genutils"
"k8s.io/kubernetes/pkg/kubectl/cmd" "k8s.io/kubernetes/pkg/kubectl/cmd"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
) )
func main() { func main() {
@ -47,6 +46,6 @@ func main() {
// regardless of where we run. // regardless of where we run.
os.Setenv("HOME", "/home/username") os.Setenv("HOME", "/home/username")
// TODO os.Stdin should really be something like ioutil.Discard, but a Reader // TODO os.Stdin should really be something like ioutil.Discard, but a Reader
kubectl := cmd.NewKubectlCommand(cmdutil.NewFactory(nil), os.Stdin, ioutil.Discard, ioutil.Discard) kubectl := cmd.NewKubectlCommand(os.Stdin, ioutil.Discard, ioutil.Discard)
doc.GenMarkdownTree(kubectl, outDir) doc.GenMarkdownTree(kubectl, outDir)
} }

View File

@ -25,7 +25,6 @@ go_library(
"//cmd/kubeadm/app/cmd:go_default_library", "//cmd/kubeadm/app/cmd:go_default_library",
"//cmd/kubelet/app:go_default_library", "//cmd/kubelet/app:go_default_library",
"//pkg/kubectl/cmd:go_default_library", "//pkg/kubectl/cmd:go_default_library",
"//pkg/kubectl/cmd/util:go_default_library",
"//vendor/github.com/cpuguy83/go-md2man/md2man:go_default_library", "//vendor/github.com/cpuguy83/go-md2man/md2man:go_default_library",
"//vendor/github.com/spf13/cobra:go_default_library", "//vendor/github.com/spf13/cobra:go_default_library",
"//vendor/github.com/spf13/pflag:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library",

View File

@ -35,7 +35,6 @@ import (
kubeadmapp "k8s.io/kubernetes/cmd/kubeadm/app/cmd" kubeadmapp "k8s.io/kubernetes/cmd/kubeadm/app/cmd"
kubeletapp "k8s.io/kubernetes/cmd/kubelet/app" kubeletapp "k8s.io/kubernetes/cmd/kubelet/app"
kubectlcmd "k8s.io/kubernetes/pkg/kubectl/cmd" kubectlcmd "k8s.io/kubernetes/pkg/kubectl/cmd"
kubectlcmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
) )
func main() { func main() {
@ -106,7 +105,7 @@ func main() {
case "kubectl": case "kubectl":
// generate manpage for kubectl // generate manpage for kubectl
// TODO os.Stdin should really be something like ioutil.Discard, but a Reader // TODO os.Stdin should really be something like ioutil.Discard, but a Reader
kubectl := kubectlcmd.NewKubectlCommand(kubectlcmdutil.NewFactory(nil), os.Stdin, ioutil.Discard, ioutil.Discard) kubectl := kubectlcmd.NewKubectlCommand(os.Stdin, ioutil.Discard, ioutil.Discard)
genMarkdown(kubectl, "", outDir) genMarkdown(kubectl, "", outDir)
for _, c := range kubectl.Commands() { for _, c := range kubectl.Commands() {
genMarkdown(c, "kubectl", outDir) genMarkdown(c, "kubectl", outDir)

View File

@ -18,7 +18,6 @@ go_library(
deps = [ deps = [
"//cmd/genutils:go_default_library", "//cmd/genutils:go_default_library",
"//pkg/kubectl/cmd:go_default_library", "//pkg/kubectl/cmd:go_default_library",
"//pkg/kubectl/cmd/util:go_default_library",
"//vendor/github.com/spf13/cobra:go_default_library", "//vendor/github.com/spf13/cobra:go_default_library",
"//vendor/github.com/spf13/pflag:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library",
"//vendor/gopkg.in/yaml.v2:go_default_library", "//vendor/gopkg.in/yaml.v2:go_default_library",

View File

@ -27,7 +27,6 @@ import (
"gopkg.in/yaml.v2" "gopkg.in/yaml.v2"
"k8s.io/kubernetes/cmd/genutils" "k8s.io/kubernetes/cmd/genutils"
"k8s.io/kubernetes/pkg/kubectl/cmd" "k8s.io/kubernetes/pkg/kubectl/cmd"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
) )
type cmdOption struct { type cmdOption struct {
@ -66,7 +65,7 @@ func main() {
// regardless of where we run. // regardless of where we run.
os.Setenv("HOME", "/home/username") os.Setenv("HOME", "/home/username")
// TODO os.Stdin should really be something like ioutil.Discard, but a Reader // TODO os.Stdin should really be something like ioutil.Discard, but a Reader
kubectl := cmd.NewKubectlCommand(cmdutil.NewFactory(nil), os.Stdin, ioutil.Discard, ioutil.Discard) kubectl := cmd.NewKubectlCommand(os.Stdin, ioutil.Discard, ioutil.Discard)
genYaml(kubectl, "", outDir) genYaml(kubectl, "", outDir)
for _, c := range kubectl.Commands() { for _, c := range kubectl.Commands() {
genYaml(c, "kubectl", outDir) genYaml(c, "kubectl", outDir)

View File

@ -236,7 +236,7 @@ func resolvePackageTree(treeBase string) ([]Package, error) {
if err != nil { if err != nil {
var message string var message string
if ee, ok := err.(*exec.ExitError); ok { if ee, ok := err.(*exec.ExitError); ok {
message = fmt.Sprintf("%v\n%v", ee, ee.Stderr) message = fmt.Sprintf("%v\n%v", ee, string(ee.Stderr))
} else { } else {
message = fmt.Sprintf("%v", err) message = fmt.Sprintf("%v", err)
} }

View File

@ -78,11 +78,11 @@ go_library(
"//vendor/k8s.io/apiserver/pkg/server/storage:go_default_library", "//vendor/k8s.io/apiserver/pkg/server/storage:go_default_library",
"//vendor/k8s.io/apiserver/pkg/storage/etcd3/preflight:go_default_library", "//vendor/k8s.io/apiserver/pkg/storage/etcd3/preflight:go_default_library",
"//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library",
"//vendor/k8s.io/client-go/discovery:go_default_library",
"//vendor/k8s.io/client-go/discovery/cached:go_default_library", "//vendor/k8s.io/client-go/discovery/cached:go_default_library",
"//vendor/k8s.io/client-go/informers:go_default_library", "//vendor/k8s.io/client-go/informers:go_default_library",
"//vendor/k8s.io/client-go/kubernetes:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library",
"//vendor/k8s.io/client-go/rest:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library",
"//vendor/k8s.io/client-go/restmapper:go_default_library",
"//vendor/k8s.io/client-go/tools/cache:go_default_library", "//vendor/k8s.io/client-go/tools/cache:go_default_library",
"//vendor/k8s.io/client-go/util/cert:go_default_library", "//vendor/k8s.io/client-go/util/cert:go_default_library",
"//vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration:go_default_library", "//vendor/k8s.io/kube-aggregator/pkg/apis/apiregistration:go_default_library",

View File

@ -84,7 +84,7 @@ func createAggregatorConfig(
if err := commandOptions.APIEnablement.ApplyTo( if err := commandOptions.APIEnablement.ApplyTo(
&genericConfig, &genericConfig,
aggregatorapiserver.DefaultAPIResourceConfigSource(), aggregatorapiserver.DefaultAPIResourceConfigSource(),
aggregatorscheme.Registry); err != nil { aggregatorscheme.Scheme); err != nil {
return nil, err return nil, err
} }

View File

@ -58,7 +58,7 @@ func createAPIExtensionsConfig(
if err := commandOptions.APIEnablement.ApplyTo( if err := commandOptions.APIEnablement.ApplyTo(
&genericConfig, &genericConfig,
apiextensionsapiserver.DefaultAPIResourceConfigSource(), apiextensionsapiserver.DefaultAPIResourceConfigSource(),
apiextensionsapiserver.Registry); err != nil { apiextensionsapiserver.Scheme); err != nil {
return nil, err return nil, err
} }

View File

@ -284,8 +284,8 @@ func TestAddFlags(t *testing.T) {
CloudProvider: "azure", CloudProvider: "azure",
}, },
StorageSerialization: &kubeoptions.StorageSerializationOptions{ StorageSerialization: &kubeoptions.StorageSerializationOptions{
StorageVersions: legacyscheme.Registry.AllPreferredGroupVersions(), StorageVersions: kubeoptions.ToPreferredVersionString(legacyscheme.Scheme.PreferredVersionAllGroups()),
DefaultStorageVersions: legacyscheme.Registry.AllPreferredGroupVersions(), DefaultStorageVersions: kubeoptions.ToPreferredVersionString(legacyscheme.Scheme.PreferredVersionAllGroups()),
}, },
APIEnablement: &apiserveroptions.APIEnablementOptions{ APIEnablement: &apiserveroptions.APIEnablementOptions{
RuntimeConfig: utilflag.ConfigurationMap{}, RuntimeConfig: utilflag.ConfigurationMap{},

View File

@ -82,7 +82,7 @@ func (s *ServerRunOptions) Validate() []error {
if s.MasterCount <= 0 { if s.MasterCount <= 0 {
errors = append(errors, fmt.Errorf("--apiserver-count should be a positive number, but value '%d' provided", s.MasterCount)) errors = append(errors, fmt.Errorf("--apiserver-count should be a positive number, but value '%d' provided", s.MasterCount))
} }
if errs := s.APIEnablement.Validate(legacyscheme.Registry, apiextensionsapiserver.Registry, aggregatorscheme.Registry); len(errs) > 0 { if errs := s.APIEnablement.Validate(legacyscheme.Scheme, apiextensionsapiserver.Scheme, aggregatorscheme.Scheme); len(errs) > 0 {
errors = append(errors, errs...) errors = append(errors, errs...)
} }

View File

@ -54,11 +54,11 @@ import (
serverstorage "k8s.io/apiserver/pkg/server/storage" serverstorage "k8s.io/apiserver/pkg/server/storage"
"k8s.io/apiserver/pkg/storage/etcd3/preflight" "k8s.io/apiserver/pkg/storage/etcd3/preflight"
utilfeature "k8s.io/apiserver/pkg/util/feature" utilfeature "k8s.io/apiserver/pkg/util/feature"
"k8s.io/client-go/discovery"
cacheddiscovery "k8s.io/client-go/discovery/cached" cacheddiscovery "k8s.io/client-go/discovery/cached"
clientgoinformers "k8s.io/client-go/informers" clientgoinformers "k8s.io/client-go/informers"
clientgoclientset "k8s.io/client-go/kubernetes" clientgoclientset "k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest" "k8s.io/client-go/rest"
"k8s.io/client-go/restmapper"
certutil "k8s.io/client-go/util/cert" certutil "k8s.io/client-go/util/cert"
aggregatorapiserver "k8s.io/kube-aggregator/pkg/apiserver" aggregatorapiserver "k8s.io/kube-aggregator/pkg/apiserver"
openapi "k8s.io/kube-openapi/pkg/common" openapi "k8s.io/kube-openapi/pkg/common"
@ -428,7 +428,7 @@ func BuildGenericConfig(
if lastErr = s.Features.ApplyTo(genericConfig); lastErr != nil { if lastErr = s.Features.ApplyTo(genericConfig); lastErr != nil {
return return
} }
if lastErr = s.APIEnablement.ApplyTo(genericConfig, master.DefaultAPIResourceConfigSource(), legacyscheme.Registry); lastErr != nil { if lastErr = s.APIEnablement.ApplyTo(genericConfig, master.DefaultAPIResourceConfigSource(), legacyscheme.Scheme); lastErr != nil {
return return
} }
@ -575,11 +575,11 @@ func BuildAdmissionPluginInitializers(
// We have a functional client so we can use that to build our discovery backed REST mapper // We have a functional client so we can use that to build our discovery backed REST mapper
// Use a discovery client capable of being refreshed. // Use a discovery client capable of being refreshed.
discoveryClient := cacheddiscovery.NewMemCacheClient(client.Discovery()) discoveryClient := cacheddiscovery.NewMemCacheClient(client.Discovery())
discoveryRESTMapper := discovery.NewDeferredDiscoveryRESTMapper(discoveryClient) discoveryRESTMapper := restmapper.NewDeferredDiscoveryRESTMapper(discoveryClient)
admissionPostStartHook := func(context genericapiserver.PostStartHookContext) error { admissionPostStartHook := func(context genericapiserver.PostStartHookContext) error {
discoveryRESTMapper.Reset() discoveryRESTMapper.Reset()
go utilwait.Until(discoveryRESTMapper.Reset, 10*time.Second, context.StopCh) go utilwait.Until(discoveryRESTMapper.Reset, 30*time.Second, context.StopCh)
return nil return nil
} }
@ -619,7 +619,7 @@ func BuildStorageFactory(s *options.ServerRunOptions, apiResourceConfig *servers
} }
storageFactory, err := kubeapiserver.NewStorageFactory( storageFactory, err := kubeapiserver.NewStorageFactory(
s.Etcd.StorageConfig, s.Etcd.DefaultStorageMediaType, legacyscheme.Codecs, s.Etcd.StorageConfig, s.Etcd.DefaultStorageMediaType, legacyscheme.Codecs,
serverstorage.NewDefaultResourceEncodingConfig(legacyscheme.Registry), storageGroupsToEncodingVersion, serverstorage.NewDefaultResourceEncodingConfig(legacyscheme.Scheme), storageGroupsToEncodingVersion,
// The list includes resources that need to be stored in a different // The list includes resources that need to be stored in a different
// group version than other resources in the groups. // group version than other resources in the groups.
// FIXME (soltysh): this GroupVersionResource override should be configurable // FIXME (soltysh): this GroupVersionResource override should be configurable

View File

@ -115,12 +115,12 @@ go_library(
"//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/uuid:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
"//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library",
"//vendor/k8s.io/client-go/discovery:go_default_library",
"//vendor/k8s.io/client-go/discovery/cached:go_default_library", "//vendor/k8s.io/client-go/discovery/cached:go_default_library",
"//vendor/k8s.io/client-go/dynamic:go_default_library", "//vendor/k8s.io/client-go/dynamic:go_default_library",
"//vendor/k8s.io/client-go/informers:go_default_library", "//vendor/k8s.io/client-go/informers:go_default_library",
"//vendor/k8s.io/client-go/kubernetes:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library",
"//vendor/k8s.io/client-go/rest:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library",
"//vendor/k8s.io/client-go/restmapper:go_default_library",
"//vendor/k8s.io/client-go/scale:go_default_library", "//vendor/k8s.io/client-go/scale:go_default_library",
"//vendor/k8s.io/client-go/tools/leaderelection:go_default_library", "//vendor/k8s.io/client-go/tools/leaderelection:go_default_library",
"//vendor/k8s.io/client-go/tools/leaderelection/resourcelock:go_default_library", "//vendor/k8s.io/client-go/tools/leaderelection/resourcelock:go_default_library",

View File

@ -35,10 +35,10 @@ import (
"k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/sets"
"k8s.io/apimachinery/pkg/util/uuid" "k8s.io/apimachinery/pkg/util/uuid"
"k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/util/wait"
"k8s.io/client-go/discovery"
cacheddiscovery "k8s.io/client-go/discovery/cached" cacheddiscovery "k8s.io/client-go/discovery/cached"
"k8s.io/client-go/informers" "k8s.io/client-go/informers"
restclient "k8s.io/client-go/rest" restclient "k8s.io/client-go/rest"
"k8s.io/client-go/restmapper"
"k8s.io/client-go/tools/leaderelection" "k8s.io/client-go/tools/leaderelection"
"k8s.io/client-go/tools/leaderelection/resourcelock" "k8s.io/client-go/tools/leaderelection/resourcelock"
certutil "k8s.io/client-go/util/cert" certutil "k8s.io/client-go/util/cert"
@ -228,7 +228,7 @@ type ControllerContext struct {
// DeferredDiscoveryRESTMapper is a RESTMapper that will defer // DeferredDiscoveryRESTMapper is a RESTMapper that will defer
// initialization of the RESTMapper until the first mapping is // initialization of the RESTMapper until the first mapping is
// requested. // requested.
RESTMapper *discovery.DeferredDiscoveryRESTMapper RESTMapper *restmapper.DeferredDiscoveryRESTMapper
// AvailableResources is a map listing currently available resources // AvailableResources is a map listing currently available resources
AvailableResources map[schema.GroupVersionResource]bool AvailableResources map[schema.GroupVersionResource]bool
@ -399,7 +399,7 @@ func CreateControllerContext(s *config.CompletedConfig, rootClientBuilder, clien
// Use a discovery client capable of being refreshed. // Use a discovery client capable of being refreshed.
discoveryClient := rootClientBuilder.ClientOrDie("controller-discovery") discoveryClient := rootClientBuilder.ClientOrDie("controller-discovery")
cachedClient := cacheddiscovery.NewMemCacheClient(discoveryClient.Discovery()) cachedClient := cacheddiscovery.NewMemCacheClient(discoveryClient.Discovery())
restMapper := discovery.NewDeferredDiscoveryRESTMapper(cachedClient) restMapper := restmapper.NewDeferredDiscoveryRESTMapper(cachedClient)
go wait.Until(func() { go wait.Until(func() {
restMapper.Reset() restMapper.Reset()
}, 30*time.Second, stop) }, 30*time.Second, stop)

View File

@ -350,13 +350,10 @@ func startGarbageCollectorController(ctx ControllerContext) (bool, error) {
discoveryClient := cacheddiscovery.NewMemCacheClient(gcClientset.Discovery()) discoveryClient := cacheddiscovery.NewMemCacheClient(gcClientset.Discovery())
config := ctx.ClientBuilder.ConfigOrDie("generic-garbage-collector") config := ctx.ClientBuilder.ConfigOrDie("generic-garbage-collector")
config.ContentConfig = dynamic.ContentConfig() dynamicClient, err := dynamic.NewForConfig(config)
// TODO: Make NewMetadataCodecFactory support arbitrary (non-compiled) if err != nil {
// resource types. Otherwise we'll be storing full Unstructured data in our return true, err
// caches for custom resources. Consider porting it to work with }
// metav1beta1.PartialObjectMetadata.
metaOnlyClientPool := dynamic.NewClientPool(config, ctx.RESTMapper, dynamic.LegacyAPIPathResolverFunc)
clientPool := dynamic.NewClientPool(config, ctx.RESTMapper, dynamic.LegacyAPIPathResolverFunc)
// Get an initial set of deletable resources to prime the garbage collector. // Get an initial set of deletable resources to prime the garbage collector.
deletableResources := garbagecollector.GetDeletableResources(discoveryClient) deletableResources := garbagecollector.GetDeletableResources(discoveryClient)
@ -365,8 +362,7 @@ func startGarbageCollectorController(ctx ControllerContext) (bool, error) {
ignoredResources[schema.GroupResource{Group: r.Group, Resource: r.Resource}] = struct{}{} ignoredResources[schema.GroupResource{Group: r.Group, Resource: r.Resource}] = struct{}{}
} }
garbageCollector, err := garbagecollector.NewGarbageCollector( garbageCollector, err := garbagecollector.NewGarbageCollector(
metaOnlyClientPool, dynamicClient,
clientPool,
ctx.RESTMapper, ctx.RESTMapper,
deletableResources, deletableResources,
ignoredResources, ignoredResources,

View File

@ -17,9 +17,8 @@ go_library(
"//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/apis/kubeadm:go_default_library",
"//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library", "//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library",
"//pkg/api/legacyscheme:go_default_library", "//pkg/api/legacyscheme:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
], ],
) )

View File

@ -17,30 +17,20 @@ limitations under the License.
package install package install
import ( import (
"k8s.io/apimachinery/pkg/apimachinery/announced"
"k8s.io/apimachinery/pkg/apimachinery/registered"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1"
"k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/legacyscheme"
) )
func init() { func init() {
Install(legacyscheme.Registry, legacyscheme.Scheme) Install(legacyscheme.Scheme)
} }
// Install registers the API group and adds types to a scheme // Install registers the API group and adds types to a scheme
func Install(registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { func Install(scheme *runtime.Scheme) {
if err := announced.NewGroupMetaFactory( utilruntime.Must(kubeadm.AddToScheme(scheme))
&announced.GroupMetaFactoryArgs{ utilruntime.Must(v1alpha1.AddToScheme(scheme))
GroupName: kubeadm.GroupName, utilruntime.Must(scheme.SetVersionPriority(v1alpha1.SchemeGroupVersion))
VersionPreferenceOrder: []string{v1alpha1.SchemeGroupVersion.Version},
AddInternalObjectsToScheme: kubeadm.AddToScheme,
},
announced.VersionToSchemeFunc{
v1alpha1.SchemeGroupVersion.Version: v1alpha1.AddToScheme,
},
).Register(registry, scheme); err != nil {
panic(err)
}
} }

View File

@ -300,6 +300,8 @@ type HostPathMount struct {
MountPath string MountPath string
// Writable controls write access to the volume // Writable controls write access to the volume
Writable bool Writable bool
// PathType is the type of the HostPath.
PathType v1.HostPathType
} }
// KubeProxy contains elements describing the proxy configuration. // KubeProxy contains elements describing the proxy configuration.

View File

@ -278,6 +278,8 @@ type HostPathMount struct {
MountPath string `json:"mountPath"` MountPath string `json:"mountPath"`
// Writable controls write access to the volume // Writable controls write access to the volume
Writable bool `json:"writable,omitempty"` Writable bool `json:"writable,omitempty"`
// PathType is the type of the HostPath.
PathType v1.HostPathType `json:"pathType,omitempty"`
} }
// KubeProxy contains elements describing the proxy configuration. // KubeProxy contains elements describing the proxy configuration.

View File

@ -23,8 +23,8 @@ package v1alpha1
import ( import (
unsafe "unsafe" unsafe "unsafe"
core_v1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1" meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
conversion "k8s.io/apimachinery/pkg/conversion" conversion "k8s.io/apimachinery/pkg/conversion"
runtime "k8s.io/apimachinery/pkg/runtime" runtime "k8s.io/apimachinery/pkg/runtime"
kubeadm "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadm "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
@ -156,6 +156,7 @@ func autoConvert_v1alpha1_HostPathMount_To_kubeadm_HostPathMount(in *HostPathMou
out.HostPath = in.HostPath out.HostPath = in.HostPath
out.MountPath = in.MountPath out.MountPath = in.MountPath
out.Writable = in.Writable out.Writable = in.Writable
out.PathType = v1.HostPathType(in.PathType)
return nil return nil
} }
@ -169,6 +170,7 @@ func autoConvert_kubeadm_HostPathMount_To_v1alpha1_HostPathMount(in *kubeadm.Hos
out.HostPath = in.HostPath out.HostPath = in.HostPath
out.MountPath = in.MountPath out.MountPath = in.MountPath
out.Writable = in.Writable out.Writable = in.Writable
out.PathType = v1.HostPathType(in.PathType)
return nil return nil
} }
@ -240,7 +242,7 @@ func autoConvert_v1alpha1_MasterConfiguration_To_kubeadm_MasterConfiguration(in
out.NoTaintMaster = in.NoTaintMaster out.NoTaintMaster = in.NoTaintMaster
out.PrivilegedPods = in.PrivilegedPods out.PrivilegedPods = in.PrivilegedPods
out.Token = in.Token out.Token = in.Token
out.TokenTTL = (*v1.Duration)(unsafe.Pointer(in.TokenTTL)) out.TokenTTL = (*meta_v1.Duration)(unsafe.Pointer(in.TokenTTL))
out.TokenUsages = *(*[]string)(unsafe.Pointer(&in.TokenUsages)) out.TokenUsages = *(*[]string)(unsafe.Pointer(&in.TokenUsages))
out.TokenGroups = *(*[]string)(unsafe.Pointer(&in.TokenGroups)) out.TokenGroups = *(*[]string)(unsafe.Pointer(&in.TokenGroups))
out.CRISocket = in.CRISocket out.CRISocket = in.CRISocket
@ -253,7 +255,7 @@ func autoConvert_v1alpha1_MasterConfiguration_To_kubeadm_MasterConfiguration(in
out.APIServerCertSANs = *(*[]string)(unsafe.Pointer(&in.APIServerCertSANs)) out.APIServerCertSANs = *(*[]string)(unsafe.Pointer(&in.APIServerCertSANs))
out.CertificatesDir = in.CertificatesDir out.CertificatesDir = in.CertificatesDir
out.ImageRepository = in.ImageRepository out.ImageRepository = in.ImageRepository
out.ImagePullPolicy = core_v1.PullPolicy(in.ImagePullPolicy) out.ImagePullPolicy = v1.PullPolicy(in.ImagePullPolicy)
out.UnifiedControlPlaneImage = in.UnifiedControlPlaneImage out.UnifiedControlPlaneImage = in.UnifiedControlPlaneImage
if err := Convert_v1alpha1_AuditPolicyConfiguration_To_kubeadm_AuditPolicyConfiguration(&in.AuditPolicyConfiguration, &out.AuditPolicyConfiguration, s); err != nil { if err := Convert_v1alpha1_AuditPolicyConfiguration_To_kubeadm_AuditPolicyConfiguration(&in.AuditPolicyConfiguration, &out.AuditPolicyConfiguration, s); err != nil {
return err return err
@ -291,7 +293,7 @@ func autoConvert_kubeadm_MasterConfiguration_To_v1alpha1_MasterConfiguration(in
out.NoTaintMaster = in.NoTaintMaster out.NoTaintMaster = in.NoTaintMaster
out.PrivilegedPods = in.PrivilegedPods out.PrivilegedPods = in.PrivilegedPods
out.Token = in.Token out.Token = in.Token
out.TokenTTL = (*v1.Duration)(unsafe.Pointer(in.TokenTTL)) out.TokenTTL = (*meta_v1.Duration)(unsafe.Pointer(in.TokenTTL))
out.TokenUsages = *(*[]string)(unsafe.Pointer(&in.TokenUsages)) out.TokenUsages = *(*[]string)(unsafe.Pointer(&in.TokenUsages))
out.TokenGroups = *(*[]string)(unsafe.Pointer(&in.TokenGroups)) out.TokenGroups = *(*[]string)(unsafe.Pointer(&in.TokenGroups))
out.CRISocket = in.CRISocket out.CRISocket = in.CRISocket
@ -303,7 +305,7 @@ func autoConvert_kubeadm_MasterConfiguration_To_v1alpha1_MasterConfiguration(in
out.SchedulerExtraVolumes = *(*[]HostPathMount)(unsafe.Pointer(&in.SchedulerExtraVolumes)) out.SchedulerExtraVolumes = *(*[]HostPathMount)(unsafe.Pointer(&in.SchedulerExtraVolumes))
out.APIServerCertSANs = *(*[]string)(unsafe.Pointer(&in.APIServerCertSANs)) out.APIServerCertSANs = *(*[]string)(unsafe.Pointer(&in.APIServerCertSANs))
out.CertificatesDir = in.CertificatesDir out.CertificatesDir = in.CertificatesDir
out.ImagePullPolicy = core_v1.PullPolicy(in.ImagePullPolicy) out.ImagePullPolicy = v1.PullPolicy(in.ImagePullPolicy)
out.ImageRepository = in.ImageRepository out.ImageRepository = in.ImageRepository
// INFO: in.CIImageRepository opted out of conversion generation // INFO: in.CIImageRepository opted out of conversion generation
out.UnifiedControlPlaneImage = in.UnifiedControlPlaneImage out.UnifiedControlPlaneImage = in.UnifiedControlPlaneImage
@ -349,7 +351,7 @@ func autoConvert_v1alpha1_NodeConfiguration_To_kubeadm_NodeConfiguration(in *Nod
out.DiscoveryFile = in.DiscoveryFile out.DiscoveryFile = in.DiscoveryFile
out.DiscoveryToken = in.DiscoveryToken out.DiscoveryToken = in.DiscoveryToken
out.DiscoveryTokenAPIServers = *(*[]string)(unsafe.Pointer(&in.DiscoveryTokenAPIServers)) out.DiscoveryTokenAPIServers = *(*[]string)(unsafe.Pointer(&in.DiscoveryTokenAPIServers))
out.DiscoveryTimeout = (*v1.Duration)(unsafe.Pointer(in.DiscoveryTimeout)) out.DiscoveryTimeout = (*meta_v1.Duration)(unsafe.Pointer(in.DiscoveryTimeout))
out.NodeName = in.NodeName out.NodeName = in.NodeName
out.TLSBootstrapToken = in.TLSBootstrapToken out.TLSBootstrapToken = in.TLSBootstrapToken
out.Token = in.Token out.Token = in.Token
@ -371,7 +373,7 @@ func autoConvert_kubeadm_NodeConfiguration_To_v1alpha1_NodeConfiguration(in *kub
out.DiscoveryFile = in.DiscoveryFile out.DiscoveryFile = in.DiscoveryFile
out.DiscoveryToken = in.DiscoveryToken out.DiscoveryToken = in.DiscoveryToken
out.DiscoveryTokenAPIServers = *(*[]string)(unsafe.Pointer(&in.DiscoveryTokenAPIServers)) out.DiscoveryTokenAPIServers = *(*[]string)(unsafe.Pointer(&in.DiscoveryTokenAPIServers))
out.DiscoveryTimeout = (*v1.Duration)(unsafe.Pointer(in.DiscoveryTimeout)) out.DiscoveryTimeout = (*meta_v1.Duration)(unsafe.Pointer(in.DiscoveryTimeout))
out.NodeName = in.NodeName out.NodeName = in.NodeName
out.TLSBootstrapToken = in.TLSBootstrapToken out.TLSBootstrapToken = in.TLSBootstrapToken
out.Token = in.Token out.Token = in.Token

View File

@ -73,6 +73,7 @@ go_library(
"//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/flag:go_default_library",
"//vendor/k8s.io/client-go/kubernetes:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library",
"//vendor/k8s.io/client-go/tools/bootstrap/token/api:go_default_library", "//vendor/k8s.io/client-go/tools/bootstrap/token/api:go_default_library",
"//vendor/k8s.io/client-go/tools/clientcmd:go_default_library",
"//vendor/k8s.io/client-go/util/cert:go_default_library", "//vendor/k8s.io/client-go/util/cert:go_default_library",
"//vendor/k8s.io/utils/exec:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library",
], ],
@ -102,6 +103,7 @@ go_test(
"//vendor/k8s.io/client-go/kubernetes/fake:go_default_library", "//vendor/k8s.io/client-go/kubernetes/fake:go_default_library",
"//vendor/k8s.io/client-go/testing:go_default_library", "//vendor/k8s.io/client-go/testing:go_default_library",
"//vendor/k8s.io/client-go/tools/bootstrap/token/api:go_default_library", "//vendor/k8s.io/client-go/tools/bootstrap/token/api:go_default_library",
"//vendor/k8s.io/client-go/tools/clientcmd:go_default_library",
"//vendor/k8s.io/utils/exec:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library",
"//vendor/k8s.io/utils/exec/testing:go_default_library", "//vendor/k8s.io/utils/exec/testing:go_default_library",
], ],
@ -124,3 +126,14 @@ filegroup(
], ],
tags = ["automanaged"], tags = ["automanaged"],
) )
go_test(
name = "go_default_xtest",
srcs = ["config_test.go"],
deps = [
":go_default_library",
"//cmd/kubeadm/app/apis/kubeadm/v1alpha1:go_default_library",
"//cmd/kubeadm/app/features:go_default_library",
"//vendor/github.com/renstrom/dedent:go_default_library",
],
)

View File

@ -19,17 +19,21 @@ package cmd
import ( import (
"fmt" "fmt"
"io" "io"
"strings"
"github.com/golang/glog" "github.com/golang/glog"
"github.com/renstrom/dedent" "github.com/renstrom/dedent"
"github.com/spf13/cobra" "github.com/spf13/cobra"
flag "github.com/spf13/pflag"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
clientset "k8s.io/client-go/kubernetes" clientset "k8s.io/client-go/kubernetes"
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1"
cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util" cmdutil "k8s.io/kubernetes/cmd/kubeadm/app/cmd/util"
"k8s.io/kubernetes/cmd/kubeadm/app/constants" "k8s.io/kubernetes/cmd/kubeadm/app/constants"
"k8s.io/kubernetes/cmd/kubeadm/app/features" "k8s.io/kubernetes/cmd/kubeadm/app/features"
"k8s.io/kubernetes/cmd/kubeadm/app/images"
"k8s.io/kubernetes/cmd/kubeadm/app/phases/uploadconfig" "k8s.io/kubernetes/cmd/kubeadm/app/phases/uploadconfig"
kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
configutil "k8s.io/kubernetes/cmd/kubeadm/app/util/config" configutil "k8s.io/kubernetes/cmd/kubeadm/app/util/config"
@ -62,7 +66,7 @@ func NewCmdConfig(out io.Writer) *cobra.Command {
cmd.AddCommand(NewCmdConfigUpload(out, &kubeConfigFile)) cmd.AddCommand(NewCmdConfigUpload(out, &kubeConfigFile))
cmd.AddCommand(NewCmdConfigView(out, &kubeConfigFile)) cmd.AddCommand(NewCmdConfigView(out, &kubeConfigFile))
cmd.AddCommand(NewCmdConfigListImages(out))
return cmd return cmd
} }
@ -201,3 +205,70 @@ func uploadConfiguration(client clientset.Interface, cfgPath string, defaultcfg
// Then just call the uploadconfig phase to do the rest of the work // Then just call the uploadconfig phase to do the rest of the work
return uploadconfig.UploadConfiguration(internalcfg, client) return uploadconfig.UploadConfiguration(internalcfg, client)
} }
// NewCmdConfigListImages returns the "kubeadm images" command
func NewCmdConfigListImages(out io.Writer) *cobra.Command {
cfg := &kubeadmapiext.MasterConfiguration{}
kubeadmapiext.SetDefaults_MasterConfiguration(cfg)
var cfgPath, featureGatesString string
var err error
cmd := &cobra.Command{
Use: "list-images",
Short: "Print a list of images kubeadm will use. The configuration file is used in case any images or image repositories are customized.",
Run: func(_ *cobra.Command, _ []string) {
if cfg.FeatureGates, err = features.NewFeatureGate(&features.InitFeatureGates, featureGatesString); err != nil {
kubeadmutil.CheckErr(err)
}
listImages, err := NewListImages(cfgPath, cfg)
kubeadmutil.CheckErr(err)
kubeadmutil.CheckErr(listImages.Run(out))
},
}
AddListImagesConfigFlag(cmd.PersistentFlags(), cfg, &featureGatesString)
AddListImagesFlags(cmd.PersistentFlags(), &cfgPath)
return cmd
}
// NewListImages returns a "kubeadm images" command
func NewListImages(cfgPath string, cfg *kubeadmapiext.MasterConfiguration) (*ListImages, error) {
internalcfg, err := configutil.ConfigFileAndDefaultsToInternalConfig(cfgPath, cfg)
if err != nil {
return nil, fmt.Errorf("could not convert cfg to an internal cfg: %v", err)
}
return &ListImages{
cfg: internalcfg,
}, nil
}
// ListImages defines the struct used for "kubeadm images"
type ListImages struct {
cfg *kubeadmapi.MasterConfiguration
}
// Run runs the images command and writes the result to the io.Writer passed in
func (i *ListImages) Run(out io.Writer) error {
imgs := images.GetAllImages(i.cfg)
for _, img := range imgs {
fmt.Fprintln(out, img)
}
return nil
}
// AddListImagesConfigFlag adds the flags that configure kubeadm
func AddListImagesConfigFlag(flagSet *flag.FlagSet, cfg *kubeadmapiext.MasterConfiguration, featureGatesString *string) {
flagSet.StringVar(
&cfg.KubernetesVersion, "kubernetes-version", cfg.KubernetesVersion,
`Choose a specific Kubernetes version for the control plane.`,
)
flagSet.StringVar(featureGatesString, "feature-gates", *featureGatesString, "A set of key=value pairs that describe feature gates for various features. "+
"Options are:\n"+strings.Join(features.KnownFeatures(&features.InitFeatureGates), "\n"))
}
// AddListImagesFlags adds the flag that defines the location of the config file
func AddListImagesFlags(flagSet *flag.FlagSet, cfgPath *string) {
flagSet.StringVar(cfgPath, "config", *cfgPath, "Path to kubeadm config file.")
}

View File

@ -0,0 +1,172 @@
/*
Copyright 2018 The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package cmd_test
import (
"bytes"
"io/ioutil"
"os"
"path/filepath"
"strings"
"testing"
"github.com/renstrom/dedent"
kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1"
"k8s.io/kubernetes/cmd/kubeadm/app/cmd"
"k8s.io/kubernetes/cmd/kubeadm/app/features"
)
const (
defaultNumberOfImages = 8
)
func TestNewCmdConfigListImages(t *testing.T) {
var output bytes.Buffer
images := cmd.NewCmdConfigListImages(&output)
images.Run(nil, nil)
actual := strings.Split(output.String(), "\n")
if len(actual) != defaultNumberOfImages {
t.Fatalf("Expected %v but found %v images", defaultNumberOfImages, len(actual))
}
}
func TestListImagesRunWithCustomConfigPath(t *testing.T) {
testcases := []struct {
name string
expectedImageCount int
// each string provided here must appear in at least one image returned by Run
expectedImageSubstrings []string
configContents []byte
}{
{
name: "empty config contents",
expectedImageCount: defaultNumberOfImages,
configContents: []byte{},
},
{
name: "set k8s version",
expectedImageCount: defaultNumberOfImages,
expectedImageSubstrings: []string{
":v1.9.1",
},
configContents: []byte(dedent.Dedent(`
apiVersion: kubeadm.k8s.io/v1alpha1
kind: MasterConfiguration
kubernetesVersion: 1.9.1
`)),
},
{
name: "use coredns",
expectedImageCount: defaultNumberOfImages,
expectedImageSubstrings: []string{
"coredns",
},
configContents: []byte(dedent.Dedent(`
apiVersion: kubeadm.k8s.io/v1alpha1
kind: MasterConfiguration
featureGates:
CoreDNS: True
`)),
},
}
for _, tc := range testcases {
t.Run(tc.name, func(t *testing.T) {
tmpDir, err := ioutil.TempDir("", "kubeadm-images-test")
if err != nil {
t.Fatalf("Unable to create temporary directory: %v", err)
}
defer os.RemoveAll(tmpDir)
configFilePath := filepath.Join(tmpDir, "test-config-file")
err = ioutil.WriteFile(configFilePath, tc.configContents, 0644)
if err != nil {
t.Fatalf("Failed writing a config file: %v", err)
}
i, err := cmd.NewListImages(configFilePath, &kubeadmapiext.MasterConfiguration{})
if err != nil {
t.Fatalf("Failed getting the kubeadm images command: %v", err)
}
var output bytes.Buffer
if i.Run(&output) != nil {
t.Fatalf("Error from running the images command: %v", err)
}
actual := strings.Split(output.String(), "\n")
if len(actual) != tc.expectedImageCount {
t.Fatalf("did not get the same number of images: actual: %v expected: %v. Actual value: %v", len(actual), tc.expectedImageCount, actual)
}
for _, substring := range tc.expectedImageSubstrings {
if !strings.Contains(output.String(), substring) {
t.Errorf("Expected to find %v but did not in this list of images: %v", substring, actual)
}
}
})
}
}
func TestConfigListImagesRunWithoutPath(t *testing.T) {
testcases := []struct {
name string
cfg kubeadmapiext.MasterConfiguration
expectedImages int
}{
{
name: "empty config",
expectedImages: defaultNumberOfImages,
},
{
name: "external etcd configuration",
cfg: kubeadmapiext.MasterConfiguration{
Etcd: kubeadmapiext.Etcd{
Endpoints: []string{"hi"},
},
},
expectedImages: defaultNumberOfImages - 1,
},
{
name: "coredns enabled",
cfg: kubeadmapiext.MasterConfiguration{
FeatureGates: map[string]bool{
features.CoreDNS: true,
},
},
expectedImages: defaultNumberOfImages,
},
}
for _, tc := range testcases {
t.Run(tc.name, func(t *testing.T) {
i, err := cmd.NewListImages("", &tc.cfg)
if err != nil {
t.Fatalf("did not expect an error while creating the Images command: %v", err)
}
var output bytes.Buffer
if i.Run(&output) != nil {
t.Fatalf("did not expect an error running the Images command: %v", err)
}
actual := strings.Split(output.String(), "\n")
if len(actual) != tc.expectedImages {
t.Fatalf("expected %v images but got %v", tc.expectedImages, actual)
}
})
}
}

View File

@ -187,7 +187,7 @@ func AddInitConfigFlags(flagSet *flag.FlagSet, cfg *kubeadmapiext.MasterConfigur
) )
flagSet.StringVar( flagSet.StringVar(
&cfg.Token, "token", cfg.Token, &cfg.Token, "token", cfg.Token,
"The token to use for establishing bidirectional trust between nodes and masters.", "The token to use for establishing bidirectional trust between nodes and masters. The format is [a-z0-9]{6}\\.[a-z0-9]{16} - e.g. abcdef.0123456789abcdef",
) )
flagSet.DurationVar( flagSet.DurationVar(
&cfg.TokenTTL.Duration, "token-ttl", cfg.TokenTTL.Duration, &cfg.TokenTTL.Duration, "token-ttl", cfg.TokenTTL.Duration,

View File

@ -39,12 +39,6 @@ import (
utilsexec "k8s.io/utils/exec" utilsexec "k8s.io/utils/exec"
) )
var (
crictlSandboxesParamsFormat = "%s -r %s sandboxes --quiet | xargs -r"
crictlStopParamsFormat = "%s -r %s stops %s"
crictlRemoveParamsFormat = "%s -r %s rms %s"
)
// NewCmdReset returns the "kubeadm reset" command // NewCmdReset returns the "kubeadm reset" command
func NewCmdReset(in io.Reader, out io.Writer) *cobra.Command { func NewCmdReset(in io.Reader, out io.Writer) *cobra.Command {
var skipPreFlight bool var skipPreFlight bool
@ -213,28 +207,31 @@ func resetWithCrictl(execer utilsexec.Interface, dockerCheck preflight.Checker,
glog.Infof("[reset] cleaning up running containers using crictl with socket %s\n", criSocketPath) glog.Infof("[reset] cleaning up running containers using crictl with socket %s\n", criSocketPath)
glog.V(1).Infoln("[reset] listing running pods using crictl") glog.V(1).Infoln("[reset] listing running pods using crictl")
listcmd := fmt.Sprintf(crictlSandboxesParamsFormat, crictlPath, criSocketPath) params := []string{"-r", criSocketPath, "pods", "--quiet"}
glog.V(1).Infof("[reset] executing comand %q", listcmd) glog.V(1).Infof("[reset] executing command %s %s", crictlPath, strings.Join(params, " "))
output, err := execer.Command(listcmd).CombinedOutput() output, err := execer.Command(crictlPath, params...).CombinedOutput()
if err != nil { if err != nil {
glog.Infoln("[reset] failed to list running pods using crictl. Trying using docker instead") glog.Infof("[reset] failed to list running pods using crictl: %s. Trying using docker instead", err)
resetWithDocker(execer, dockerCheck) resetWithDocker(execer, dockerCheck)
return return
} }
sandboxes := strings.Split(string(output), " ") sandboxes := strings.Split(string(output), " ")
glog.V(1).Infoln("[reset] stopping and removing running containers using crictl") glog.V(1).Infoln("[reset] stopping and removing running containers using crictl")
for _, s := range sandboxes { for _, s := range sandboxes {
stopcmd := fmt.Sprintf(crictlStopParamsFormat, crictlPath, criSocketPath, s) if strings.TrimSpace(s) == "" {
glog.V(1).Infof("[reset] executing command %q", stopcmd) continue
if err := execer.Command(stopcmd).Run(); err != nil { }
glog.Infoln("[reset] failed to stop the running containers using crictl. Trying using docker instead") params = []string{"-r", criSocketPath, "stop", s}
glog.V(1).Infof("[reset] executing command %s %s", crictlPath, strings.Join(params, " "))
if err := execer.Command(crictlPath, params...).Run(); err != nil {
glog.Infof("[reset] failed to stop the running containers using crictl: %s. Trying using docker instead", err)
resetWithDocker(execer, dockerCheck) resetWithDocker(execer, dockerCheck)
return return
} }
removecmd := fmt.Sprintf(crictlRemoveParamsFormat, crictlPath, criSocketPath, s) params = []string{"-r", criSocketPath, "rm", s}
glog.V(1).Infof("[reset] executing command %q", removecmd) glog.V(1).Infof("[reset] executing command %s %s", crictlPath, strings.Join(params, " "))
if err := execer.Command(removecmd).Run(); err != nil { if err := execer.Command(crictlPath, params...).Run(); err != nil {
glog.Infoln("[reset] failed to remove the running containers using crictl. Trying using docker instead") glog.Infof("[reset] failed to remove the running containers using crictl: %s. Trying using docker instead", err)
resetWithDocker(execer, dockerCheck) resetWithDocker(execer, dockerCheck)
return return
} }

View File

@ -35,6 +35,7 @@ import (
"k8s.io/apimachinery/pkg/util/duration" "k8s.io/apimachinery/pkg/util/duration"
clientset "k8s.io/client-go/kubernetes" clientset "k8s.io/client-go/kubernetes"
bootstrapapi "k8s.io/client-go/tools/bootstrap/token/api" bootstrapapi "k8s.io/client-go/tools/bootstrap/token/api"
"k8s.io/client-go/tools/clientcmd"
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1"
"k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation" "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation"
@ -50,6 +51,8 @@ import (
api "k8s.io/kubernetes/pkg/apis/core" api "k8s.io/kubernetes/pkg/apis/core"
) )
const defaultKubeConfig = "/etc/kubernetes/admin.conf"
// NewCmdToken returns cobra.Command for token management // NewCmdToken returns cobra.Command for token management
func NewCmdToken(out io.Writer, errW io.Writer) *cobra.Command { func NewCmdToken(out io.Writer, errW io.Writer) *cobra.Command {
var kubeConfigFile string var kubeConfigFile string
@ -85,7 +88,7 @@ func NewCmdToken(out io.Writer, errW io.Writer) *cobra.Command {
} }
tokenCmd.PersistentFlags().StringVar(&kubeConfigFile, tokenCmd.PersistentFlags().StringVar(&kubeConfigFile,
"kubeconfig", "/etc/kubernetes/admin.conf", "The KubeConfig file to use when talking to the cluster") "kubeconfig", defaultKubeConfig, "The KubeConfig file to use when talking to the cluster. If the flag is not set a set of standard locations are searched for an existing KubeConfig file")
tokenCmd.PersistentFlags().BoolVar(&dryRun, tokenCmd.PersistentFlags().BoolVar(&dryRun,
"dry-run", dryRun, "Whether to enable dry-run mode or not") "dry-run", dryRun, "Whether to enable dry-run mode or not")
@ -121,6 +124,7 @@ func NewCmdToken(out io.Writer, errW io.Writer) *cobra.Command {
kubeadmutil.CheckErr(err) kubeadmutil.CheckErr(err)
glog.V(1).Infoln("[token] getting Clientsets from KubeConfig file") glog.V(1).Infoln("[token] getting Clientsets from KubeConfig file")
kubeConfigFile = findExistingKubeConfig(kubeConfigFile)
client, err := getClientset(kubeConfigFile, dryRun) client, err := getClientset(kubeConfigFile, dryRun)
kubeadmutil.CheckErr(err) kubeadmutil.CheckErr(err)
@ -152,6 +156,7 @@ func NewCmdToken(out io.Writer, errW io.Writer) *cobra.Command {
This command will list all bootstrap tokens for you. This command will list all bootstrap tokens for you.
`), `),
Run: func(tokenCmd *cobra.Command, args []string) { Run: func(tokenCmd *cobra.Command, args []string) {
kubeConfigFile = findExistingKubeConfig(kubeConfigFile)
client, err := getClientset(kubeConfigFile, dryRun) client, err := getClientset(kubeConfigFile, dryRun)
kubeadmutil.CheckErr(err) kubeadmutil.CheckErr(err)
@ -175,6 +180,7 @@ func NewCmdToken(out io.Writer, errW io.Writer) *cobra.Command {
if len(args) < 1 { if len(args) < 1 {
kubeadmutil.CheckErr(fmt.Errorf("missing subcommand; 'token delete' is missing token of form [%q]", tokenutil.TokenIDRegexpString)) kubeadmutil.CheckErr(fmt.Errorf("missing subcommand; 'token delete' is missing token of form [%q]", tokenutil.TokenIDRegexpString))
} }
kubeConfigFile = findExistingKubeConfig(kubeConfigFile)
client, err := getClientset(kubeConfigFile, dryRun) client, err := getClientset(kubeConfigFile, dryRun)
kubeadmutil.CheckErr(err) kubeadmutil.CheckErr(err)
@ -381,3 +387,16 @@ func getClientset(file string, dryRun bool) (clientset.Interface, error) {
} }
return kubeconfigutil.ClientSetFromFile(file) return kubeconfigutil.ClientSetFromFile(file)
} }
func findExistingKubeConfig(file string) string {
// The user did provide a --kubeconfig flag. Respect that and threat it as an
// explicit path without building a DefaultClientConfigLoadingRules object.
if file != defaultKubeConfig {
return file
}
// The user did not provide a --kubeconfig flag. Find a config in the standard
// locations using DefaultClientConfigLoadingRules, but also consider `defaultKubeConfig`.
rules := clientcmd.NewDefaultClientConfigLoadingRules()
rules.Precedence = append(rules.Precedence, defaultKubeConfig)
return rules.GetDefaultFilename()
}

View File

@ -37,12 +37,13 @@ import (
"k8s.io/client-go/kubernetes/fake" "k8s.io/client-go/kubernetes/fake"
core "k8s.io/client-go/testing" core "k8s.io/client-go/testing"
bootstrapapi "k8s.io/client-go/tools/bootstrap/token/api" bootstrapapi "k8s.io/client-go/tools/bootstrap/token/api"
"k8s.io/client-go/tools/clientcmd"
kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1" kubeadmapiext "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1alpha1"
) )
const ( const (
TokenExpectedRegex = "^\\S{6}\\.\\S{16}\n$" tokenExpectedRegex = "^\\S{6}\\.\\S{16}\n$"
TestConfig = `apiVersion: v1 testConfigToken = `apiVersion: v1
clusters: clusters:
- cluster: - cluster:
certificate-authority-data: certificate-authority-data:
@ -63,8 +64,8 @@ users:
client-certificate-data: client-certificate-data:
client-key-data: client-key-data:
` `
TestConfigCertAuthorityData = "certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRFM01USXhOREUxTlRFek1Gb1hEVEkzTVRJeE1qRTFOVEV6TUZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTlZrCnNkT0NjRDBIOG9ycXZ5djBEZ09jZEpjRGc4aTJPNGt3QVpPOWZUanJGRHJqbDZlVXRtdlMyZ1lZd0c4TGhPV2gKb0lkZ3AvbVkrbVlDakliUUJtTmE2Ums1V2JremhJRzM1c1lseE9NVUJJR0xXMzN0RTh4SlR1RVd3V0NmZnpLcQpyaU1UT1A3REF3MUxuM2xUNlpJNGRNM09NOE1IUk9Wd3lRMDVpbWo5eUx5R1lYdTlvSncwdTVXWVpFYmpUL3VpCjJBZ2QwVDMrZGFFb044aVBJOTlVQkQxMzRkc2VGSEJEY3hHcmsvVGlQdHBpSC9IOGoxRWZaYzRzTGlONzJmL2YKYUpacTROSHFiT2F5UkpITCtJejFNTW1DRkN3cjdHOHVENWVvWWp2dEdZN2xLc1pBTlUwK3VlUnJsTitxTzhQWQpxaTZNMDFBcmV1UzFVVHFuTkM4Q0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFNbXo4Nm9LMmFLa0owMnlLSC9ZcTlzaDZZcDEKYmhLS25mMFJCaTA1clRacWdhTi9oTnROdmQxSzJxZGRLNzhIT2pVdkpNRGp3NERieXF0Wll2V01XVFRCQnQrSgpPMGNyWkg5NXlqUW42YzRlcU1FTjFhOUFKNXRlclNnTDVhREJsK0FMTWxaNVpxTzBUOUJDdTJtNXV3dGNWaFZuCnh6cGpTT3V5WVdOQ3A5bW9mV2VPUTljNXhEcElWeUlMUkFvNmZ5Z2c3N25TSDN4ckVmd0VKUHFMd1RPYVk1bTcKeEZWWWJoR3dxUGU5V0I5aTR5cnNrZUFBWlpUSzdVbklKMXFkRmlHQk9aZlRtaDhYQ3BOTHZZcFBLQW9hWWlsRwpjOW1acVhpWVlESTV6R1IxMElpc2FWNXJUY2hDenNQVWRhQzRVbnpTZG01cTdKYTAyb0poQlU1TE1FMD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=" testConfigTokenCertAuthorityData = "certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRFM01USXhOREUxTlRFek1Gb1hEVEkzTVRJeE1qRTFOVEV6TUZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTlZrCnNkT0NjRDBIOG9ycXZ5djBEZ09jZEpjRGc4aTJPNGt3QVpPOWZUanJGRHJqbDZlVXRtdlMyZ1lZd0c4TGhPV2gKb0lkZ3AvbVkrbVlDakliUUJtTmE2Ums1V2JremhJRzM1c1lseE9NVUJJR0xXMzN0RTh4SlR1RVd3V0NmZnpLcQpyaU1UT1A3REF3MUxuM2xUNlpJNGRNM09NOE1IUk9Wd3lRMDVpbWo5eUx5R1lYdTlvSncwdTVXWVpFYmpUL3VpCjJBZ2QwVDMrZGFFb044aVBJOTlVQkQxMzRkc2VGSEJEY3hHcmsvVGlQdHBpSC9IOGoxRWZaYzRzTGlONzJmL2YKYUpacTROSHFiT2F5UkpITCtJejFNTW1DRkN3cjdHOHVENWVvWWp2dEdZN2xLc1pBTlUwK3VlUnJsTitxTzhQWQpxaTZNMDFBcmV1UzFVVHFuTkM4Q0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFNbXo4Nm9LMmFLa0owMnlLSC9ZcTlzaDZZcDEKYmhLS25mMFJCaTA1clRacWdhTi9oTnROdmQxSzJxZGRLNzhIT2pVdkpNRGp3NERieXF0Wll2V01XVFRCQnQrSgpPMGNyWkg5NXlqUW42YzRlcU1FTjFhOUFKNXRlclNnTDVhREJsK0FMTWxaNVpxTzBUOUJDdTJtNXV3dGNWaFZuCnh6cGpTT3V5WVdOQ3A5bW9mV2VPUTljNXhEcElWeUlMUkFvNmZ5Z2c3N25TSDN4ckVmd0VKUHFMd1RPYVk1bTcKeEZWWWJoR3dxUGU5V0I5aTR5cnNrZUFBWlpUSzdVbklKMXFkRmlHQk9aZlRtaDhYQ3BOTHZZcFBLQW9hWWlsRwpjOW1acVhpWVlESTV6R1IxMElpc2FWNXJUY2hDenNQVWRhQzRVbnpTZG01cTdKYTAyb0poQlU1TE1FMD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo="
TestConfigNoCluster = `apiVersion: v1 testConfigTokenNoCluster = `apiVersion: v1
clusters: clusters:
- cluster: - cluster:
server: server:
@ -89,12 +90,12 @@ func TestRunGenerateToken(t *testing.T) {
output := buf.String() output := buf.String()
matched, err := regexp.MatchString(TokenExpectedRegex, output) matched, err := regexp.MatchString(tokenExpectedRegex, output)
if err != nil { if err != nil {
t.Fatalf("Encountered an error while trying to match RunGenerateToken's output: %v", err) t.Fatalf("Encountered an error while trying to match RunGenerateToken's output: %v", err)
} }
if !matched { if !matched {
t.Errorf("RunGenerateToken's output did not match expected regex; wanted: [%s], got: [%s]", TokenExpectedRegex, output) t.Errorf("RunGenerateToken's output did not match expected regex; wanted: [%s], got: [%s]", tokenExpectedRegex, output)
} }
} }
@ -211,14 +212,14 @@ func TestNewCmdTokenGenerate(t *testing.T) {
func TestNewCmdToken(t *testing.T) { func TestNewCmdToken(t *testing.T) {
var buf, bufErr bytes.Buffer var buf, bufErr bytes.Buffer
testConfigFile := "test-config-file" testConfigTokenFile := "test-config-file"
tmpDir, err := ioutil.TempDir("", "kubeadm-token-test") tmpDir, err := ioutil.TempDir("", "kubeadm-token-test")
if err != nil { if err != nil {
t.Errorf("Unable to create temporary directory: %v", err) t.Errorf("Unable to create temporary directory: %v", err)
} }
defer os.RemoveAll(tmpDir) defer os.RemoveAll(tmpDir)
fullPath := filepath.Join(tmpDir, testConfigFile) fullPath := filepath.Join(tmpDir, testConfigTokenFile)
f, err := os.Create(fullPath) f, err := os.Create(fullPath)
if err != nil { if err != nil {
@ -230,6 +231,7 @@ func TestNewCmdToken(t *testing.T) {
name string name string
args []string args []string
configToWrite string configToWrite string
kubeConfigEnv string
expectedError bool expectedError bool
}{ }{
{ {
@ -239,23 +241,39 @@ func TestNewCmdToken(t *testing.T) {
expectedError: false, expectedError: false,
}, },
{ {
name: "valid: delete", name: "valid: delete from --kubeconfig",
args: []string{"delete", "abcdef.1234567890123456", "--dry-run", "--kubeconfig=" + fullPath}, args: []string{"delete", "abcdef.1234567890123456", "--dry-run", "--kubeconfig=" + fullPath},
configToWrite: TestConfig, configToWrite: testConfigToken,
expectedError: false,
},
{
name: "valid: delete from " + clientcmd.RecommendedConfigPathEnvVar,
args: []string{"delete", "abcdef.1234567890123456", "--dry-run"},
configToWrite: testConfigToken,
kubeConfigEnv: fullPath,
expectedError: false, expectedError: false,
}, },
} }
cmd := NewCmdToken(&buf, &bufErr)
for _, tc := range testCases { for _, tc := range testCases {
// the command is created for each test so that the kubeConfigFile
// variable in NewCmdToken() is reset.
cmd := NewCmdToken(&buf, &bufErr)
if _, err = f.WriteString(tc.configToWrite); err != nil { if _, err = f.WriteString(tc.configToWrite); err != nil {
t.Errorf("Unable to write test file %q: %v", fullPath, err) t.Errorf("Unable to write test file %q: %v", fullPath, err)
} }
// store the current value of the environment variable.
storedEnv := os.Getenv(clientcmd.RecommendedConfigPathEnvVar)
if tc.kubeConfigEnv != "" {
os.Setenv(clientcmd.RecommendedConfigPathEnvVar, tc.kubeConfigEnv)
}
cmd.SetArgs(tc.args) cmd.SetArgs(tc.args)
err := cmd.Execute() err := cmd.Execute()
if (err != nil) != tc.expectedError { if (err != nil) != tc.expectedError {
t.Errorf("Test case %q: NewCmdToken expected error: %v, saw: %v", tc.name, tc.expectedError, (err != nil)) t.Errorf("Test case %q: NewCmdToken expected error: %v, saw: %v", tc.name, tc.expectedError, (err != nil))
} }
// restore the environment variable.
os.Setenv(clientcmd.RecommendedConfigPathEnvVar, storedEnv)
} }
} }
@ -276,14 +294,14 @@ func TestGetSecretString(t *testing.T) {
} }
func TestGetClientset(t *testing.T) { func TestGetClientset(t *testing.T) {
testConfigFile := "test-config-file" testConfigTokenFile := "test-config-file"
tmpDir, err := ioutil.TempDir("", "kubeadm-token-test") tmpDir, err := ioutil.TempDir("", "kubeadm-token-test")
if err != nil { if err != nil {
t.Errorf("Unable to create temporary directory: %v", err) t.Errorf("Unable to create temporary directory: %v", err)
} }
defer os.RemoveAll(tmpDir) defer os.RemoveAll(tmpDir)
fullPath := filepath.Join(tmpDir, testConfigFile) fullPath := filepath.Join(tmpDir, testConfigTokenFile)
// test dryRun = false on a non-exisiting file // test dryRun = false on a non-exisiting file
if _, err = getClientset(fullPath, false); err == nil { if _, err = getClientset(fullPath, false); err == nil {
@ -301,7 +319,7 @@ func TestGetClientset(t *testing.T) {
} }
defer f.Close() defer f.Close()
if _, err = f.WriteString(TestConfig); err != nil { if _, err = f.WriteString(testConfigToken); err != nil {
t.Errorf("Unable to write test file %q: %v", fullPath, err) t.Errorf("Unable to write test file %q: %v", fullPath, err)
} }
@ -327,7 +345,7 @@ func TestRunDeleteToken(t *testing.T) {
} }
defer f.Close() defer f.Close()
if _, err = f.WriteString(TestConfig); err != nil { if _, err = f.WriteString(testConfigToken); err != nil {
t.Errorf("Unable to write test file %q: %v", fullPath, err) t.Errorf("Unable to write test file %q: %v", fullPath, err)
} }
@ -369,7 +387,7 @@ func TestRunListTokens(t *testing.T) {
defer f.Close() defer f.Close()
// test config without secrets; should fail // test config without secrets; should fail
if _, err = f.WriteString(TestConfig); err != nil { if _, err = f.WriteString(testConfigToken); err != nil {
t.Errorf("Unable to write test file %q: %v", fullPath, err) t.Errorf("Unable to write test file %q: %v", fullPath, err)
} }
@ -394,9 +412,9 @@ func TestRunListTokens(t *testing.T) {
}() }()
fmt.Printf("dummy API server listening on localhost:%s\n", portString) fmt.Printf("dummy API server listening on localhost:%s\n", portString)
testConfigOpenPort := strings.Replace(TestConfig, "server: localhost:8000", "server: localhost:"+portString, -1) testConfigTokenOpenPort := strings.Replace(testConfigToken, "server: localhost:8000", "server: localhost:"+portString, -1)
if _, err = f.WriteString(testConfigOpenPort); err != nil { if _, err = f.WriteString(testConfigTokenOpenPort); err != nil {
t.Errorf("Unable to write test file %q: %v", fullPath, err) t.Errorf("Unable to write test file %q: %v", fullPath, err)
} }

View File

@ -11,7 +11,10 @@ go_library(
srcs = ["images.go"], srcs = ["images.go"],
importpath = "k8s.io/kubernetes/cmd/kubeadm/app/images", importpath = "k8s.io/kubernetes/cmd/kubeadm/app/images",
deps = [ deps = [
"//cmd/kubeadm/app/apis/kubeadm:go_default_library",
"//cmd/kubeadm/app/constants:go_default_library", "//cmd/kubeadm/app/constants:go_default_library",
"//cmd/kubeadm/app/features:go_default_library",
"//cmd/kubeadm/app/phases/addons/dns:go_default_library",
"//cmd/kubeadm/app/util:go_default_library", "//cmd/kubeadm/app/util:go_default_library",
], ],
) )

View File

@ -20,7 +20,10 @@ import (
"fmt" "fmt"
"runtime" "runtime"
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
"k8s.io/kubernetes/cmd/kubeadm/app/constants" "k8s.io/kubernetes/cmd/kubeadm/app/constants"
"k8s.io/kubernetes/cmd/kubeadm/app/features"
"k8s.io/kubernetes/cmd/kubeadm/app/phases/addons/dns"
kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
) )
@ -42,3 +45,25 @@ func GetCoreImage(image, repoPrefix, k8sVersion, overrideImage string) string {
constants.KubeScheduler: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "kube-scheduler", runtime.GOARCH, kubernetesImageTag), constants.KubeScheduler: fmt.Sprintf("%s/%s-%s:%s", repoPrefix, "kube-scheduler", runtime.GOARCH, kubernetesImageTag),
}[image] }[image]
} }
// GetAllImages returns a list of container images kubeadm expects to use on a control plane node
func GetAllImages(cfg *kubeadmapi.MasterConfiguration) []string {
imgs := []string{}
imgs = append(imgs, GetCoreImage(constants.KubeAPIServer, cfg.ImageRepository, cfg.KubernetesVersion, cfg.UnifiedControlPlaneImage))
imgs = append(imgs, GetCoreImage(constants.KubeControllerManager, cfg.ImageRepository, cfg.KubernetesVersion, cfg.UnifiedControlPlaneImage))
imgs = append(imgs, GetCoreImage(constants.KubeScheduler, cfg.ImageRepository, cfg.KubernetesVersion, cfg.UnifiedControlPlaneImage))
imgs = append(imgs, fmt.Sprintf("%v/%v-%v:%v", cfg.ImageRepository, constants.KubeProxy, runtime.GOARCH, kubeadmutil.KubernetesVersionToImageTag(cfg.KubernetesVersion)))
imgs = append(imgs, fmt.Sprintf("%v/pause-%v:%v", cfg.ImageRepository, runtime.GOARCH, "3.1"))
// if etcd is not external then add the image as it will be required
if len(cfg.Etcd.Endpoints) == 0 {
imgs = append(imgs, GetCoreImage(constants.Etcd, cfg.ImageRepository, cfg.KubernetesVersion, cfg.Etcd.Image))
}
dnsImage := fmt.Sprintf("%v/k8s-dns-kube-dns-%v:%v", cfg.ImageRepository, runtime.GOARCH, dns.GetDNSVersion(nil, constants.KubeDNS))
if features.Enabled(cfg.FeatureGates, features.CoreDNS) {
dnsImage = fmt.Sprintf("coredns/coredns:%v", dns.GetDNSVersion(nil, constants.CoreDNS))
}
imgs = append(imgs, dnsImage)
return imgs
}

View File

@ -107,9 +107,9 @@ func getHostPathVolumesForTheControlPlane(cfg *kubeadmapi.MasterConfiguration) c
// Merge user defined mounts and ensure unique volume and volume mount // Merge user defined mounts and ensure unique volume and volume mount
// names // names
mounts.AddExtraHostPathMounts(kubeadmconstants.KubeAPIServer, cfg.APIServerExtraVolumes, &hostPathDirectoryOrCreate) mounts.AddExtraHostPathMounts(kubeadmconstants.KubeAPIServer, cfg.APIServerExtraVolumes)
mounts.AddExtraHostPathMounts(kubeadmconstants.KubeControllerManager, cfg.ControllerManagerExtraVolumes, &hostPathDirectoryOrCreate) mounts.AddExtraHostPathMounts(kubeadmconstants.KubeControllerManager, cfg.ControllerManagerExtraVolumes)
mounts.AddExtraHostPathMounts(kubeadmconstants.KubeScheduler, cfg.SchedulerExtraVolumes, &hostPathDirectoryOrCreate) mounts.AddExtraHostPathMounts(kubeadmconstants.KubeScheduler, cfg.SchedulerExtraVolumes)
return mounts return mounts
} }
@ -155,10 +155,11 @@ func (c *controlPlaneHostPathMounts) AddHostPathMounts(component string, vols []
// AddExtraHostPathMounts adds host path mounts and overwrites the default // AddExtraHostPathMounts adds host path mounts and overwrites the default
// paths in the case that a user specifies the same volume/volume mount name. // paths in the case that a user specifies the same volume/volume mount name.
func (c *controlPlaneHostPathMounts) AddExtraHostPathMounts(component string, extraVols []kubeadmapi.HostPathMount, hostPathType *v1.HostPathType) { func (c *controlPlaneHostPathMounts) AddExtraHostPathMounts(component string, extraVols []kubeadmapi.HostPathMount) {
for _, extraVol := range extraVols { for _, extraVol := range extraVols {
fmt.Printf("[controlplane] Adding extra host path mount %q to %q\n", extraVol.Name, component) fmt.Printf("[controlplane] Adding extra host path mount %q to %q\n", extraVol.Name, component)
c.NewHostPathMount(component, extraVol.Name, extraVol.HostPath, extraVol.MountPath, !extraVol.Writable, hostPathType) hostPathType := extraVol.PathType
c.NewHostPathMount(component, extraVol.Name, extraVol.HostPath, extraVol.MountPath, !extraVol.Writable, &hostPathType)
} }
} }

View File

@ -615,19 +615,35 @@ func TestAddExtraHostPathMounts(t *testing.T) {
mounts.AddHostPathMounts("component", vols, volMounts) mounts.AddHostPathMounts("component", vols, volMounts)
hostPathMounts := []kubeadmapi.HostPathMount{ hostPathMounts := []kubeadmapi.HostPathMount{
{ {
Name: "foo", Name: "foo-0",
HostPath: "/tmp/qux", HostPath: "/tmp/qux-0",
MountPath: "/tmp/qux", MountPath: "/tmp/qux-0",
Writable: false, Writable: false,
PathType: v1.HostPathFile,
}, },
{ {
Name: "bar", Name: "bar-0",
HostPath: "/tmp/asd", HostPath: "/tmp/asd-0",
MountPath: "/tmp/asd", MountPath: "/tmp/asd-0",
Writable: true, Writable: true,
PathType: v1.HostPathDirectory,
},
{
Name: "foo-1",
HostPath: "/tmp/qux-1",
MountPath: "/tmp/qux-1",
Writable: false,
PathType: v1.HostPathFileOrCreate,
},
{
Name: "bar-1",
HostPath: "/tmp/asd-1",
MountPath: "/tmp/asd-1",
Writable: true,
PathType: v1.HostPathDirectoryOrCreate,
}, },
} }
mounts.AddExtraHostPathMounts("component", hostPathMounts, &hostPathDirectoryOrCreate) mounts.AddExtraHostPathMounts("component", hostPathMounts)
for _, hostMount := range hostPathMounts { for _, hostMount := range hostPathMounts {
volumeName := hostMount.Name volumeName := hostMount.Name
if _, ok := mounts.volumes["component"][volumeName]; !ok { if _, ok := mounts.volumes["component"][volumeName]; !ok {
@ -643,6 +659,9 @@ func TestAddExtraHostPathMounts(t *testing.T) {
if _, ok := mounts.volumeMounts["component"][volumeName]; !ok { if _, ok := mounts.volumeMounts["component"][volumeName]; !ok {
t.Errorf("Expected to find volume mount %q", volumeName) t.Errorf("Expected to find volume mount %q", volumeName)
} }
if *vol.HostPath.Type != v1.HostPathType(hostMount.PathType) {
t.Errorf("Expected to host path type %q", hostMount.PathType)
}
volMount, _ := mounts.volumeMounts["component"][volumeName] volMount, _ := mounts.volumeMounts["component"][volumeName]
if volMount.Name != volumeName { if volMount.Name != volumeName {
t.Errorf("Expected volume mount name %q", volumeName) t.Errorf("Expected volume mount name %q", volumeName)

View File

@ -116,10 +116,11 @@ func updateNodeWithConfigMap(client clientset.Interface, nodeName string) error
} }
node.Spec.ConfigSource = &v1.NodeConfigSource{ node.Spec.ConfigSource = &v1.NodeConfigSource{
ConfigMapRef: &v1.ObjectReference{ ConfigMap: &v1.ConfigMapNodeConfigSource{
Name: kubeadmconstants.KubeletBaseConfigurationConfigMap, Name: kubeadmconstants.KubeletBaseConfigurationConfigMap,
Namespace: metav1.NamespaceSystem, Namespace: metav1.NamespaceSystem,
UID: kubeletCfg.UID, UID: kubeletCfg.UID,
KubeletConfigKey: kubeadmconstants.KubeletBaseConfigurationConfigMapKey,
}, },
} }

View File

@ -50,7 +50,7 @@ func TestCreateBaseKubeletConfiguration(t *testing.T) {
}, },
Spec: v1.NodeSpec{ Spec: v1.NodeSpec{
ConfigSource: &v1.NodeConfigSource{ ConfigSource: &v1.NodeConfigSource{
ConfigMapRef: &v1.ObjectReference{ ConfigMap: &v1.ConfigMapNodeConfigSource{
UID: "", UID: "",
}, },
}, },
@ -94,7 +94,7 @@ func TestUpdateNodeWithConfigMap(t *testing.T) {
}, },
Spec: v1.NodeSpec{ Spec: v1.NodeSpec{
ConfigSource: &v1.NodeConfigSource{ ConfigSource: &v1.NodeConfigSource{
ConfigMapRef: &v1.ObjectReference{ ConfigMap: &v1.ConfigMapNodeConfigSource{
UID: "", UID: "",
}, },
}, },

View File

@ -107,7 +107,7 @@ func (criCheck CRICheck) Check() (warnings, errors []error) {
errors = append(errors, fmt.Errorf("unable to find command crictl: %s", err)) errors = append(errors, fmt.Errorf("unable to find command crictl: %s", err))
return warnings, errors return warnings, errors
} }
if err := criCheck.exec.Command(fmt.Sprintf("%s -r %s info", crictlPath, criCheck.socket)).Run(); err != nil { if err := criCheck.exec.Command(crictlPath, "-r", criCheck.socket, "info").Run(); err != nil {
errors = append(errors, fmt.Errorf("unable to check if the container runtime at %q is running: %s", criCheck.socket, err)) errors = append(errors, fmt.Errorf("unable to check if the container runtime at %q is running: %s", criCheck.socket, err))
return warnings, errors return warnings, errors
} }

View File

@ -20,7 +20,6 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/dynamic" "k8s.io/client-go/dynamic"
@ -34,7 +33,7 @@ import (
// ClientBackedDryRunGetter implements the DryRunGetter interface for use in NewDryRunClient() and proxies all GET and LIST requests to the backing API server reachable via rest.Config // ClientBackedDryRunGetter implements the DryRunGetter interface for use in NewDryRunClient() and proxies all GET and LIST requests to the backing API server reachable via rest.Config
type ClientBackedDryRunGetter struct { type ClientBackedDryRunGetter struct {
client clientset.Interface client clientset.Interface
dynClientPool dynamic.ClientPool dynamicClient dynamic.DynamicInterface
} }
// InitDryRunGetter should implement the DryRunGetter interface // InitDryRunGetter should implement the DryRunGetter interface
@ -46,10 +45,14 @@ func NewClientBackedDryRunGetter(config *rest.Config) (*ClientBackedDryRunGetter
if err != nil { if err != nil {
return nil, err return nil, err
} }
dynamicClient, err := dynamic.NewForConfig(config)
if err != nil {
return nil, err
}
return &ClientBackedDryRunGetter{ return &ClientBackedDryRunGetter{
client: client, client: client,
dynClientPool: dynamic.NewDynamicClientPool(config), dynamicClient: dynamicClient,
}, nil }, nil
} }
@ -68,22 +71,13 @@ func NewClientBackedDryRunGetterFromKubeconfig(file string) (*ClientBackedDryRun
// HandleGetAction handles GET actions to the dryrun clientset this interface supports // HandleGetAction handles GET actions to the dryrun clientset this interface supports
func (clg *ClientBackedDryRunGetter) HandleGetAction(action core.GetAction) (bool, runtime.Object, error) { func (clg *ClientBackedDryRunGetter) HandleGetAction(action core.GetAction) (bool, runtime.Object, error) {
rc, err := clg.actionToResourceClient(action) unstructuredObj, err := clg.dynamicClient.Resource(action.GetResource()).Namespace(action.GetNamespace()).Get(action.GetName(), metav1.GetOptions{})
if err != nil { if err != nil {
return true, nil, err return true, nil, err
} }
newObj, err := decodeUnstructuredIntoAPIObject(action, unstructuredObj)
unversionedObj, err := rc.Get(action.GetName(), metav1.GetOptions{})
if err != nil { if err != nil {
return true, nil, err fmt.Printf("error after decode: %v %v\n", unstructuredObj, err)
}
// If the unversioned object does not have .apiVersion; the inner object is probably nil
if len(unversionedObj.GetAPIVersion()) == 0 {
return true, nil, apierrors.NewNotFound(action.GetResource().GroupResource(), action.GetName())
}
newObj, err := decodeUnversionedIntoAPIObject(action, unversionedObj)
if err != nil {
fmt.Printf("error after decode: %v %v\n", unversionedObj, err)
return true, nil, err return true, nil, err
} }
return true, newObj, err return true, newObj, err
@ -91,27 +85,18 @@ func (clg *ClientBackedDryRunGetter) HandleGetAction(action core.GetAction) (boo
// HandleListAction handles LIST actions to the dryrun clientset this interface supports // HandleListAction handles LIST actions to the dryrun clientset this interface supports
func (clg *ClientBackedDryRunGetter) HandleListAction(action core.ListAction) (bool, runtime.Object, error) { func (clg *ClientBackedDryRunGetter) HandleListAction(action core.ListAction) (bool, runtime.Object, error) {
rc, err := clg.actionToResourceClient(action)
if err != nil {
return true, nil, err
}
listOpts := metav1.ListOptions{ listOpts := metav1.ListOptions{
LabelSelector: action.GetListRestrictions().Labels.String(), LabelSelector: action.GetListRestrictions().Labels.String(),
FieldSelector: action.GetListRestrictions().Fields.String(), FieldSelector: action.GetListRestrictions().Fields.String(),
} }
unversionedList, err := rc.List(listOpts) unstructuredList, err := clg.dynamicClient.Resource(action.GetResource()).Namespace(action.GetNamespace()).List(listOpts)
if err != nil { if err != nil {
return true, nil, err return true, nil, err
} }
// If the runtime.Object here is nil, we should return successfully with no result newObj, err := decodeUnstructuredIntoAPIObject(action, unstructuredList)
if unversionedList == nil {
return true, unversionedList, nil
}
newObj, err := decodeUnversionedIntoAPIObject(action, unversionedList)
if err != nil { if err != nil {
fmt.Printf("error after decode: %v %v\n", unversionedList, err) fmt.Printf("error after decode: %v %v\n", unstructuredList, err)
return true, nil, err return true, nil, err
} }
return true, newObj, err return true, newObj, err
@ -122,28 +107,10 @@ func (clg *ClientBackedDryRunGetter) Client() clientset.Interface {
return clg.client return clg.client
} }
// actionToResourceClient returns the ResourceInterface for the given action
// First; the function gets the right API group interface from the resource type. The API group struct behind the interface
// returned may be cached in the dynamic client pool. Then, an APIResource object is constructed so that it can be passed to
// dynamic.Interface's Resource() function, which will give us the final ResourceInterface to query
func (clg *ClientBackedDryRunGetter) actionToResourceClient(action core.Action) (dynamic.ResourceInterface, error) {
dynIface, err := clg.dynClientPool.ClientForGroupVersionResource(action.GetResource())
if err != nil {
return nil, err
}
apiResource := &metav1.APIResource{
Name: action.GetResource().Resource,
Namespaced: action.GetNamespace() != "",
}
return dynIface.Resource(apiResource, action.GetNamespace()), nil
}
// decodeUnversionedIntoAPIObject converts the *unversioned.Unversioned object returned from the dynamic client // decodeUnversionedIntoAPIObject converts the *unversioned.Unversioned object returned from the dynamic client
// to bytes; and then decodes it back _to an external api version (k8s.io/api vs k8s.io/kubernetes/pkg/api*)_ using the normal API machinery // to bytes; and then decodes it back _to an external api version (k8s.io/api vs k8s.io/kubernetes/pkg/api*)_ using the normal API machinery
func decodeUnversionedIntoAPIObject(action core.Action, unversionedObj runtime.Object) (runtime.Object, error) { func decodeUnstructuredIntoAPIObject(action core.Action, unstructuredObj runtime.Unstructured) (runtime.Object, error) {
objBytes, err := json.Marshal(unversionedObj) objBytes, err := json.Marshal(unstructuredObj)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -122,8 +122,8 @@ func splitVersion(version string) (string, string, error) {
switch { switch {
case strings.HasPrefix(subs[0][2], "ci"): case strings.HasPrefix(subs[0][2], "ci"):
// Special case. CI images populated only by ci-cross area // Just use whichever the user specified
urlSuffix = "ci-cross" urlSuffix = subs[0][2]
default: default:
urlSuffix = "release" urlSuffix = "release"
} }

View File

@ -180,8 +180,10 @@ func TestSplitVersion(t *testing.T) {
{"release/v1.7.0", "https://dl.k8s.io/release", "v1.7.0", true}, {"release/v1.7.0", "https://dl.k8s.io/release", "v1.7.0", true},
{"release/latest-1.7", "https://dl.k8s.io/release", "latest-1.7", true}, {"release/latest-1.7", "https://dl.k8s.io/release", "latest-1.7", true},
// CI builds area, lookup actual builds at ci-cross/*.txt // CI builds area, lookup actual builds at ci-cross/*.txt
{"ci/latest", "https://dl.k8s.io/ci", "latest", true},
{"ci-cross/latest", "https://dl.k8s.io/ci-cross", "latest", true}, {"ci-cross/latest", "https://dl.k8s.io/ci-cross", "latest", true},
{"ci/latest-1.7", "https://dl.k8s.io/ci-cross", "latest-1.7", true}, {"ci/latest-1.7", "https://dl.k8s.io/ci", "latest-1.7", true},
{"ci-cross/latest-1.7", "https://dl.k8s.io/ci-cross", "latest-1.7", true},
// unknown label in default (release) area: splitVersion validate only areas. // unknown label in default (release) area: splitVersion validate only areas.
{"unknown-1", "https://dl.k8s.io/release", "unknown-1", true}, {"unknown-1", "https://dl.k8s.io/release", "unknown-1", true},
// unknown area, not valid input. // unknown area, not valid input.

View File

@ -196,7 +196,7 @@ type KubeletFlags struct {
// enable gathering custom metrics. // enable gathering custom metrics.
EnableCustomMetrics bool EnableCustomMetrics bool
// allowPrivileged enables containers to request privileged mode. // allowPrivileged enables containers to request privileged mode.
// Defaults to false. // Defaults to true.
AllowPrivileged bool AllowPrivileged bool
// hostNetworkSources is a comma-separated list of sources from which the // hostNetworkSources is a comma-separated list of sources from which the
// Kubelet allows pods to use of host network. Defaults to "*". Valid // Kubelet allows pods to use of host network. Defaults to "*". Valid
@ -244,6 +244,8 @@ func NewKubeletFlags() *KubeletFlags {
HostIPCSources: []string{kubetypes.AllSource}, HostIPCSources: []string{kubetypes.AllSource},
// TODO(#56523): default CAdvisorPort to 0 (disabled) and deprecate it // TODO(#56523): default CAdvisorPort to 0 (disabled) and deprecate it
CAdvisorPort: 4194, CAdvisorPort: 4194,
// TODO(#58010:v1.13.0): Remove --allow-privileged, it is deprecated
AllowPrivileged: true,
} }
} }
@ -416,8 +418,8 @@ func (f *KubeletFlags) AddFlags(mainfs *pflag.FlagSet) {
// TODO(#54161:v1.11.0): Remove --enable-custom-metrics flag, it is deprecated. // TODO(#54161:v1.11.0): Remove --enable-custom-metrics flag, it is deprecated.
fs.BoolVar(&f.EnableCustomMetrics, "enable-custom-metrics", f.EnableCustomMetrics, "Support for gathering custom metrics.") fs.BoolVar(&f.EnableCustomMetrics, "enable-custom-metrics", f.EnableCustomMetrics, "Support for gathering custom metrics.")
fs.MarkDeprecated("enable-custom-metrics", "will be removed in a future version") fs.MarkDeprecated("enable-custom-metrics", "will be removed in a future version")
// TODO(#58010:v1.12.0): Remove --allow-privileged, it is deprecated // TODO(#58010:v1.13.0): Remove --allow-privileged, it is deprecated
fs.BoolVar(&f.AllowPrivileged, "allow-privileged", f.AllowPrivileged, "If true, allow containers to request privileged mode.") fs.BoolVar(&f.AllowPrivileged, "allow-privileged", f.AllowPrivileged, "If true, allow containers to request privileged mode. Default: true")
fs.MarkDeprecated("allow-privileged", "will be removed in a future version") fs.MarkDeprecated("allow-privileged", "will be removed in a future version")
// TODO(#58010:v1.12.0): Remove --host-network-sources, it is deprecated // TODO(#58010:v1.12.0): Remove --host-network-sources, it is deprecated
fs.StringSliceVar(&f.HostNetworkSources, "host-network-sources", f.HostNetworkSources, "Comma-separated list of sources from which the Kubelet allows pods to use of host network.") fs.StringSliceVar(&f.HostNetworkSources, "host-network-sources", f.HostNetworkSources, "Comma-separated list of sources from which the Kubelet allows pods to use of host network.")

View File

@ -58,6 +58,7 @@ docs/admin/kubeadm_alpha_phase_selfhosting_convert-from-staticpods.md
docs/admin/kubeadm_alpha_phase_upload-config.md docs/admin/kubeadm_alpha_phase_upload-config.md
docs/admin/kubeadm_completion.md docs/admin/kubeadm_completion.md
docs/admin/kubeadm_config.md docs/admin/kubeadm_config.md
docs/admin/kubeadm_config_list-images.md
docs/admin/kubeadm_config_upload.md docs/admin/kubeadm_config_upload.md
docs/admin/kubeadm_config_upload_from-file.md docs/admin/kubeadm_config_upload_from-file.md
docs/admin/kubeadm_config_upload_from-flags.md docs/admin/kubeadm_config_upload_from-flags.md
@ -132,6 +133,7 @@ docs/man/man1/kubeadm-alpha-phase-upload-config.1
docs/man/man1/kubeadm-alpha-phase.1 docs/man/man1/kubeadm-alpha-phase.1
docs/man/man1/kubeadm-alpha.1 docs/man/man1/kubeadm-alpha.1
docs/man/man1/kubeadm-completion.1 docs/man/man1/kubeadm-completion.1
docs/man/man1/kubeadm-config-list-images.1
docs/man/man1/kubeadm-config-upload-from-file.1 docs/man/man1/kubeadm-config-upload-from-file.1
docs/man/man1/kubeadm-config-upload-from-flags.1 docs/man/man1/kubeadm-config-upload-from-flags.1
docs/man/man1/kubeadm-config-upload.1 docs/man/man1/kubeadm-config-upload.1

View File

@ -0,0 +1,3 @@
This file is autogenerated, but we've stopped checking such files into the
repository to reduce the need for rebases. Please run hack/generate-docs.sh to
populate this file.

View File

@ -403,9 +403,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
<p><a href="#_v1_node">v1.Node</a></p> <p><a href="#_v1_node">v1.Node</a></p>
</li> </li>
<li> <li>
<p><a href="#_v1_nodeconfigsource">v1.NodeConfigSource</a></p>
</li>
<li>
<p><a href="#_v1_nodelist">v1.NodeList</a></p> <p><a href="#_v1_nodelist">v1.NodeList</a></p>
</li> </li>
<li> <li>
@ -3661,6 +3658,68 @@ Examples:<br>
</tbody> </tbody>
</table> </table>
</div>
<div class="sect2">
<h3 id="_v1_configmapnodeconfigsource">v1.ConfigMapNodeConfigSource</h3>
<div class="paragraph">
<p>ConfigMapNodeConfigSource contains the information to reference a ConfigMap as a config source for the Node.</p>
</div>
<table class="tableblock frame-all grid-all" style="width:100%; ">
<colgroup>
<col style="width:20%;">
<col style="width:20%;">
<col style="width:20%;">
<col style="width:20%;">
<col style="width:20%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Name</th>
<th class="tableblock halign-left valign-top">Description</th>
<th class="tableblock halign-left valign-top">Required</th>
<th class="tableblock halign-left valign-top">Schema</th>
<th class="tableblock halign-left valign-top">Default</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">namespace</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Namespace is the metadata.namespace of the referenced ConfigMap. This field is required in all cases.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">name</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Name is the metadata.name of the referenced ConfigMap. This field is required in all cases.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">uid</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">UID is the metadata.UID of the referenced ConfigMap. This field is currently reqired in Node.Spec.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">resourceVersion</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">ResourceVersion is the metadata.ResourceVersion of the referenced ConfigMap. This field is forbidden in Node.Spec.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">kubeletConfigKey</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">KubeletConfigKey declares which key of the referenced ConfigMap corresponds to the KubeletConfiguration structure This field is required in all cases.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
</tbody>
</table>
</div> </div>
<div class="sect2"> <div class="sect2">
<h3 id="_v1_endpointport">v1.EndpointPort</h3> <h3 id="_v1_endpointport">v1.EndpointPort</h3>
@ -5830,24 +5889,10 @@ Examples:<br>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">kind</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">configMap</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: <a href="https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds">https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds</a></p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">ConfigMap is a reference to a Node&#8217;s ConfigMap</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_v1_configmapnodeconfigsource">v1.ConfigMapNodeConfigSource</a></p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">apiVersion</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: <a href="https://git.k8s.io/community/contributors/devel/api-conventions.md#resources">https://git.k8s.io/community/contributors/devel/api-conventions.md#resources</a></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">configMapRef</p></td>
<td class="tableblock halign-left valign-top"></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#_v1_objectreference">v1.ObjectReference</a></p></td>
<td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td>
</tr> </tr>
</tbody> </tbody>

View File

@ -0,0 +1,3 @@
This file is autogenerated, but we've stopped checking such files into the
repository to reduce the need for rebases. Please run hack/generate-docs.sh to
populate this file.

View File

@ -1,3 +1,4 @@
cluster/images/etcd-version-monitor cluster/images/etcd-version-monitor
cmd/hyperkube cmd/hyperkube
cmd/kube-apiserver/app cmd/kube-apiserver/app
@ -134,7 +135,6 @@ pkg/kubeapiserver/authorizer/modes
pkg/kubeapiserver/options pkg/kubeapiserver/options
pkg/kubeapiserver/server pkg/kubeapiserver/server
pkg/kubectl pkg/kubectl
pkg/kubectl/categories
pkg/kubectl/cmd pkg/kubectl/cmd
pkg/kubectl/cmd/auth pkg/kubectl/cmd/auth
pkg/kubectl/cmd/config pkg/kubectl/cmd/config
@ -148,8 +148,8 @@ pkg/kubectl/cmd/util
pkg/kubectl/cmd/util/editor pkg/kubectl/cmd/util/editor
pkg/kubectl/cmd/util/jsonmerge pkg/kubectl/cmd/util/jsonmerge
pkg/kubectl/cmd/util/sanity pkg/kubectl/cmd/util/sanity
pkg/kubectl/genericclioptions/resource
pkg/kubectl/metricsutil pkg/kubectl/metricsutil
pkg/kubectl/resource
pkg/kubectl/util pkg/kubectl/util
pkg/kubectl/util/crlf pkg/kubectl/util/crlf
pkg/kubectl/util/slice pkg/kubectl/util/slice
@ -461,8 +461,6 @@ staging/src/k8s.io/apimachinery/pkg/api/testing/fuzzer
staging/src/k8s.io/apimachinery/pkg/api/testing/roundtrip staging/src/k8s.io/apimachinery/pkg/api/testing/roundtrip
staging/src/k8s.io/apimachinery/pkg/api/validation staging/src/k8s.io/apimachinery/pkg/api/validation
staging/src/k8s.io/apimachinery/pkg/api/validation/path staging/src/k8s.io/apimachinery/pkg/api/validation/path
staging/src/k8s.io/apimachinery/pkg/apimachinery/announced
staging/src/k8s.io/apimachinery/pkg/apimachinery/registered
staging/src/k8s.io/apimachinery/pkg/apis/meta/fuzzer staging/src/k8s.io/apimachinery/pkg/apis/meta/fuzzer
staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion staging/src/k8s.io/apimachinery/pkg/apis/meta/internalversion
staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured
@ -698,6 +696,7 @@ test/e2e/ui
test/e2e/upgrades test/e2e/upgrades
test/e2e/upgrades/apps test/e2e/upgrades/apps
test/e2e/upgrades/storage test/e2e/upgrades/storage
test/e2e_kubeadm
test/e2e_node test/e2e_node
test/e2e_node/builder test/e2e_node/builder
test/e2e_node/environment test/e2e_node/environment

View File

@ -20,6 +20,9 @@
- baseImportPath: "./pkg/kubectl/genericclioptions/" - baseImportPath: "./pkg/kubectl/genericclioptions/"
allowedImports: allowedImports:
- k8s.io/apimachinery - k8s.io/apimachinery
- k8s.io/client-go
# TODO this one should be tightened. We depend on it for testing, but we should instead create our own scheme
- k8s.io/api/core/v1
- baseImportPath: "./vendor/k8s.io/apimachinery/" - baseImportPath: "./vendor/k8s.io/apimachinery/"
allowedImports: allowedImports:

View File

@ -57,6 +57,7 @@ kube::test::find_dirs() {
-o -path './target/*' \ -o -path './target/*' \
-o -path './test/e2e/*' \ -o -path './test/e2e/*' \
-o -path './test/e2e_node/*' \ -o -path './test/e2e_node/*' \
-o -path './test/e2e_kubeadm/*' \
-o -path './test/integration/*' \ -o -path './test/integration/*' \
-o -path './third_party/*' \ -o -path './third_party/*' \
-o -path './staging/*' \ -o -path './staging/*' \

View File

@ -19,7 +19,7 @@ set -o nounset
set -o pipefail set -o pipefail
if [[ $# -ne 1 ]]; then if [[ $# -ne 1 ]]; then
echo 'use "bazel run //build:update-mirror"' echo 'use "bazel run //hack:update-mirror"'
echo "(usage: $0 <file with list of URLs to mirror>)" echo "(usage: $0 <file with list of URLs to mirror>)"
exit 1 exit 1
fi fi

View File

@ -6,7 +6,6 @@ go_library(
importpath = "k8s.io/kubernetes/pkg/api/legacyscheme", importpath = "k8s.io/kubernetes/pkg/api/legacyscheme",
visibility = ["//visibility:public"], visibility = ["//visibility:public"],
deps = [ deps = [
"//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library",
], ],

View File

@ -17,15 +17,10 @@ limitations under the License.
package legacyscheme package legacyscheme
import ( import (
"k8s.io/apimachinery/pkg/apimachinery/registered"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/apimachinery/pkg/runtime/serializer"
) )
// Registry is an instance of an API registry. This is an interim step to start removing the idea of a global
// API registry.
var Registry = registered.NewAPIRegistrationManager()
// Scheme is the default instance of runtime.Scheme to which types in the Kubernetes API are already registered. // Scheme is the default instance of runtime.Scheme to which types in the Kubernetes API are already registered.
// NOTE: If you are copying this file to start a new api group, STOP! Copy the // NOTE: If you are copying this file to start a new api group, STOP! Copy the
// extensions group instead. This Scheme is special and should appear ONLY in // extensions group instead. This Scheme is special and should appear ONLY in

View File

@ -136,13 +136,13 @@ func init() {
} }
if _, ok := Groups[api.GroupName]; !ok { if _, ok := Groups[api.GroupName]; !ok {
externalGroupVersion := schema.GroupVersion{Group: api.GroupName, Version: legacyscheme.Registry.GroupOrDie(api.GroupName).GroupVersions[0].Version} externalGroupVersion := schema.GroupVersion{Group: api.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(api.GroupName)[0].Version}
Groups[api.GroupName] = TestGroup{ Groups[api.GroupName] = TestGroup{
externalGroupVersion: externalGroupVersion, externalGroupVersion: externalGroupVersion,
} }
} }
if _, ok := Groups[extensions.GroupName]; !ok { if _, ok := Groups[extensions.GroupName]; !ok {
externalGroupVersion := schema.GroupVersion{Group: extensions.GroupName, Version: legacyscheme.Registry.GroupOrDie(extensions.GroupName).GroupVersions[0].Version} externalGroupVersion := schema.GroupVersion{Group: extensions.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(extensions.GroupName)[0].Version}
Groups[extensions.GroupName] = TestGroup{ Groups[extensions.GroupName] = TestGroup{
externalGroupVersion: externalGroupVersion, externalGroupVersion: externalGroupVersion,
} }
@ -155,7 +155,7 @@ func init() {
} }
internalTypes[k] = t internalTypes[k] = t
} }
externalGroupVersion := schema.GroupVersion{Group: autoscaling.GroupName, Version: legacyscheme.Registry.GroupOrDie(autoscaling.GroupName).GroupVersions[0].Version} externalGroupVersion := schema.GroupVersion{Group: autoscaling.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(autoscaling.GroupName)[0].Version}
Groups[autoscaling.GroupName] = TestGroup{ Groups[autoscaling.GroupName] = TestGroup{
externalGroupVersion: externalGroupVersion, externalGroupVersion: externalGroupVersion,
} }
@ -168,91 +168,91 @@ func init() {
break break
} }
} }
externalGroupVersion := schema.GroupVersion{Group: autoscaling.GroupName, Version: legacyscheme.Registry.GroupOrDie(autoscaling.GroupName).GroupVersions[0].Version} externalGroupVersion := schema.GroupVersion{Group: autoscaling.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(autoscaling.GroupName)[0].Version}
Groups[autoscaling.GroupName] = TestGroup{ Groups[autoscaling.GroupName] = TestGroup{
externalGroupVersion: externalGroupVersion, externalGroupVersion: externalGroupVersion,
} }
} }
if _, ok := Groups[batch.GroupName]; !ok { if _, ok := Groups[batch.GroupName]; !ok {
externalGroupVersion := schema.GroupVersion{Group: batch.GroupName, Version: legacyscheme.Registry.GroupOrDie(batch.GroupName).GroupVersions[0].Version} externalGroupVersion := schema.GroupVersion{Group: batch.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(batch.GroupName)[0].Version}
Groups[batch.GroupName] = TestGroup{ Groups[batch.GroupName] = TestGroup{
externalGroupVersion: externalGroupVersion, externalGroupVersion: externalGroupVersion,
} }
} }
if _, ok := Groups[apps.GroupName]; !ok { if _, ok := Groups[apps.GroupName]; !ok {
externalGroupVersion := schema.GroupVersion{Group: apps.GroupName, Version: legacyscheme.Registry.GroupOrDie(apps.GroupName).GroupVersions[0].Version} externalGroupVersion := schema.GroupVersion{Group: apps.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(apps.GroupName)[0].Version}
Groups[apps.GroupName] = TestGroup{ Groups[apps.GroupName] = TestGroup{
externalGroupVersion: externalGroupVersion, externalGroupVersion: externalGroupVersion,
} }
} }
if _, ok := Groups[policy.GroupName]; !ok { if _, ok := Groups[policy.GroupName]; !ok {
externalGroupVersion := schema.GroupVersion{Group: policy.GroupName, Version: legacyscheme.Registry.GroupOrDie(policy.GroupName).GroupVersions[0].Version} externalGroupVersion := schema.GroupVersion{Group: policy.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(policy.GroupName)[0].Version}
Groups[policy.GroupName] = TestGroup{ Groups[policy.GroupName] = TestGroup{
externalGroupVersion: externalGroupVersion, externalGroupVersion: externalGroupVersion,
} }
} }
if _, ok := Groups[rbac.GroupName]; !ok { if _, ok := Groups[rbac.GroupName]; !ok {
externalGroupVersion := schema.GroupVersion{Group: rbac.GroupName, Version: legacyscheme.Registry.GroupOrDie(rbac.GroupName).GroupVersions[0].Version} externalGroupVersion := schema.GroupVersion{Group: rbac.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(rbac.GroupName)[0].Version}
Groups[rbac.GroupName] = TestGroup{ Groups[rbac.GroupName] = TestGroup{
externalGroupVersion: externalGroupVersion, externalGroupVersion: externalGroupVersion,
} }
} }
if _, ok := Groups[scheduling.GroupName]; !ok { if _, ok := Groups[scheduling.GroupName]; !ok {
externalGroupVersion := schema.GroupVersion{Group: scheduling.GroupName, Version: legacyscheme.Registry.GroupOrDie(scheduling.GroupName).GroupVersions[0].Version} externalGroupVersion := schema.GroupVersion{Group: scheduling.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(scheduling.GroupName)[0].Version}
Groups[scheduling.GroupName] = TestGroup{ Groups[scheduling.GroupName] = TestGroup{
externalGroupVersion: externalGroupVersion, externalGroupVersion: externalGroupVersion,
} }
} }
if _, ok := Groups[settings.GroupName]; !ok { if _, ok := Groups[settings.GroupName]; !ok {
externalGroupVersion := schema.GroupVersion{Group: settings.GroupName, Version: legacyscheme.Registry.GroupOrDie(settings.GroupName).GroupVersions[0].Version} externalGroupVersion := schema.GroupVersion{Group: settings.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(settings.GroupName)[0].Version}
Groups[settings.GroupName] = TestGroup{ Groups[settings.GroupName] = TestGroup{
externalGroupVersion: externalGroupVersion, externalGroupVersion: externalGroupVersion,
} }
} }
if _, ok := Groups[storage.GroupName]; !ok { if _, ok := Groups[storage.GroupName]; !ok {
externalGroupVersion := schema.GroupVersion{Group: storage.GroupName, Version: legacyscheme.Registry.GroupOrDie(storage.GroupName).GroupVersions[0].Version} externalGroupVersion := schema.GroupVersion{Group: storage.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(storage.GroupName)[0].Version}
Groups[storage.GroupName] = TestGroup{ Groups[storage.GroupName] = TestGroup{
externalGroupVersion: externalGroupVersion, externalGroupVersion: externalGroupVersion,
} }
} }
if _, ok := Groups[certificates.GroupName]; !ok { if _, ok := Groups[certificates.GroupName]; !ok {
externalGroupVersion := schema.GroupVersion{Group: certificates.GroupName, Version: legacyscheme.Registry.GroupOrDie(certificates.GroupName).GroupVersions[0].Version} externalGroupVersion := schema.GroupVersion{Group: certificates.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(certificates.GroupName)[0].Version}
Groups[certificates.GroupName] = TestGroup{ Groups[certificates.GroupName] = TestGroup{
externalGroupVersion: externalGroupVersion, externalGroupVersion: externalGroupVersion,
} }
} }
if _, ok := Groups[imagepolicy.GroupName]; !ok { if _, ok := Groups[imagepolicy.GroupName]; !ok {
externalGroupVersion := schema.GroupVersion{Group: imagepolicy.GroupName, Version: legacyscheme.Registry.GroupOrDie(imagepolicy.GroupName).GroupVersions[0].Version} externalGroupVersion := schema.GroupVersion{Group: imagepolicy.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(imagepolicy.GroupName)[0].Version}
Groups[imagepolicy.GroupName] = TestGroup{ Groups[imagepolicy.GroupName] = TestGroup{
externalGroupVersion: externalGroupVersion, externalGroupVersion: externalGroupVersion,
} }
} }
if _, ok := Groups[authorization.GroupName]; !ok { if _, ok := Groups[authorization.GroupName]; !ok {
externalGroupVersion := schema.GroupVersion{Group: authorization.GroupName, Version: legacyscheme.Registry.GroupOrDie(authorization.GroupName).GroupVersions[0].Version} externalGroupVersion := schema.GroupVersion{Group: authorization.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(authorization.GroupName)[0].Version}
Groups[authorization.GroupName] = TestGroup{ Groups[authorization.GroupName] = TestGroup{
externalGroupVersion: externalGroupVersion, externalGroupVersion: externalGroupVersion,
} }
} }
if _, ok := Groups[admissionregistration.GroupName]; !ok { if _, ok := Groups[admissionregistration.GroupName]; !ok {
externalGroupVersion := schema.GroupVersion{Group: admissionregistration.GroupName, Version: legacyscheme.Registry.GroupOrDie(admissionregistration.GroupName).GroupVersions[0].Version} externalGroupVersion := schema.GroupVersion{Group: admissionregistration.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(admissionregistration.GroupName)[0].Version}
Groups[admissionregistration.GroupName] = TestGroup{ Groups[admissionregistration.GroupName] = TestGroup{
externalGroupVersion: externalGroupVersion, externalGroupVersion: externalGroupVersion,
} }
} }
if _, ok := Groups[admission.GroupName]; !ok { if _, ok := Groups[admission.GroupName]; !ok {
externalGroupVersion := schema.GroupVersion{Group: admission.GroupName, Version: legacyscheme.Registry.GroupOrDie(admission.GroupName).GroupVersions[0].Version} externalGroupVersion := schema.GroupVersion{Group: admission.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(admission.GroupName)[0].Version}
Groups[admission.GroupName] = TestGroup{ Groups[admission.GroupName] = TestGroup{
externalGroupVersion: externalGroupVersion, externalGroupVersion: externalGroupVersion,
} }
} }
if _, ok := Groups[networking.GroupName]; !ok { if _, ok := Groups[networking.GroupName]; !ok {
externalGroupVersion := schema.GroupVersion{Group: networking.GroupName, Version: legacyscheme.Registry.GroupOrDie(networking.GroupName).GroupVersions[0].Version} externalGroupVersion := schema.GroupVersion{Group: networking.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(networking.GroupName)[0].Version}
Groups[networking.GroupName] = TestGroup{ Groups[networking.GroupName] = TestGroup{
externalGroupVersion: externalGroupVersion, externalGroupVersion: externalGroupVersion,
} }
} }
if _, ok := Groups[events.GroupName]; !ok { if _, ok := Groups[events.GroupName]; !ok {
externalGroupVersion := schema.GroupVersion{Group: events.GroupName, Version: legacyscheme.Registry.GroupOrDie(events.GroupName).GroupVersions[0].Version} externalGroupVersion := schema.GroupVersion{Group: events.GroupName, Version: legacyscheme.Scheme.PrioritizedVersionsForGroup(events.GroupName)[0].Version}
Groups[events.GroupName] = TestGroup{ Groups[events.GroupName] = TestGroup{
externalGroupVersion: externalGroupVersion, externalGroupVersion: externalGroupVersion,
} }

View File

@ -30,7 +30,7 @@ import (
var _ metav1.Object = &metav1.ObjectMeta{} var _ metav1.Object = &metav1.ObjectMeta{}
func TestAccessorImplementations(t *testing.T) { func TestAccessorImplementations(t *testing.T) {
for _, gv := range legacyscheme.Registry.RegisteredGroupVersions() { for _, gv := range legacyscheme.Scheme.PrioritizedVersionsAllGroups() {
internalGV := schema.GroupVersion{Group: gv.Group, Version: runtime.APIVersionInternal} internalGV := schema.GroupVersion{Group: gv.Group, Version: runtime.APIVersionInternal}
for _, gv := range []schema.GroupVersion{gv, internalGV} { for _, gv := range []schema.GroupVersion{gv, internalGV} {
for kind, knownType := range legacyscheme.Scheme.KnownTypes(gv) { for kind, knownType := range legacyscheme.Scheme.KnownTypes(gv) {

View File

@ -13,9 +13,8 @@ go_library(
"//pkg/api/legacyscheme:go_default_library", "//pkg/api/legacyscheme:go_default_library",
"//pkg/apis/admission:go_default_library", "//pkg/apis/admission:go_default_library",
"//pkg/apis/admission/v1beta1:go_default_library", "//pkg/apis/admission/v1beta1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
], ],
) )

View File

@ -19,30 +19,20 @@ limitations under the License.
package install package install
import ( import (
"k8s.io/apimachinery/pkg/apimachinery/announced"
"k8s.io/apimachinery/pkg/apimachinery/registered"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/legacyscheme"
"k8s.io/kubernetes/pkg/apis/admission" "k8s.io/kubernetes/pkg/apis/admission"
"k8s.io/kubernetes/pkg/apis/admission/v1beta1" "k8s.io/kubernetes/pkg/apis/admission/v1beta1"
) )
func init() { func init() {
Install(legacyscheme.Registry, legacyscheme.Scheme) Install(legacyscheme.Scheme)
} }
// Install registers the API group and adds types to a scheme // Install registers the API group and adds types to a scheme
func Install(registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { func Install(scheme *runtime.Scheme) {
if err := announced.NewGroupMetaFactory( utilruntime.Must(admission.AddToScheme(scheme))
&announced.GroupMetaFactoryArgs{ utilruntime.Must(v1beta1.AddToScheme(scheme))
GroupName: admission.GroupName, utilruntime.Must(scheme.SetVersionPriority(v1beta1.SchemeGroupVersion))
VersionPreferenceOrder: []string{v1beta1.SchemeGroupVersion.Version},
AddInternalObjectsToScheme: admission.AddToScheme,
},
announced.VersionToSchemeFunc{
v1beta1.SchemeGroupVersion.Version: v1beta1.AddToScheme,
},
).Register(registry, scheme); err != nil {
panic(err)
}
} }

View File

@ -14,9 +14,8 @@ go_library(
"//pkg/apis/admissionregistration:go_default_library", "//pkg/apis/admissionregistration:go_default_library",
"//pkg/apis/admissionregistration/v1alpha1:go_default_library", "//pkg/apis/admissionregistration/v1alpha1:go_default_library",
"//pkg/apis/admissionregistration/v1beta1:go_default_library", "//pkg/apis/admissionregistration/v1beta1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
], ],
) )

View File

@ -17,9 +17,8 @@ limitations under the License.
package install package install
import ( import (
"k8s.io/apimachinery/pkg/apimachinery/announced"
"k8s.io/apimachinery/pkg/apimachinery/registered"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/legacyscheme"
"k8s.io/kubernetes/pkg/apis/admissionregistration" "k8s.io/kubernetes/pkg/apis/admissionregistration"
"k8s.io/kubernetes/pkg/apis/admissionregistration/v1alpha1" "k8s.io/kubernetes/pkg/apis/admissionregistration/v1alpha1"
@ -27,22 +26,13 @@ import (
) )
func init() { func init() {
Install(legacyscheme.Registry, legacyscheme.Scheme) Install(legacyscheme.Scheme)
} }
// Install registers the API group and adds types to a scheme // Install registers the API group and adds types to a scheme
func Install(registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { func Install(scheme *runtime.Scheme) {
if err := announced.NewGroupMetaFactory( utilruntime.Must(admissionregistration.AddToScheme(scheme))
&announced.GroupMetaFactoryArgs{ utilruntime.Must(v1alpha1.AddToScheme(scheme))
GroupName: admissionregistration.GroupName, utilruntime.Must(v1beta1.AddToScheme(scheme))
VersionPreferenceOrder: []string{v1beta1.SchemeGroupVersion.Version, v1alpha1.SchemeGroupVersion.Version}, utilruntime.Must(scheme.SetVersionPriority(v1beta1.SchemeGroupVersion, v1alpha1.SchemeGroupVersion))
AddInternalObjectsToScheme: admissionregistration.AddToScheme,
},
announced.VersionToSchemeFunc{
v1alpha1.SchemeGroupVersion.Version: v1alpha1.AddToScheme,
v1beta1.SchemeGroupVersion.Version: v1beta1.AddToScheme,
},
).Register(registry, scheme); err != nil {
panic(err)
}
} }

View File

@ -15,9 +15,8 @@ go_library(
"//pkg/apis/apps/v1:go_default_library", "//pkg/apis/apps/v1:go_default_library",
"//pkg/apis/apps/v1beta1:go_default_library", "//pkg/apis/apps/v1beta1:go_default_library",
"//pkg/apis/apps/v1beta2:go_default_library", "//pkg/apis/apps/v1beta2:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
], ],
) )

View File

@ -19,9 +19,8 @@ limitations under the License.
package install package install
import ( import (
"k8s.io/apimachinery/pkg/apimachinery/announced"
"k8s.io/apimachinery/pkg/apimachinery/registered"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/legacyscheme"
"k8s.io/kubernetes/pkg/apis/apps" "k8s.io/kubernetes/pkg/apis/apps"
"k8s.io/kubernetes/pkg/apis/apps/v1" "k8s.io/kubernetes/pkg/apis/apps/v1"
@ -30,23 +29,14 @@ import (
) )
func init() { func init() {
Install(legacyscheme.Registry, legacyscheme.Scheme) Install(legacyscheme.Scheme)
} }
// Install registers the API group and adds types to a scheme // Install registers the API group and adds types to a scheme
func Install(registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { func Install(scheme *runtime.Scheme) {
if err := announced.NewGroupMetaFactory( utilruntime.Must(apps.AddToScheme(scheme))
&announced.GroupMetaFactoryArgs{ utilruntime.Must(v1beta1.AddToScheme(scheme))
GroupName: apps.GroupName, utilruntime.Must(v1beta2.AddToScheme(scheme))
VersionPreferenceOrder: []string{v1.SchemeGroupVersion.Version, v1beta2.SchemeGroupVersion.Version, v1beta1.SchemeGroupVersion.Version}, utilruntime.Must(v1.AddToScheme(scheme))
AddInternalObjectsToScheme: apps.AddToScheme, utilruntime.Must(scheme.SetVersionPriority(v1.SchemeGroupVersion, v1beta2.SchemeGroupVersion, v1beta1.SchemeGroupVersion))
},
announced.VersionToSchemeFunc{
v1beta1.SchemeGroupVersion.Version: v1beta1.AddToScheme,
v1beta2.SchemeGroupVersion.Version: v1beta2.AddToScheme,
v1.SchemeGroupVersion.Version: v1.AddToScheme,
},
).Register(registry, scheme); err != nil {
panic(err)
}
} }

View File

@ -14,9 +14,8 @@ go_library(
"//pkg/apis/authentication:go_default_library", "//pkg/apis/authentication:go_default_library",
"//pkg/apis/authentication/v1:go_default_library", "//pkg/apis/authentication/v1:go_default_library",
"//pkg/apis/authentication/v1beta1:go_default_library", "//pkg/apis/authentication/v1beta1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
], ],
) )

View File

@ -19,9 +19,8 @@ limitations under the License.
package install package install
import ( import (
"k8s.io/apimachinery/pkg/apimachinery/announced"
"k8s.io/apimachinery/pkg/apimachinery/registered"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/legacyscheme"
"k8s.io/kubernetes/pkg/apis/authentication" "k8s.io/kubernetes/pkg/apis/authentication"
"k8s.io/kubernetes/pkg/apis/authentication/v1" "k8s.io/kubernetes/pkg/apis/authentication/v1"
@ -29,22 +28,13 @@ import (
) )
func init() { func init() {
Install(legacyscheme.Registry, legacyscheme.Scheme) Install(legacyscheme.Scheme)
} }
// Install registers the API group and adds types to a scheme // Install registers the API group and adds types to a scheme
func Install(registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { func Install(scheme *runtime.Scheme) {
if err := announced.NewGroupMetaFactory( utilruntime.Must(authentication.AddToScheme(scheme))
&announced.GroupMetaFactoryArgs{ utilruntime.Must(v1beta1.AddToScheme(scheme))
GroupName: authentication.GroupName, utilruntime.Must(v1.AddToScheme(scheme))
VersionPreferenceOrder: []string{v1.SchemeGroupVersion.Version, v1beta1.SchemeGroupVersion.Version}, utilruntime.Must(scheme.SetVersionPriority(v1.SchemeGroupVersion, v1beta1.SchemeGroupVersion))
AddInternalObjectsToScheme: authentication.AddToScheme,
},
announced.VersionToSchemeFunc{
v1beta1.SchemeGroupVersion.Version: v1beta1.AddToScheme,
v1.SchemeGroupVersion.Version: v1.AddToScheme,
},
).Register(registry, scheme); err != nil {
panic(err)
}
} }

View File

@ -14,9 +14,8 @@ go_library(
"//pkg/apis/authorization:go_default_library", "//pkg/apis/authorization:go_default_library",
"//pkg/apis/authorization/v1:go_default_library", "//pkg/apis/authorization/v1:go_default_library",
"//pkg/apis/authorization/v1beta1:go_default_library", "//pkg/apis/authorization/v1beta1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
], ],
) )

View File

@ -19,9 +19,8 @@ limitations under the License.
package install package install
import ( import (
"k8s.io/apimachinery/pkg/apimachinery/announced"
"k8s.io/apimachinery/pkg/apimachinery/registered"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/legacyscheme"
"k8s.io/kubernetes/pkg/apis/authorization" "k8s.io/kubernetes/pkg/apis/authorization"
"k8s.io/kubernetes/pkg/apis/authorization/v1" "k8s.io/kubernetes/pkg/apis/authorization/v1"
@ -29,22 +28,13 @@ import (
) )
func init() { func init() {
Install(legacyscheme.Registry, legacyscheme.Scheme) Install(legacyscheme.Scheme)
} }
// Install registers the API group and adds types to a scheme // Install registers the API group and adds types to a scheme
func Install(registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { func Install(scheme *runtime.Scheme) {
if err := announced.NewGroupMetaFactory( utilruntime.Must(authorization.AddToScheme(scheme))
&announced.GroupMetaFactoryArgs{ utilruntime.Must(v1beta1.AddToScheme(scheme))
GroupName: authorization.GroupName, utilruntime.Must(v1.AddToScheme(scheme))
VersionPreferenceOrder: []string{v1.SchemeGroupVersion.Version, v1beta1.SchemeGroupVersion.Version}, utilruntime.Must(scheme.SetVersionPriority(v1.SchemeGroupVersion, v1beta1.SchemeGroupVersion))
AddInternalObjectsToScheme: authorization.AddToScheme,
},
announced.VersionToSchemeFunc{
v1beta1.SchemeGroupVersion.Version: v1beta1.AddToScheme,
v1.SchemeGroupVersion.Version: v1.AddToScheme,
},
).Register(registry, scheme); err != nil {
panic(err)
}
} }

View File

@ -14,9 +14,8 @@ go_library(
"//pkg/apis/autoscaling:go_default_library", "//pkg/apis/autoscaling:go_default_library",
"//pkg/apis/autoscaling/v1:go_default_library", "//pkg/apis/autoscaling/v1:go_default_library",
"//pkg/apis/autoscaling/v2beta1:go_default_library", "//pkg/apis/autoscaling/v2beta1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
], ],
) )

View File

@ -19,9 +19,8 @@ limitations under the License.
package install package install
import ( import (
"k8s.io/apimachinery/pkg/apimachinery/announced"
"k8s.io/apimachinery/pkg/apimachinery/registered"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/legacyscheme"
"k8s.io/kubernetes/pkg/apis/autoscaling" "k8s.io/kubernetes/pkg/apis/autoscaling"
"k8s.io/kubernetes/pkg/apis/autoscaling/v1" "k8s.io/kubernetes/pkg/apis/autoscaling/v1"
@ -29,22 +28,13 @@ import (
) )
func init() { func init() {
Install(legacyscheme.Registry, legacyscheme.Scheme) Install(legacyscheme.Scheme)
} }
// Install registers the API group and adds types to a scheme // Install registers the API group and adds types to a scheme
func Install(registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { func Install(scheme *runtime.Scheme) {
if err := announced.NewGroupMetaFactory( utilruntime.Must(autoscaling.AddToScheme(scheme))
&announced.GroupMetaFactoryArgs{ utilruntime.Must(v2beta1.AddToScheme(scheme))
GroupName: autoscaling.GroupName, utilruntime.Must(v1.AddToScheme(scheme))
VersionPreferenceOrder: []string{v1.SchemeGroupVersion.Version, v2beta1.SchemeGroupVersion.Version}, utilruntime.Must(scheme.SetVersionPriority(v1.SchemeGroupVersion, v2beta1.SchemeGroupVersion))
AddInternalObjectsToScheme: autoscaling.AddToScheme,
},
announced.VersionToSchemeFunc{
v1.SchemeGroupVersion.Version: v1.AddToScheme,
v2beta1.SchemeGroupVersion.Version: v2beta1.AddToScheme,
},
).Register(registry, scheme); err != nil {
panic(err)
}
} }

View File

@ -15,9 +15,8 @@ go_library(
"//pkg/apis/batch/v1:go_default_library", "//pkg/apis/batch/v1:go_default_library",
"//pkg/apis/batch/v1beta1:go_default_library", "//pkg/apis/batch/v1beta1:go_default_library",
"//pkg/apis/batch/v2alpha1:go_default_library", "//pkg/apis/batch/v2alpha1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
], ],
) )

View File

@ -19,9 +19,8 @@ limitations under the License.
package install package install
import ( import (
"k8s.io/apimachinery/pkg/apimachinery/announced"
"k8s.io/apimachinery/pkg/apimachinery/registered"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/legacyscheme"
"k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/batch"
"k8s.io/kubernetes/pkg/apis/batch/v1" "k8s.io/kubernetes/pkg/apis/batch/v1"
@ -30,23 +29,14 @@ import (
) )
func init() { func init() {
Install(legacyscheme.Registry, legacyscheme.Scheme) Install(legacyscheme.Scheme)
} }
// Install registers the API group and adds types to a scheme // Install registers the API group and adds types to a scheme
func Install(registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { func Install(scheme *runtime.Scheme) {
if err := announced.NewGroupMetaFactory( utilruntime.Must(batch.AddToScheme(scheme))
&announced.GroupMetaFactoryArgs{ utilruntime.Must(v1.AddToScheme(scheme))
GroupName: batch.GroupName, utilruntime.Must(v1beta1.AddToScheme(scheme))
VersionPreferenceOrder: []string{v1.SchemeGroupVersion.Version, v1beta1.SchemeGroupVersion.Version, v2alpha1.SchemeGroupVersion.Version}, utilruntime.Must(v2alpha1.AddToScheme(scheme))
AddInternalObjectsToScheme: batch.AddToScheme, utilruntime.Must(scheme.SetVersionPriority(v1.SchemeGroupVersion, v1beta1.SchemeGroupVersion, v2alpha1.SchemeGroupVersion))
},
announced.VersionToSchemeFunc{
v1.SchemeGroupVersion.Version: v1.AddToScheme,
v1beta1.SchemeGroupVersion.Version: v1beta1.AddToScheme,
v2alpha1.SchemeGroupVersion.Version: v2alpha1.AddToScheme,
},
).Register(registry, scheme); err != nil {
panic(err)
}
} }

View File

@ -13,9 +13,8 @@ go_library(
"//pkg/api/legacyscheme:go_default_library", "//pkg/api/legacyscheme:go_default_library",
"//pkg/apis/certificates:go_default_library", "//pkg/apis/certificates:go_default_library",
"//pkg/apis/certificates/v1beta1:go_default_library", "//pkg/apis/certificates/v1beta1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
], ],
) )

View File

@ -19,30 +19,20 @@ limitations under the License.
package install package install
import ( import (
"k8s.io/apimachinery/pkg/apimachinery/announced"
"k8s.io/apimachinery/pkg/apimachinery/registered"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/legacyscheme"
"k8s.io/kubernetes/pkg/apis/certificates" "k8s.io/kubernetes/pkg/apis/certificates"
"k8s.io/kubernetes/pkg/apis/certificates/v1beta1" "k8s.io/kubernetes/pkg/apis/certificates/v1beta1"
) )
func init() { func init() {
Install(legacyscheme.Registry, legacyscheme.Scheme) Install(legacyscheme.Scheme)
} }
// Install registers the API group and adds types to a scheme // Install registers the API group and adds types to a scheme
func Install(registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { func Install(scheme *runtime.Scheme) {
if err := announced.NewGroupMetaFactory( utilruntime.Must(certificates.AddToScheme(scheme))
&announced.GroupMetaFactoryArgs{ utilruntime.Must(v1beta1.AddToScheme(scheme))
GroupName: certificates.GroupName, utilruntime.Must(scheme.SetVersionPriority(v1beta1.SchemeGroupVersion))
VersionPreferenceOrder: []string{v1beta1.SchemeGroupVersion.Version},
AddInternalObjectsToScheme: certificates.AddToScheme,
},
announced.VersionToSchemeFunc{
v1beta1.SchemeGroupVersion.Version: v1beta1.AddToScheme,
},
).Register(registry, scheme); err != nil {
panic(err)
}
} }

View File

@ -13,9 +13,8 @@ go_library(
"//pkg/api/legacyscheme:go_default_library", "//pkg/api/legacyscheme:go_default_library",
"//pkg/apis/componentconfig:go_default_library", "//pkg/apis/componentconfig:go_default_library",
"//pkg/apis/componentconfig/v1alpha1:go_default_library", "//pkg/apis/componentconfig/v1alpha1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
], ],
) )

View File

@ -19,30 +19,20 @@ limitations under the License.
package install package install
import ( import (
"k8s.io/apimachinery/pkg/apimachinery/announced"
"k8s.io/apimachinery/pkg/apimachinery/registered"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/legacyscheme"
"k8s.io/kubernetes/pkg/apis/componentconfig" "k8s.io/kubernetes/pkg/apis/componentconfig"
"k8s.io/kubernetes/pkg/apis/componentconfig/v1alpha1" "k8s.io/kubernetes/pkg/apis/componentconfig/v1alpha1"
) )
func init() { func init() {
Install(legacyscheme.Registry, legacyscheme.Scheme) Install(legacyscheme.Scheme)
} }
// Install registers the API group and adds types to a scheme // Install registers the API group and adds types to a scheme
func Install(registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { func Install(scheme *runtime.Scheme) {
if err := announced.NewGroupMetaFactory( utilruntime.Must(componentconfig.AddToScheme(scheme))
&announced.GroupMetaFactoryArgs{ utilruntime.Must(v1alpha1.AddToScheme(scheme))
GroupName: componentconfig.GroupName, utilruntime.Must(scheme.SetVersionPriority(v1alpha1.SchemeGroupVersion))
VersionPreferenceOrder: []string{v1alpha1.SchemeGroupVersion.Version},
AddInternalObjectsToScheme: componentconfig.AddToScheme,
},
announced.VersionToSchemeFunc{
v1alpha1.SchemeGroupVersion.Version: v1alpha1.AddToScheme,
},
).Register(registry, scheme); err != nil {
panic(err)
}
} }

View File

@ -14,9 +14,8 @@ go_library(
"//pkg/api/legacyscheme:go_default_library", "//pkg/api/legacyscheme:go_default_library",
"//pkg/apis/core:go_default_library", "//pkg/apis/core:go_default_library",
"//pkg/apis/core/v1:go_default_library", "//pkg/apis/core/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apimachinery/announced:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/apimachinery/registered:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
], ],
) )

View File

@ -19,30 +19,20 @@ limitations under the License.
package install package install
import ( import (
"k8s.io/apimachinery/pkg/apimachinery/announced"
"k8s.io/apimachinery/pkg/apimachinery/registered"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/legacyscheme"
"k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/core"
"k8s.io/kubernetes/pkg/apis/core/v1" "k8s.io/kubernetes/pkg/apis/core/v1"
) )
func init() { func init() {
Install(legacyscheme.Registry, legacyscheme.Scheme) Install(legacyscheme.Scheme)
} }
// Install registers the API group and adds types to a scheme // Install registers the API group and adds types to a scheme
func Install(registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { func Install(scheme *runtime.Scheme) {
if err := announced.NewGroupMetaFactory( utilruntime.Must(core.AddToScheme(scheme))
&announced.GroupMetaFactoryArgs{ utilruntime.Must(v1.AddToScheme(scheme))
GroupName: core.GroupName, utilruntime.Must(scheme.SetVersionPriority(v1.SchemeGroupVersion))
VersionPreferenceOrder: []string{v1.SchemeGroupVersion.Version},
AddInternalObjectsToScheme: core.AddToScheme,
},
announced.VersionToSchemeFunc{
v1.SchemeGroupVersion.Version: v1.AddToScheme,
},
).Register(registry, scheme); err != nil {
panic(err)
}
} }

View File

@ -60,7 +60,6 @@ func addKnownTypes(scheme *runtime.Scheme) error {
&ServiceProxyOptions{}, &ServiceProxyOptions{},
&NodeList{}, &NodeList{},
&Node{}, &Node{},
&NodeConfigSource{},
&NodeProxyOptions{}, &NodeProxyOptions{},
&Endpoints{}, &Endpoints{},
&EndpointsList{}, &EndpointsList{},

View File

@ -3257,12 +3257,48 @@ type NodeSpec struct {
DoNotUse_ExternalID string DoNotUse_ExternalID string
} }
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
// NodeConfigSource specifies a source of node configuration. Exactly one subfield must be non-nil. // NodeConfigSource specifies a source of node configuration. Exactly one subfield must be non-nil.
type NodeConfigSource struct { type NodeConfigSource struct {
metav1.TypeMeta ConfigMap *ConfigMapNodeConfigSource
ConfigMapRef *ObjectReference }
type ConfigMapNodeConfigSource struct {
// Namespace is the metadata.namespace of the referenced ConfigMap.
// This field is required in all cases.
Namespace string
// Name is the metadata.name of the referenced ConfigMap.
// This field is required in all cases.
Name string
// UID is the metadata.UID of the referenced ConfigMap.
// This field is currently reqired in Node.Spec.
// TODO(#61643): This field will be forbidden in Node.Spec when #61643 is resolved.
// #61643 changes the behavior of dynamic Kubelet config to respect
// ConfigMap updates, and thus removes the ability to pin the Spec to a given UID.
// TODO(#56896): This field will be required in Node.Status when #56896 is resolved.
// #63314 (the PR that resolves #56896) adds a structured status to the Node
// object for reporting information about the config. This status requires UID
// and ResourceVersion, so that it represents a fully-explicit description of
// the configuration in use, while (see previous TODO) the Spec will be
// restricted to namespace/name in #61643.
// +optional
UID types.UID
// ResourceVersion is the metadata.ResourceVersion of the referenced ConfigMap.
// This field is forbidden in Node.Spec.
// TODO(#56896): This field will be required in Node.Status when #56896 is resolved.
// #63314 (the PR that resolves #56896) adds a structured status to the Node
// object for reporting information about the config. This status requires UID
// and ResourceVersion, so that it represents a fully-explicit description of
// the configuration in use, while (see previous TODO) the Spec will be
// restricted to namespace/name in #61643.
// +optional
ResourceVersion string
// KubeletConfigKey declares which key of the referenced ConfigMap corresponds to the KubeletConfiguration structure
// This field is required in all cases.
KubeletConfigKey string
} }
// DaemonEndpoint contains information about a single Daemon endpoint. // DaemonEndpoint contains information about a single Daemon endpoint.

View File

@ -82,6 +82,8 @@ func RegisterConversions(scheme *runtime.Scheme) error {
Convert_core_ConfigMapKeySelector_To_v1_ConfigMapKeySelector, Convert_core_ConfigMapKeySelector_To_v1_ConfigMapKeySelector,
Convert_v1_ConfigMapList_To_core_ConfigMapList, Convert_v1_ConfigMapList_To_core_ConfigMapList,
Convert_core_ConfigMapList_To_v1_ConfigMapList, Convert_core_ConfigMapList_To_v1_ConfigMapList,
Convert_v1_ConfigMapNodeConfigSource_To_core_ConfigMapNodeConfigSource,
Convert_core_ConfigMapNodeConfigSource_To_v1_ConfigMapNodeConfigSource,
Convert_v1_ConfigMapProjection_To_core_ConfigMapProjection, Convert_v1_ConfigMapProjection_To_core_ConfigMapProjection,
Convert_core_ConfigMapProjection_To_v1_ConfigMapProjection, Convert_core_ConfigMapProjection_To_v1_ConfigMapProjection,
Convert_v1_ConfigMapVolumeSource_To_core_ConfigMapVolumeSource, Convert_v1_ConfigMapVolumeSource_To_core_ConfigMapVolumeSource,
@ -941,6 +943,34 @@ func Convert_core_ConfigMapList_To_v1_ConfigMapList(in *core.ConfigMapList, out
return autoConvert_core_ConfigMapList_To_v1_ConfigMapList(in, out, s) return autoConvert_core_ConfigMapList_To_v1_ConfigMapList(in, out, s)
} }
func autoConvert_v1_ConfigMapNodeConfigSource_To_core_ConfigMapNodeConfigSource(in *v1.ConfigMapNodeConfigSource, out *core.ConfigMapNodeConfigSource, s conversion.Scope) error {
out.Namespace = in.Namespace
out.Name = in.Name
out.UID = types.UID(in.UID)
out.ResourceVersion = in.ResourceVersion
out.KubeletConfigKey = in.KubeletConfigKey
return nil
}
// Convert_v1_ConfigMapNodeConfigSource_To_core_ConfigMapNodeConfigSource is an autogenerated conversion function.
func Convert_v1_ConfigMapNodeConfigSource_To_core_ConfigMapNodeConfigSource(in *v1.ConfigMapNodeConfigSource, out *core.ConfigMapNodeConfigSource, s conversion.Scope) error {
return autoConvert_v1_ConfigMapNodeConfigSource_To_core_ConfigMapNodeConfigSource(in, out, s)
}
func autoConvert_core_ConfigMapNodeConfigSource_To_v1_ConfigMapNodeConfigSource(in *core.ConfigMapNodeConfigSource, out *v1.ConfigMapNodeConfigSource, s conversion.Scope) error {
out.Namespace = in.Namespace
out.Name = in.Name
out.UID = types.UID(in.UID)
out.ResourceVersion = in.ResourceVersion
out.KubeletConfigKey = in.KubeletConfigKey
return nil
}
// Convert_core_ConfigMapNodeConfigSource_To_v1_ConfigMapNodeConfigSource is an autogenerated conversion function.
func Convert_core_ConfigMapNodeConfigSource_To_v1_ConfigMapNodeConfigSource(in *core.ConfigMapNodeConfigSource, out *v1.ConfigMapNodeConfigSource, s conversion.Scope) error {
return autoConvert_core_ConfigMapNodeConfigSource_To_v1_ConfigMapNodeConfigSource(in, out, s)
}
func autoConvert_v1_ConfigMapProjection_To_core_ConfigMapProjection(in *v1.ConfigMapProjection, out *core.ConfigMapProjection, s conversion.Scope) error { func autoConvert_v1_ConfigMapProjection_To_core_ConfigMapProjection(in *v1.ConfigMapProjection, out *core.ConfigMapProjection, s conversion.Scope) error {
if err := Convert_v1_LocalObjectReference_To_core_LocalObjectReference(&in.LocalObjectReference, &out.LocalObjectReference, s); err != nil { if err := Convert_v1_LocalObjectReference_To_core_LocalObjectReference(&in.LocalObjectReference, &out.LocalObjectReference, s); err != nil {
return err return err
@ -2586,7 +2616,7 @@ func Convert_core_NodeCondition_To_v1_NodeCondition(in *core.NodeCondition, out
} }
func autoConvert_v1_NodeConfigSource_To_core_NodeConfigSource(in *v1.NodeConfigSource, out *core.NodeConfigSource, s conversion.Scope) error { func autoConvert_v1_NodeConfigSource_To_core_NodeConfigSource(in *v1.NodeConfigSource, out *core.NodeConfigSource, s conversion.Scope) error {
out.ConfigMapRef = (*core.ObjectReference)(unsafe.Pointer(in.ConfigMapRef)) out.ConfigMap = (*core.ConfigMapNodeConfigSource)(unsafe.Pointer(in.ConfigMap))
return nil return nil
} }
@ -2596,7 +2626,7 @@ func Convert_v1_NodeConfigSource_To_core_NodeConfigSource(in *v1.NodeConfigSourc
} }
func autoConvert_core_NodeConfigSource_To_v1_NodeConfigSource(in *core.NodeConfigSource, out *v1.NodeConfigSource, s conversion.Scope) error { func autoConvert_core_NodeConfigSource_To_v1_NodeConfigSource(in *core.NodeConfigSource, out *v1.NodeConfigSource, s conversion.Scope) error {
out.ConfigMapRef = (*v1.ObjectReference)(unsafe.Pointer(in.ConfigMapRef)) out.ConfigMap = (*v1.ConfigMapNodeConfigSource)(unsafe.Pointer(in.ConfigMap))
return nil return nil
} }

Some files were not shown because too many files have changed in this diff Show More