ci: add github checks

Add github actions checks.
This commit is contained in:
Serge Logvinov
2023-04-29 13:12:37 +03:00
committed by Serge
parent cc2dc17de2
commit 0d89bf5d58
21 changed files with 560 additions and 21 deletions

51
.conform.yaml Normal file
View File

@@ -0,0 +1,51 @@
policies:
- type: commit
spec:
header:
length: 89
imperative: true
case: lower
invalidLastCharacters: .
body:
required: true
dco: false
gpg: false
spellcheck:
locale: US
maximumOfOneCommit: false
conventional:
types:
- build
- chore
- ci
- docs
- perf
- refactor
- revert
- style
- test
scopes:
- deps
- main
descriptionLength: 72
- type: license
spec:
skipPaths:
- .git/
allowPrecedingComments: false
header: |
/*
Copyright 2023 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.
*/

View File

@@ -33,5 +33,6 @@ jobs:
- name: Build and push - name: Build and push
run: make images run: make images
env: env:
USERNAME: ${{ github.repository_owner }}
PUSH: "true" PUSH: "true"
TAG: "edge" TAG: "edge"

View File

@@ -26,9 +26,11 @@ jobs:
go-version-file: 'go.mod' go-version-file: 'go.mod'
cache: true cache: true
- name: Build
run: make build
- name: Lint - name: Lint
uses: golangci/golangci-lint-action@v3 uses: golangci/golangci-lint-action@v3
with: with:
args: --config=.golangci.yml args: --config=.golangci.yml
- name: Unit
run: make unit
- name: Build
run: make build

View File

@@ -24,6 +24,4 @@ jobs:
- name: Run helm chart linter - name: Run helm chart linter
run: ct --config hack/ct.yml lint run: ct --config hack/ct.yml lint
- name: Run helm template - name: Run helm template
run: | run: make helm-unit
helm template -n kube-system -f charts/talos-cloud-controller-manager/values-tests.yaml \
ccm charts/talos-cloud-controller-manager > /dev/null

22
.github/workflows/conform.yaml vendored Normal file
View File

@@ -0,0 +1,22 @@
name: Conformance check
on:
pull_request:
branches:
- main
jobs:
conform:
name: Conformance
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
- name: Checkout main branch
run: git fetch --no-tags origin main:main
- name: Conform action
uses: talos-systems/conform@v0.1.0-alpha.27

34
.github/workflows/release-pre.yaml vendored Normal file
View File

@@ -0,0 +1,34 @@
name: Release check
on:
pull_request:
branches:
- main
jobs:
build-publish:
name: "Check release docs"
runs-on: ubuntu-22.04
if: startsWith(github.head_ref, 'release-')
permissions:
contents: read
packages: write
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Unshallow
run: git fetch --prune --unshallow
- name: Release version
shell: bash
id: release
run: |
echo "TAG=${GITHUB_HEAD_REF:8}" >> "$GITHUB_ENV"
- name: Helm docs
uses: gabe565/setup-helm-docs-action@v1
- name: Generate
run: make docs
- name: Check
run: git diff --exit-code

33
.github/workflows/release.yaml vendored Normal file
View File

@@ -0,0 +1,33 @@
name: Release
on:
push:
tags:
- 'v*'
jobs:
build-publish:
name: "Build image and publish"
runs-on: ubuntu-22.04
permissions:
contents: read
packages: write
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Unshallow
run: git fetch --prune --unshallow
- name: Set up docker buildx
run: make docker-init
- name: Github registry login
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
run: make images
env:
PUSH: "true"

View File

@@ -21,7 +21,7 @@ else
BUILD_ARGS += --output type=docker BUILD_ARGS += --output type=docker
endif endif
###### ############
# Help Menu # Help Menu
@@ -43,7 +43,10 @@ help: ## This help menu.
@echo "$$HELP_MENU_HEADER" @echo "$$HELP_MENU_HEADER"
@grep -E '^[a-zA-Z0-9%_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' @grep -E '^[a-zA-Z0-9%_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
############
#
# Build Abstractions # Build Abstractions
#
build-all-archs: build-all-archs:
@for arch in $(ARCHS); do $(MAKE) ARCH=$${arch} build ; done @for arch in $(ARCHS); do $(MAKE) ARCH=$${arch} build ; done
@@ -58,25 +61,45 @@ build: ## Build
-o bin/proxmox-cloud-controller-manager-$(ARCH) ./cmd/proxmox-cloud-controller-manager -o bin/proxmox-cloud-controller-manager-$(ARCH) ./cmd/proxmox-cloud-controller-manager
.PHONY: run .PHONY: run
run: build run: build ## Run
./bin/proxmox-cloud-controller-manager-$(ARCH) --v=5 --kubeconfig=kubeconfig --cloud-config=proxmox-config.yaml --controllers=cloud-node,cloud-node-lifecycle \ ./bin/proxmox-cloud-controller-manager-$(ARCH) --v=5 --kubeconfig=kubeconfig --cloud-config=proxmox-config.yaml --controllers=cloud-node,cloud-node-lifecycle \
--use-service-account-credentials --leader-elect=false --bind-address=127.0.0.1 --use-service-account-credentials --leader-elect=false --bind-address=127.0.0.1
.PHONY: lint .PHONY: lint
lint: ## Lint lint: ## Lint Code
golangci-lint run --config .golangci.yml golangci-lint run --config .golangci.yml
.PHONY: unit .PHONY: unit
unit: unit: ## Unit Tests
go test -tags=unit $(shell go list ./...) $(TESTARGS) go test -tags=unit $(shell go list ./...) $(TESTARGS)
############
.PHONY: helm-unit
helm-unit: ## Helm Unit Tests
@helm lint charts/proxmox-cloud-controller-manager
@helm template -f charts/proxmox-cloud-controller-manager/ci/values.yaml \
proxmox-cloud-controller-manager charts/proxmox-cloud-controller-manager >/dev/null
.PHONY: docs .PHONY: docs
docs: docs:
helm template -n kube-system proxmox-cloud-controller-manager \ helm template -n kube-system proxmox-cloud-controller-manager \
-f charts/proxmox-cloud-controller-manager/values.edge.yaml \
--set-string image.tag=$(TAG) \ --set-string image.tag=$(TAG) \
charts/proxmox-cloud-controller-manager > docs/deploy/cloud-controller-manager.yml charts/proxmox-cloud-controller-manager > docs/deploy/cloud-controller-manager.yml
helm template -n kube-system proxmox-cloud-controller-manager \
-f charts/proxmox-cloud-controller-manager/values.talos.yaml \
--set-string image.tag=$(TAG) \
charts/proxmox-cloud-controller-manager > docs/deploy/cloud-controller-manager-talos.yml
helm-docs charts/proxmox-cloud-controller-manager
# Docker stages release-update:
git-chglog --config hack/chglog-config.yml -o CHANGELOG.md
############
#
# Docker Abstractions
#
docker-init: docker-init:
docker run --rm --privileged multiarch/qemu-user-static:register --reset docker run --rm --privileged multiarch/qemu-user-static:register --reset
@@ -87,8 +110,9 @@ docker-init:
docker buildx inspect --bootstrap multiarch docker buildx inspect --bootstrap multiarch
.PHONY: images .PHONY: images
images: images: ## Build images
@docker buildx build $(BUILD_ARGS) \ @docker buildx build $(BUILD_ARGS) \
--build-arg TAG=$(TAG) \ --build-arg TAG=$(TAG) \
--build-arg SHA=$(SHA) \
-t $(IMAGE):$(TAG) \ -t $(IMAGE):$(TAG) \
-f Dockerfile . -f Dockerfile .

4
OWNERS Normal file
View File

@@ -0,0 +1,4 @@
approvers:
- sergelogvinov
reviewers:
- sergelogvinov

View File

@@ -2,11 +2,19 @@ apiVersion: v2
name: proxmox-cloud-controller-manager name: proxmox-cloud-controller-manager
description: A Helm chart for Kubernetes description: A Helm chart for Kubernetes
type: application type: application
home: https://github.com/sergelogvinov/proxmox-cloud-controller-manager
icon: https://proxmox.com/templates/yoo_nano2/favicon.ico
sources:
- https://github.com/sergelogvinov/proxmox-cloud-controller-manager
keywords:
- ccm
maintainers:
- name: sergelogvinov
# This is the chart version. This version number should be incremented each time you make changes # This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version. # to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/) # Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.1.0 version: 0.1.1
# This is the version number of the application being deployed. This version number should be # This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to # incremented each time you make changes to the application. Versions are not expected to

View File

@@ -0,0 +1,47 @@
# proxmox-cloud-controller-manager
![Version: 0.1.0](https://img.shields.io/badge/Version-0.1.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.0.1](https://img.shields.io/badge/AppVersion-0.0.1-informational?style=flat-square)
A Helm chart for Kubernetes
**Homepage:** <https://github.com/sergelogvinov/proxmox-cloud-controller-manager>
## Maintainers
| Name | Email | Url |
| ---- | ------ | --- |
| sergelogvinov | | |
## Source Code
* <https://github.com/sergelogvinov/proxmox-cloud-controller-manager>
## Values
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| affinity | object | `{}` | Affinity for data pods assignment. ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity |
| config.clusters | list | `[]` | |
| enabledControllers | list | `["cloud-node","cloud-node-lifecycle"]` | List of controllers should be enabled. Use '*' to enable all controllers. Support only `cloud-node,cloud-node-lifecycle` controllers. |
| extraArgs | list | `[]` | Any extra arguments for talos-cloud-controller-manager |
| fullnameOverride | string | `""` | |
| image.pullPolicy | string | `"IfNotPresent"` | |
| image.repository | string | `"ghcr.io/sergelogvinov/proxmox-cloud-controller-manager"` | |
| image.tag | string | `""` | |
| imagePullSecrets | list | `[]` | |
| logVerbosityLevel | int | `2` | Log verbosity level. See https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/logging.md for description of individual verbosity levels. |
| nameOverride | string | `""` | |
| nodeSelector | object | `{}` | Node labels for data pods assignment. ref: https://kubernetes.io/docs/user-guide/node-selection/ |
| podAnnotations | object | `{}` | Annotations for data pods. ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ |
| podSecurityContext | object | `{"fsGroup":10258,"fsGroupChangePolicy":"OnRootMismatch","runAsGroup":10258,"runAsNonRoot":true,"runAsUser":10258}` | Pods Security Context. ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod |
| priorityClassName | string | `"system-cluster-critical"` | CCM pods' priorityClassName. |
| replicaCount | int | `1` | |
| resources.requests.cpu | string | `"10m"` | |
| resources.requests.memory | string | `"32Mi"` | |
| securityContext | object | `{"allowPrivilegeEscalation":false,"capabilities":{"drop":["ALL"]},"seccompProfile":{"type":"RuntimeDefault"}}` | Container Security Context. ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod |
| serviceAccount | object | `{"annotations":{},"create":true,"name":""}` | Pods Service Account. ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/ |
| tolerations | list | `[{"effect":"NoSchedule","key":"node-role.kubernetes.io/control-plane","operator":"Exists"},{"effect":"NoSchedule","key":"node.cloudprovider.kubernetes.io/uninitialized","operator":"Exists"}]` | Tolerations for data pods assignment. ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ |
| updateStrategy | object | `{"rollingUpdate":{"maxUnavailable":1},"type":"RollingUpdate"}` | Deployment update stategy type. ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#updating-a-deployment |
----------------------------------------------
Autogenerated from chart metadata using [helm-docs v1.11.0](https://github.com/norwoodj/helm-docs/releases/v1.11.0)

View File

@@ -0,0 +1,27 @@
image:
repository: ghcr.io/sergelogvinov/proxmox-cloud-controller-manager
pullPolicy: Always
tag: edge
nodeSelector:
node-role.kubernetes.io/control-plane: ""
logVerbosityLevel: 4
enabledControllers:
- cloud-node
- cloud-node-lifecycle
config:
clusters:
- url: https://cluster-api-1.exmple.com:8006/api2/json
insecure: false
token_id: "user!token-id"
token_secret: "secret"
region: cluster-1
- url: https://cluster-api-2.exmple.com:8006/api2/json
insecure: false
token_id: "user!token-id"
token_secret: "secret"
region: cluster-2

View File

@@ -1,7 +0,0 @@
image:
repository: ghcr.io/sergelogvinov/proxmox-cloud-controller-manager
pullPolicy: Always
tag: edge
logVerbosityLevel: 4

View File

@@ -0,0 +1,13 @@
image:
pullPolicy: Always
tag: edge
nodeSelector:
node-role.kubernetes.io/control-plane: ""
logVerbosityLevel: 4
enabledControllers:
- cloud-node
- cloud-node-lifecycle

View File

@@ -0,0 +1,8 @@
nodeSelector:
node-role.kubernetes.io/control-plane: ""
logVerbosityLevel: 4
enabledControllers:
- cloud-node-lifecycle

View File

@@ -0,0 +1,204 @@
---
# Source: proxmox-cloud-controller-manager/templates/serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: proxmox-cloud-controller-manager
labels:
helm.sh/chart: proxmox-cloud-controller-manager-0.1.0
app.kubernetes.io/name: proxmox-cloud-controller-manager
app.kubernetes.io/instance: proxmox-cloud-controller-manager
app.kubernetes.io/version: "0.0.1"
app.kubernetes.io/managed-by: Helm
namespace: kube-system
---
# Source: proxmox-cloud-controller-manager/templates/secrets.yaml
apiVersion: v1
kind: Secret
metadata:
name: proxmox-cloud-controller-manager
labels:
helm.sh/chart: proxmox-cloud-controller-manager-0.1.0
app.kubernetes.io/name: proxmox-cloud-controller-manager
app.kubernetes.io/instance: proxmox-cloud-controller-manager
app.kubernetes.io/version: "0.0.1"
app.kubernetes.io/managed-by: Helm
namespace: kube-system
data:
config.yaml: "Y2x1c3RlcnM6IFtd"
---
# Source: proxmox-cloud-controller-manager/templates/role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: system:proxmox-cloud-controller-manager
labels:
helm.sh/chart: proxmox-cloud-controller-manager-0.1.0
app.kubernetes.io/name: proxmox-cloud-controller-manager
app.kubernetes.io/instance: proxmox-cloud-controller-manager
app.kubernetes.io/version: "0.0.1"
app.kubernetes.io/managed-by: Helm
rules:
- apiGroups:
- coordination.k8s.io
resources:
- leases
verbs:
- get
- create
- update
- apiGroups:
- ""
resources:
- events
verbs:
- create
- patch
- update
- apiGroups:
- ""
resources:
- nodes
verbs:
- get
- list
- watch
- update
- patch
- delete
- apiGroups:
- ""
resources:
- nodes/status
verbs:
- patch
- apiGroups:
- ""
resources:
- serviceaccounts
verbs:
- create
- get
- apiGroups:
- ""
resources:
- serviceaccounts/token
verbs:
- create
---
# Source: proxmox-cloud-controller-manager/templates/rolebinding.yaml
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: system:proxmox-cloud-controller-manager
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:proxmox-cloud-controller-manager
subjects:
- kind: ServiceAccount
name: proxmox-cloud-controller-manager
namespace: kube-system
---
# Source: proxmox-cloud-controller-manager/templates/rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: system:proxmox-cloud-controller-manager:extension-apiserver-authentication-reader
namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccount
name: proxmox-cloud-controller-manager
namespace: kube-system
---
# Source: proxmox-cloud-controller-manager/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: proxmox-cloud-controller-manager
labels:
helm.sh/chart: proxmox-cloud-controller-manager-0.1.0
app.kubernetes.io/name: proxmox-cloud-controller-manager
app.kubernetes.io/instance: proxmox-cloud-controller-manager
app.kubernetes.io/version: "0.0.1"
app.kubernetes.io/managed-by: Helm
namespace: kube-system
spec:
replicas: 1
strategy:
type: RollingUpdate
selector:
matchLabels:
app.kubernetes.io/name: proxmox-cloud-controller-manager
app.kubernetes.io/instance: proxmox-cloud-controller-manager
template:
metadata:
annotations:
checksum/config: c69436cb1e16c36ff708b1003d3ca4c6ee6484d2524e2ba7d9b68f473acaa1ca
labels:
app.kubernetes.io/name: proxmox-cloud-controller-manager
app.kubernetes.io/instance: proxmox-cloud-controller-manager
spec:
enableServiceLinks: false
priorityClassName: system-cluster-critical
serviceAccountName: proxmox-cloud-controller-manager
securityContext:
fsGroup: 10258
fsGroupChangePolicy: OnRootMismatch
runAsGroup: 10258
runAsNonRoot: true
runAsUser: 10258
containers:
- name: proxmox-cloud-controller-manager
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
seccompProfile:
type: RuntimeDefault
image: "ghcr.io/sergelogvinov/proxmox-cloud-controller-manager:edge"
imagePullPolicy: IfNotPresent
command: ["/proxmox-cloud-controller-manager"]
args:
- --v=4
- --cloud-provider=proxmox
- --cloud-config=/etc/proxmox/config.yaml
- --controllers=cloud-node-lifecycle
- --leader-elect-resource-name=cloud-controller-manager-proxmox
- --use-service-account-credentials
- --secure-port=10258
livenessProbe:
httpGet:
path: /healthz
port: 10258
scheme: HTTPS
initialDelaySeconds: 20
periodSeconds: 30
timeoutSeconds: 5
resources:
requests:
cpu: 10m
memory: 32Mi
volumeMounts:
- name: cloud-config
mountPath: /etc/proxmox
readOnly: true
nodeSelector:
node-role.kubernetes.io/control-plane: ""
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/control-plane
operator: Exists
- effect: NoSchedule
key: node.cloudprovider.kubernetes.io/uninitialized
operator: Exists
volumes:
- name: cloud-config
secret:
secretName: proxmox-cloud-controller-manager
defaultMode: 416 # 0640

View File

@@ -162,10 +162,10 @@ spec:
seccompProfile: seccompProfile:
type: RuntimeDefault type: RuntimeDefault
image: "ghcr.io/sergelogvinov/proxmox-cloud-controller-manager:edge" image: "ghcr.io/sergelogvinov/proxmox-cloud-controller-manager:edge"
imagePullPolicy: IfNotPresent imagePullPolicy: Always
command: ["/proxmox-cloud-controller-manager"] command: ["/proxmox-cloud-controller-manager"]
args: args:
- --v=2 - --v=4
- --cloud-provider=proxmox - --cloud-provider=proxmox
- --cloud-config=/etc/proxmox/config.yaml - --cloud-config=/etc/proxmox/config.yaml
- --controllers=cloud-node,cloud-node-lifecycle - --controllers=cloud-node,cloud-node-lifecycle
@@ -188,6 +188,8 @@ spec:
- name: cloud-config - name: cloud-config
mountPath: /etc/proxmox mountPath: /etc/proxmox
readOnly: true readOnly: true
nodeSelector:
node-role.kubernetes.io/control-plane: ""
tolerations: tolerations:
- effect: NoSchedule - effect: NoSchedule
key: node-role.kubernetes.io/control-plane key: node-role.kubernetes.io/control-plane

33
hack/CHANGELOG.tpl.md Executable file
View File

@@ -0,0 +1,33 @@
{{ range .Versions }}
<a name="{{ .Tag.Name }}"></a>
## {{ if .Tag.Previous }}[{{ .Tag.Name }}]({{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }}){{ else }}{{ .Tag.Name }}{{ end }} ({{ datetime "2006-01-02" .Tag.Date }})
Welcome to the {{ .Tag.Name }} release of Kubernetes cloud controller manager for Proxmox!
{{ if .CommitGroups -}}
{{ range .CommitGroups -}}
### {{ .Title }}
{{ range .Commits -}}
- {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ .Subject }}
{{ end }}
{{ end -}}
{{ end -}}
### Changelog
{{ range .Commits -}}{{ if ne .Subject "" -}}
* {{ .Hash.Short }} {{ .Header }}
{{ end }}{{ end }}
{{- if .NoteGroups -}}
{{ range .NoteGroups -}}
### {{ .Title }}
{{ range .Notes }}
{{ .Body }}
{{ end }}
{{ end -}}
{{ end -}}
{{ end -}}

24
hack/chglog-config.yml Executable file
View File

@@ -0,0 +1,24 @@
style: github
template: CHANGELOG.tpl.md
info:
title: CHANGELOG
repository_url: https://github.com/sergelogvinov/proxmox-cloud-controller-manager
options:
commits:
filters:
Type:
- feat
- fix
commit_groups:
title_maps:
feat: Features
fix: Bug Fixes
header:
pattern: "^(\\w*)(?:\\(([\\w\\$\\.\\-\\*\\s]*)\\))?\\:\\s(.*)$"
pattern_maps:
- Type
- Scope
- Subject
notes:
keywords:
- BREAKING CHANGE

9
hack/ct.yml Normal file
View File

@@ -0,0 +1,9 @@
helm-extra-args: --timeout 300s
check-version-increment: true
debug: true
chart-dirs:
- charts
validate-maintainers: true
namespace: default
release-label: test
target-branch: main

View File

@@ -136,6 +136,8 @@ func (i *instances) InstanceMetadata(_ context.Context, node *v1.Node) (*cloudpr
}, nil }, nil
} }
klog.Infof("instances.InstanceMetadata() is kubelet has --cloud-provider=external on the node %s?", node.Name)
return &cloudprovider.InstanceMetadata{}, nil return &cloudprovider.InstanceMetadata{}, nil
} }