Add selector to filter docs to be deplyed to k8s

By default every document is to be deployed to kubernetes however
some documents may need to be skipped, because they serve only
informational purposes and have no consumers in kubernetes cluster

Change-Id: If2ea5659acb319c15cf3f55e9f3d9e86dc647e9f
Relates-To: #130
Closes: #130
This commit is contained in:
Kostiantyn Kalynovskyi 2020-03-26 10:50:13 -05:00
parent 7a2d01789e
commit ad1e160c1a
10 changed files with 149 additions and 2 deletions

View File

@ -1,6 +1,8 @@
apiVersion: metal3.io/v1alpha1
kind: BareMetalHost
metadata:
annotations:
config.kubernetes.io/local-config: "true"
labels:
airshipit.org/ephemeral-node: "true"
name: master-0

View File

@ -1,6 +1,8 @@
apiVersion: v1
kind: Secret
metadata:
annotations:
config.kubernetes.io/local-config: "true"
labels:
airshipit.org/ephemeral-user-data: "true"
name: node1-bmc-secret
@ -115,6 +117,8 @@ stringData:
apiVersion: v1
kind: Secret
metadata:
annotations:
config.kubernetes.io/local-config: "true"
name: ephemeral-network-data
namespace: default
type: Opaque

View File

@ -66,7 +66,7 @@ func (infra *Infra) Deploy() error {
}
// Returns all documents for this phase
docs, err := b.GetAllDocuments()
docs, err := b.Select(document.NewDeployToK8sSelector())
if err != nil {
return err
}

View File

@ -1,11 +1,16 @@
package document
const (
// Selectors
// Label Selectors
BaseAirshipSelector = "airshipit.org"
EphemeralHostSelector = BaseAirshipSelector + "/ephemeral-node in (True, true)"
EphemeralUserDataSelector = BaseAirshipSelector + "/ephemeral-user-data in (True, true)"
InitInfraSelector = BaseAirshipSelector + "/phase = initinfra"
// Annotation Selectors
// Please note that by default every document in the manifest is to be deployed to kubernetes cluster.
// so this selector simply checks that deploy-k8s label is not equal to true or True (string)
DeployToK8sSelector = "config.kubernetes.io/local-config notin (True, true)"
)
// Kinds

View File

@ -98,3 +98,9 @@ func NewEphemeralNetworkDataSelector(bmhDoc Document) (Selector, error) {
return selector, nil
}
// NewDeployToK8sSelector returns a selector to get documents that are to be deployed
// to kubernetes cluster.
func NewDeployToK8sSelector() Selector {
return NewSelector().ByAnnotation(DeployToK8sSelector)
}

View File

@ -60,3 +60,21 @@ func TestSelectorsNegative(t *testing.T) {
assert.Error(t, err)
})
}
func TestSelectorsSkip(t *testing.T) {
// These two tests take bundle with two malformed documents
// each of the documents will fail at different locations providing higher
// test coverage
bundle := testutil.NewTestBundle(t, "testdata/selectors/exclude-from-k8s")
t.Run("TestNewEphemeralNetworkDataSelectorErr", func(t *testing.T) {
selector := document.NewDeployToK8sSelector()
docs, err := bundle.Select(selector)
require.NoError(t, err)
assert.Len(t, docs, 5)
for _, doc := range docs {
assert.NotEqual(t, "ignore-namespace", doc.GetName())
assert.NotEqual(t, "ignore-bmh", doc.GetName())
}
})
}

View File

@ -0,0 +1,55 @@
## These file provides 3 resource that are to be deployed to k8s
## Because they dont have airshipit.org/deploy-k8s: "false" label
---
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
airshipit.org/clustertype: target
labels:
app: workflow-controller
arbitrary-label: some-label
name: workflow-controller
namespace: argo-namespace
spec:
selector:
matchLabels:
app: workflow-controller
template:
metadata:
labels:
app: workflow-controller
spec:
containers:
- args:
- --configmap
- workflow-controller-configmap
- --executor-image
- argoproj/argoexec:v2.3.0
command:
- workflow-controller
image: argoproj/workflow-controller:v2.3.0
name: workflow-controller
serviceAccountName: argo
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
annotations:
airshipit.org/clustertype: target
name: workflows.argoproj.io
spec:
group: argoproj.io
names:
kind: Workflow
plural: workflows
shortNames:
- wf
scope: Namespaced
version: v1alpha1
---
apiVersion: v1
kind: Namespace
metadata:
name: argo-namespace
...

View File

@ -0,0 +1,26 @@
## This file provides 2 resources that should be filtered out by DeplyToK8s selector
## because they have airshipit.org/deploy-k8s: "false" airshipit.org/deploy-k8s: "False"
## labels
---
apiVersion: v1
kind: Namespace
metadata:
annotations:
config.kubernetes.io/local-config: "true"
name: ignore-namespace
---
apiVersion: metal3.io/v1alpha1
kind: BareMetalHost
metadata:
annotations:
config.kubernetes.io/local-config: "true"
name: ignore-bmh
spec:
online: true
bootMACAddress: 00:3b:8b:0c:ec:8b
bmc:
address: ipmi://192.168.111.1:6230
credentialsName: master-0-bmc-secret
networkData:
namespace: validNamespace
...

View File

@ -0,0 +1,4 @@
resources:
- ignore-resources.yaml
- deploy-resources.yaml
- more-deploy-resources.yaml

View File

@ -0,0 +1,27 @@
## This file provides 2 resource that are to be deployed to k8s
## Because they dont have airshipit.org/deploy-k8s: "false" label
---
apiVersion: metal3.io/v1alpha1
kind: BareMetalHost
metadata:
annotations:
airshipit.org/clustertype: target
name: include-machine
spec:
online: true
bootMACAddress: 01:3b:8b:0c:ec:8b
bmc:
address: ipmi://192.168.111.2:6230
credentialsName: master-1-bmc-secret
---
apiVersion: v1
kind: Secret
metadata:
annotations:
airshipit.org/clustertype: target
name: include-machine-secret
type: Opaque
data:
username: YWRtaW4=
password: cGFzc3dvcmQ=
...