Skip to content
This repository was archived by the owner on Aug 12, 2025. It is now read-only.

Commit 5ef73c0

Browse files
authored
Merge pull request #54 from packethost/v1alpha3
V1alpha3
2 parents b6705a6 + 5665cb7 commit 5ef73c0

File tree

3,600 files changed

+4474
-1165740
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

3,600 files changed

+4474
-1165740
lines changed

.drone.yml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,13 @@ workspace:
1313
steps:
1414
- name: test
1515
pull: always
16-
image: golang:1.12.7-alpine
16+
image: golang:1.14.2-alpine3.11
17+
environment:
18+
CGO_ENABLED: 0
1719
commands:
1820
- apk --update add make git bash jq curl
19-
- make ci-test
21+
- make kubebuilder
22+
- make test
2023

2124
- name: image
2225
pull: always
@@ -28,6 +31,8 @@ steps:
2831
repo: packethost/cluster-api-provider-packet
2932
tags:
3033
- latest
34+
build_args:
35+
- GOVER=1.14.2-alpine3.11
3136

3237
- name: publish
3338
pull: always

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,6 @@ kubeconfig
3333

3434
# from the sed we run
3535
config/default/manager_image_patch.yaml-e
36+
37+
# test results
38+
_artifacts

Dockerfile

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,26 @@
11
# Build the manager binary
2-
FROM golang:1.12.7-alpine as builder
2+
ARG GOVER=1.14
3+
FROM golang:${GOVER} as builder
34

4-
# Copy in the go src
5-
WORKDIR /go/src/github.com/packethost/cluster-api-provider-packet
6-
COPY pkg/ pkg/
7-
COPY cmd/ cmd/
8-
COPY vendor/ vendor/
9-
COPY go.* ./
10-
COPY tools.go ./
5+
WORKDIR /workspace
6+
# Copy the Go Modules manifests
7+
COPY go.mod go.mod
8+
COPY go.sum go.sum
9+
# cache deps before building and copying source so that we don't need to re-download as much
10+
# and so that source changes don't invalidate our downloaded layer
11+
RUN go mod download
1112

13+
# Copy the go source
14+
COPY . .
1215

1316
# Build
14-
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GO111MODULE=on go build -mod=vendor -a -o manager github.com/packethost/cluster-api-provider-packet/cmd/manager
17+
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GO111MODULE=on go build -a -o manager main.go
1518

16-
# Copy the controller-manager into a thin image
17-
FROM alpine:3.10
19+
# Use distroless as minimal base image to package the manager binary
20+
# Refer to https://github.com/GoogleContainerTools/distroless for more details
21+
FROM gcr.io/distroless/static:nonroot
1822
WORKDIR /
19-
RUN apk --update add ca-certificates
20-
COPY --from=builder /go/src/github.com/packethost/cluster-api-provider-packet/manager .
23+
COPY --from=builder /workspace/manager .
24+
USER nonroot:nonroot
25+
2126
ENTRYPOINT ["/manager"]

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Copyright 2019 Packet Inc
1+
Copyright 2019-2020 Packet Inc
22

33
Licensed under the Apache License, Version 2.0 (the "License");
44
you may not use this file except in compliance with the License.

Makefile

Lines changed: 179 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,26 @@
11
.PHONY: vendor test manager clusterctl run install deploy manifests generate fmt vet run kubebuilder ci cd
22

3-
KUBEBUILDER_VERSION ?= 2.0.0-beta.0
3+
KUBEBUILDER_VERSION ?= 2.3.1
44
KUBEBUILDER ?= /usr/local/kubebuilder/bin/kubebuilder
5+
CONTROLLER_GEN_VERSION ?= v0.3.0
6+
CONTROLLER_GEN=$(GOBIN)/controller-gen
7+
8+
CERTMANAGER_URL ?= https://github.com/jetstack/cert-manager/releases/download/v0.14.1/cert-manager.yaml
59

610
GIT_VERSION?=$(shell git log -1 --format="%h")
711
RELEASE_TAG ?= $(shell git tag --points-at HEAD)
812

13+
REPO_URL ?= https://github.com/packethost/cluster-api-provider-packet
14+
915
# BUILDARCH is the host architecture
1016
# ARCH is the target architecture
1117
# we need to keep track of them separately
1218
BUILDARCH ?= $(shell uname -m)
1319
BUILDOS ?= $(shell uname -s | tr A-Z a-z)
1420

21+
TEST_E2E_DIR := test/e2e
22+
E2E_FOCUS := "functional tests"
23+
1524
# canonicalized names for host architecture
1625
ifeq ($(BUILDARCH),aarch64)
1726
BUILDARCH=arm64
@@ -34,28 +43,76 @@ endif
3443
# unless otherwise set, I am building for my own OS, i.e. not cross-compiling
3544
OS ?= $(BUILDOS)
3645

37-
3846
# Image URL to use all building/pushing image targets
3947
BUILD_IMAGE ?= packethost/cluster-api-provider-packet
4048
BUILD_IMAGE_TAG ?= $(BUILD_IMAGE):latest
4149
PUSH_IMAGE_TAG ?= $(BUILD_IMAGE):$(IMAGETAG)
42-
PROVIDERYAML ?= provider-components.yaml.template
43-
CLUSTERCTL ?= bin/clusterctl-$(OS)-$(ARCH)
4450
MANAGER ?= bin/manager-$(OS)-$(ARCH)
4551
KUBECTL ?= kubectl
4652

4753
GO ?= GO111MODULE=on CGO_ENABLED=0 go
4854

49-
all: test manager clusterctl
5055

51-
# vendor
52-
vendor:
53-
$(GO) mod vendor
54-
./hack/update-vendor.sh
56+
# Image URL to use all building/pushing image targets
57+
IMG ?= controller:latest
58+
# Produce CRDs that work back to Kubernetes 1.11 (no version conversion)
59+
CRD_OPTIONS ?= "crd:trivialVersions=true"
60+
61+
# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set)
62+
ifeq (,$(shell go env GOBIN))
63+
GOBIN=$(shell go env GOPATH)/bin
64+
else
65+
GOBIN=$(shell go env GOBIN)
66+
endif
67+
68+
# where we store downloaded core
69+
COREPATH ?= out/core
70+
CORE_VERSION ?= v0.3.5
71+
CORE_API ?= https://api.github.com/repos/kubernetes-sigs/cluster-api/releases
72+
CORE_URL ?= https://github.com/kubernetes-sigs/cluster-api/releases/download/$(CORE_VERSION)
73+
74+
# useful function
75+
word-dot = $(word $2,$(subst ., ,$1))
76+
77+
VERSION ?= 0.3.0
78+
VERSION_CONTRACT ?= v1alpha3
79+
VERSION_MAJOR ?= $(call word-dot,$(VERSION),1)
80+
VERSION_MINOR ?= $(call word-dot,$(VERSION),2)
81+
82+
# actual releases
83+
RELEASE_VERSION ?= $(VERSION)
84+
RELEASE_BASE := out/release/infrastructure-packet
85+
RELEASE_DIR := $(RELEASE_BASE)/$(RELEASE_VERSION)
86+
FULL_RELEASE_DIR := $(realpath .)/$(RELEASE_DIR)
87+
RELEASE_MANIFEST := $(RELEASE_DIR)/infrastructure-components.yaml
88+
RELEASE_METADATA := $(RELEASE_DIR)/metadata.yaml
89+
RELEASE_CLUSTER_TEMPLATE := $(RELEASE_DIR)/cluster-template.yaml
90+
FULL_RELEASE_MANIFEST := $(FULL_RELEASE_DIR)/infrastructure-components.yaml
91+
FULL_RELEASE_MANIFEST_URL := $(REPO_URL)/releases/latest/infrastructure-components.yaml
92+
FULL_RELEASE_CLUSTERCTLYAML := $(FULL_RELEASE_DIR)/clusterctl.yaml
93+
RELEASE_CLUSTERCTLYAML := $(RELEASE_BASE)/clusterctl-$(RELEASE_VERSION).yaml
94+
95+
# managerless - for running manager locally for testing
96+
MANAGERLESS_VERSION ?= $(RELEASE_VERSION)
97+
MANAGERLESS_BASE := out/managerless/infrastructure-packet
98+
MANAGERLESS_DIR := $(MANAGERLESS_BASE)/$(RELEASE_VERSION)
99+
FULL_MANAGERLESS_DIR := $(realpath .)/$(MANAGERLESS_DIR)
100+
MANAGERLESS_MANIFEST := $(MANAGERLESS_DIR)/infrastructure-components.yaml
101+
MANAGERLESS_METADATA := $(MANAGERLESS_DIR)/metadata.yaml
102+
MANAGERLESS_CLUSTER_TEMPLATE := $(MANAGERLESS_DIR)/cluster-template.yaml
103+
FULL_MANAGERLESS_MANIFEST := $(FULL_MANAGERLESS_DIR)/infrastructure-components.yaml
104+
MANAGERLESS_CLUSTERCTLYAML := $(MANAGERLESS_BASE)/clusterctl-$(MANAGERLESS_VERSION).yaml
105+
106+
# templates
107+
METADATA_TEMPLATE ?= templates/metadata-template.yaml
108+
CLUSTERCTL_TEMPLATE ?= templates/clusterctl-template.yaml
109+
CLUSTER_TEMPLATE ?= templates/cluster-template.yaml
110+
111+
112+
all: manager
55113

56114
# 2 separate targets: ci-test does everything locally, does not need docker; ci includes ci-test and building the image
57-
ci-test: fmt vet test
58-
ci: ci-test image
115+
ci: test image
59116

60117
imagetag:
61118
ifndef IMAGETAG
@@ -81,77 +138,140 @@ $(KUBEBUILDER):
81138
# (you'll need to set the KUBEBUILDER_ASSETS env var if you put it somewhere else)
82139
mv /tmp/kubebuilder_$(KUBEBUILDER_VERSION)_$(BUILDOS)_$(BUILDARCH) /usr/local/kubebuilder
83140

84-
85141
# Run tests
86-
test: vendor generate fmt vet manifests $(KUBEBUILDER)
87-
$(GO) test -mod=vendor ./pkg/... ./cmd/... -coverprofile cover.out
142+
test: generate fmt vet manifests
143+
go test ./... -coverprofile cover.out
144+
145+
# Run e2e tests
146+
e2e:
147+
# This is the name used inside the component.yaml for the container that runs the manager
148+
# The image gets loaded inside kind from ./test/e2e/config/packet-dev.yaml
149+
docker tag $(IMG) $(BUILD_IMAGE)
150+
$(E2E_FLAGS) $(MAKE) -C test/e2e run
88151

89152
# Build manager binary
90153
manager: $(MANAGER)
91-
$(MANAGER): vendor generate fmt vet
92-
GOOS=$(OS) GOARCH=$(ARCH) $(GO) build -mod=vendor -o $@ github.com/packethost/cluster-api-provider-packet/cmd/manager
93-
94-
# Build clusterctl binary
95-
clusterctl: $(CLUSTERCTL)
96-
$(CLUSTERCTL): vendor generate fmt vet
97-
GOOS=$(OS) GOARCH=$(ARCH) $(GO) build -mod=vendor -o $@ github.com/packethost/cluster-api-provider-packet/cmd/clusterctl
154+
$(MANAGER): generate fmt vet
155+
GOOS=$(OS) GOARCH=$(ARCH) $(GO) build -o $@ .
98156

99157
# Run against the configured Kubernetes cluster in ~/.kube/config
100-
run: vendor generate fmt vet
101-
$(GO) run -mod=vendor ./cmd/manager/main.go
158+
run: generate fmt vet manifests
159+
go run ./main.go
102160

103161
# Install CRDs into a cluster
104162
install: manifests
105-
kubectl apply -f config/crds
163+
kustomize build config/crd | kubectl apply -f -
164+
165+
# Uninstall CRDs from a cluster
166+
uninstall: manifests
167+
kustomize build config/crd | kubectl delete -f -
106168

107169
# Deploy controller in the configured Kubernetes cluster in ~/.kube/config
108-
deploy: manifests $(CLUSTERCTL)
109-
generate-yaml.sh
110-
$(CLUSTERCTL) create cluster --provider packet --bootstrap-type kind -c out/packet/cluster.yaml -m out/packet/machines.yaml -a out/packet/addons.yaml -p out/packet/provider-components.yaml --v=10
170+
deploy: manifests
171+
cd config/manager && kustomize edit set image controller=${IMG}
172+
kustomize build config/default | kubectl apply -f -
111173

112174
# Generate manifests e.g. CRD, RBAC etc.
113-
manifests: $(PROVIDERYAML)
114-
$(PROVIDERYAML):
115-
# which image do we patch in? BUILD_IMAGE_TAG or PUSH_IMAGE_TAG? Depends on if it is set
116-
ifdef IMAGETAG
117-
$(eval PATCH_IMAGE_TAG := $(PUSH_IMAGE_TAG))
118-
else
119-
$(eval PATCH_IMAGE_TAG := $(BUILD_IMAGE_TAG))
120-
endif
121-
# generate
122-
$(GO) run -mod=vendor vendor/sigs.k8s.io/controller-tools/cmd/controller-gen/main.go all
123-
# patch the particular image tag we will want to deploy
124-
@echo "updating kustomize image patch file for manager resource"
125-
sed -i'' -e 's@PATCH_ME_IMAGE@'"$(PATCH_IMAGE_TAG)"'@' ./config/default/manager_image_patch.yaml
126-
# create the manifests
127-
$(KUBECTL) kustomize vendor/sigs.k8s.io/cluster-api/config/default/ > $(PROVIDERYAML)
128-
echo "---" >> $(PROVIDERYAML)
129-
$(KUBECTL) kustomize config/ >> $(PROVIDERYAML)
130-
175+
manifests: controller-gen
176+
$(CONTROLLER_GEN) $(CRD_OPTIONS) rbac:roleName=manager-role webhook paths="./..." output:crd:artifacts:config=config/crd/bases
131177

132178
# Run go fmt against code
133179
fmt:
134-
$(GO) fmt ./pkg/... ./cmd/...
180+
go fmt ./...
135181

136182
# Run go vet against code
137183
vet:
138-
$(GO) vet -mod=vendor ./pkg/... ./cmd/...
184+
go vet ./...
139185

140186
# Generate code
141-
generate:
142-
ifndef GOPATH
143-
$(error GOPATH not defined, please define GOPATH. Run "go help gopath" to learn more about GOPATH)
144-
endif
145-
$(GO) generate -mod=vendor ./pkg/... ./cmd/...
187+
generate: controller-gen
188+
$(CONTROLLER_GEN) object:headerFile="hack/boilerplate.go.txt" paths="./..."
146189

147190
# Build the docker image
148-
image: docker-build
149-
docker-build:
150-
docker build -t $(BUILD_IMAGE_TAG) .
191+
image: test
192+
docker build . -t ${IMG}
151193

152194
# Push the docker image
153195
push:
154-
docker push $(PUSH_IMAGE_TAG)
155-
156-
image-tag:
157-
@echo $(PUSH_IMAGE_TAG)
196+
docker push ${IMG}
197+
198+
# find or download controller-gen
199+
# download controller-gen if necessary
200+
# version must be at least the given version
201+
.PHONY: $(CONTROLLER_GEN)
202+
controller-gen: $(CONTROLLER_GEN)
203+
$(CONTROLLER_GEN):
204+
scripts/controller-gen.sh $@ $(CONTROLLER_GEN_VERSION)
205+
206+
## generate a cluster using clusterctl and setting defaults
207+
cluster:
208+
./scripts/generate-cluster.sh
209+
210+
$(RELEASE_DIR) $(RELEASE_BASE):
211+
mkdir -p $@
212+
213+
$(MANAGERLESS_DIR) $(MANAGERLESS_BASE):
214+
mkdir -p $@
215+
216+
.PHONY: release-clusterctl release-manifests release $(RELEASE_CLUSTERCTLYAML) $(RELEASE_MANIFEST) $(RELEASE_METADATA) $(RELEASE_CLUSTER_TEMPLATE)
217+
release: release-manifests release-clusterctl release-cluster-template
218+
release-manifests: $(RELEASE_MANIFEST) $(RELEASE_METADATA) $(RELEASE_CLUSTER_TEMPLATE)
219+
$(RELEASE_MANIFEST): $(RELEASE_DIR) ## Builds the manifests to publish with a release
220+
kustomize build config/default > $@
221+
222+
$(RELEASE_METADATA): $(RELEASE_DIR) $(METADATA_TEMPLATE)
223+
cat $(METADATA_TEMPLATE) | sed 's/MAJOR/$(VERSION_MAJOR)/g' | sed 's/MINOR/$(VERSION_MINOR)/g' | sed 's/CONTRACT/$(VERSION_CONTRACT)/g' > $@
224+
225+
release-cluster-template: $(RELEASE_CLUSTER_TEMPLATE)
226+
$(RELEASE_CLUSTER_TEMPLATE): $(RELEASE_DIR)
227+
cp $(CLUSTER_TEMPLATE) $@
228+
229+
release-clusterctl: $(RELEASE_CLUSTERCTLYAML) $(FULL_RELEASE_CLUSTERCTLYAML)
230+
$(RELEASE_CLUSTERCTLYAML): $(RELEASE_BASE)
231+
cat $(CLUSTERCTL_TEMPLATE) | sed 's%URL%$(FULL_RELEASE_MANIFEST)%g' > $@
232+
233+
$(FULL_RELEASE_CLUSTERCTLYAML): $(RELEASE_DIR)
234+
cat $(CLUSTERCTL_TEMPLATE) | sed 's%URL%$(FULL_RELEASE_MANIFEST_URL)%g' > $@
235+
236+
.PHONY: managerless-clusterctl managerless-manifests managerless $(MANAGERLESS_CLUSTERCTLYAML) $(MANAGERLESS_MANIFEST) $(MANAGERLESS_METADATA) $(MANAGERLESS_CLUSTER_TEMPLATE)
237+
managerless: managerless-manifests managerless-clusterctl managerless-cluster-template
238+
managerless-manifests: $(MANAGERLESS_MANIFEST) $(MANAGERLESS_METADATA)
239+
$(MANAGERLESS_MANIFEST): $(MANAGERLESS_DIR)
240+
kustomize build config/managerless > $@
241+
242+
$(MANAGERLESS_METADATA): $(MANAGERLESS_DIR) $(METADATA_TEMPLATE)
243+
cat $(METADATA_TEMPLATE) | sed 's/MAJOR/$(VERSION_MAJOR)/g' | sed 's/MINOR/$(VERSION_MINOR)/g' | sed 's/CONTRACT/$(VERSION_CONTRACT)/g' > $@
244+
245+
managerless-cluster-template: $(MANAGERLESS_CLUSTER_TEMPLATE)
246+
$(MANAGERLESS_CLUSTER_TEMPLATE): $(MANAGERLESS_DIR)
247+
cp $(CLUSTER_TEMPLATE) $@
248+
249+
managerless-clusterctl: $(MANAGERLESS_CLUSTERCTLYAML)
250+
$(MANAGERLESS_CLUSTERCTLYAML): $(MANAGERLESS_BASE)
251+
@cat $(CLUSTERCTL_TEMPLATE) | sed 's%URL%$(FULL_MANAGERLESS_MANIFEST)%g' > $@
252+
@echo "managerless ready, command-line is:"
253+
@echo " clusterctl --config=$@ <commands>"
254+
255+
$(COREPATH):
256+
mkdir -p $@
257+
258+
$(COREPATH)/%:
259+
curl -s -L -o $@ $(CORE_URL)/$*
260+
261+
core: $(COREPATH)
262+
# download from core
263+
@$(eval YAMLS := $(shell curl -s -L $(CORE_API) | jq -r '[.[] | select(.tag_name == "$(CORE_VERSION)").assets[] | select(.name | contains("yaml")) | .name] | join(" ")'))
264+
@if [ -n "$(YAMLS)" ]; then $(MAKE) $(addprefix $(COREPATH)/,$(YAMLS)); fi
265+
266+
# the standard way to initialize a cluster. If you are using an actually released version,
267+
# then you can just do "clusterctl init --infrastructure=packet" without any of this
268+
cluster-init: managerless release
269+
clusterctl init
270+
clusterctl init --config=$(MANAGERLESS_CLUSTERCTLYAML) --infrastructure=packet
271+
272+
# this is just for those who really want to see the manual steps
273+
cluster-init-manual: core managerless release
274+
kubectl apply --validate=false -f $(CERTMANAGER_URL)
275+
# because of dependencies, this is allowed to fail once or twice
276+
kubectl apply -f $(COREPATH) || kubectl apply -f $(COREPATH) || kubectl apply -f $(COREPATH)
277+
kubectl apply -f $(FULL_MANAGERLESS_MANIFEST)

PROJECT

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1-
version: "1"
2-
domain: k8s.io
1+
domain: cluster.x-k8s.io
32
repo: github.com/packethost/cluster-api-provider-packet
3+
resources:
4+
- group: infrastructure
5+
kind: PacketCluster
6+
version: v1alpha3
7+
- group: infrastructure
8+
kind: PacketMachine
9+
version: v1alpha3
10+
version: "2"

0 commit comments

Comments
 (0)