mirror of
https://github.com/vmware-tanzu/velero.git
synced 2025-12-23 06:15:21 +00:00
Add location resources and tests (#1277)
Add locations and tests to install package Signed-off-by: Nolan Brubaker <brubakern@vmware.com>
This commit is contained in:
committed by
Steve Kriss
parent
b286c652ec
commit
503b112638
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2018 the Heptio Ark contributors.
|
Copyright 2018, 2019 the Velero contributors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -41,6 +41,10 @@ func crd(kind, plural string) *apiextv1beta1.CustomResourceDefinition {
|
|||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: fmt.Sprintf("%s.%s", plural, velerov1api.GroupName),
|
Name: fmt.Sprintf("%s.%s", plural, velerov1api.GroupName),
|
||||||
},
|
},
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
Kind: "CustomResourceDefinition",
|
||||||
|
APIVersion: apiextv1beta1.SchemeGroupVersion.String(),
|
||||||
|
},
|
||||||
Spec: apiextv1beta1.CustomResourceDefinitionSpec{
|
Spec: apiextv1beta1.CustomResourceDefinitionSpec{
|
||||||
Group: velerov1api.GroupName,
|
Group: velerov1api.GroupName,
|
||||||
Version: velerov1api.SchemeGroupVersion.Version,
|
Version: velerov1api.SchemeGroupVersion.Version,
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2018 the Heptio Ark contributors.
|
Copyright 2018, 2019 the Velero contributors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -42,6 +42,10 @@ func DaemonSet(namespace string, opts ...podTemplateOption) *appsv1.DaemonSet {
|
|||||||
|
|
||||||
daemonSet := &appsv1.DaemonSet{
|
daemonSet := &appsv1.DaemonSet{
|
||||||
ObjectMeta: objectMeta(namespace, "restic"),
|
ObjectMeta: objectMeta(namespace, "restic"),
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
Kind: "DaemonSet",
|
||||||
|
APIVersion: appsv1.SchemeGroupVersion.String(),
|
||||||
|
},
|
||||||
Spec: appsv1.DaemonSetSpec{
|
Spec: appsv1.DaemonSetSpec{
|
||||||
Selector: &metav1.LabelSelector{
|
Selector: &metav1.LabelSelector{
|
||||||
MatchLabels: map[string]string{
|
MatchLabels: map[string]string{
|
||||||
|
|||||||
38
pkg/install/daemonset_test.go
Normal file
38
pkg/install/daemonset_test.go
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2019 the Velero contributors.
|
||||||
|
|
||||||
|
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 install
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
corev1 "k8s.io/api/core/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestDaemonSet(t *testing.T) {
|
||||||
|
ds := DaemonSet("velero")
|
||||||
|
|
||||||
|
assert.Equal(t, "restic", ds.Spec.Template.Spec.Containers[0].Name)
|
||||||
|
assert.Equal(t, "velero", ds.ObjectMeta.Namespace)
|
||||||
|
|
||||||
|
ds = DaemonSet("velero", WithoutCredentialsVolume())
|
||||||
|
assert.Equal(t, 1, len(ds.Spec.Template.Spec.Volumes))
|
||||||
|
|
||||||
|
ds = DaemonSet("velero", WithImage("gcr.io/heptio-images/velero:v0.11"))
|
||||||
|
assert.Equal(t, "gcr.io/heptio-images/velero:v0.11", ds.Spec.Template.Spec.Containers[0].Image)
|
||||||
|
assert.Equal(t, corev1.PullIfNotPresent, ds.Spec.Template.Spec.Containers[0].ImagePullPolicy)
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2018 the Heptio Ark contributors.
|
Copyright 2018, 2019 the Velero contributors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -30,6 +30,7 @@ type podTemplateConfig struct {
|
|||||||
image string
|
image string
|
||||||
withoutCredentialsVolume bool
|
withoutCredentialsVolume bool
|
||||||
envVars []corev1.EnvVar
|
envVars []corev1.EnvVar
|
||||||
|
restoreOnly bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithImage(image string) podTemplateOption {
|
func WithImage(image string) podTemplateOption {
|
||||||
@@ -60,7 +61,14 @@ func WithEnvFromSecretKey(varName, secret, key string) podTemplateOption {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func WithRestoreOnly() podTemplateOption {
|
||||||
|
return func(c *podTemplateConfig) {
|
||||||
|
c.restoreOnly = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func Deployment(namespace string, opts ...podTemplateOption) *appsv1beta1.Deployment {
|
func Deployment(namespace string, opts ...podTemplateOption) *appsv1beta1.Deployment {
|
||||||
|
// TODO: Add support for server args
|
||||||
c := &podTemplateConfig{
|
c := &podTemplateConfig{
|
||||||
image: "gcr.io/heptio-images/velero:latest",
|
image: "gcr.io/heptio-images/velero:latest",
|
||||||
}
|
}
|
||||||
@@ -78,6 +86,10 @@ func Deployment(namespace string, opts ...podTemplateOption) *appsv1beta1.Deploy
|
|||||||
|
|
||||||
deployment := &appsv1beta1.Deployment{
|
deployment := &appsv1beta1.Deployment{
|
||||||
ObjectMeta: objectMeta(namespace, "velero"),
|
ObjectMeta: objectMeta(namespace, "velero"),
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
Kind: "Deployment",
|
||||||
|
APIVersion: appsv1beta1.SchemeGroupVersion.String(),
|
||||||
|
},
|
||||||
Spec: appsv1beta1.DeploymentSpec{
|
Spec: appsv1beta1.DeploymentSpec{
|
||||||
Template: corev1.PodTemplateSpec{
|
Template: corev1.PodTemplateSpec{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
@@ -152,5 +164,11 @@ func Deployment(namespace string, opts ...podTemplateOption) *appsv1beta1.Deploy
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
deployment.Spec.Template.Spec.Containers[0].Env = append(deployment.Spec.Template.Spec.Containers[0].Env, c.envVars...)
|
||||||
|
|
||||||
|
if c.restoreOnly {
|
||||||
|
deployment.Spec.Template.Spec.Containers[0].Args = append(deployment.Spec.Template.Spec.Containers[0].Args, "--restore-only")
|
||||||
|
}
|
||||||
|
|
||||||
return deployment
|
return deployment
|
||||||
}
|
}
|
||||||
|
|||||||
46
pkg/install/deployment_test.go
Normal file
46
pkg/install/deployment_test.go
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2019 the Velero contributors.
|
||||||
|
|
||||||
|
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 install
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
corev1 "k8s.io/api/core/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestDeployment(t *testing.T) {
|
||||||
|
deploy := Deployment("velero")
|
||||||
|
|
||||||
|
assert.Equal(t, "velero", deploy.ObjectMeta.Namespace)
|
||||||
|
|
||||||
|
deploy = Deployment("velero", WithRestoreOnly())
|
||||||
|
assert.Equal(t, "--restore-only", deploy.Spec.Template.Spec.Containers[0].Args[1])
|
||||||
|
|
||||||
|
deploy = Deployment("velero", WithEnvFromSecretKey("my-var", "my-secret", "my-key"))
|
||||||
|
envSecret := deploy.Spec.Template.Spec.Containers[0].Env[2]
|
||||||
|
assert.Equal(t, "my-var", envSecret.Name)
|
||||||
|
assert.Equal(t, "my-secret", envSecret.ValueFrom.SecretKeyRef.LocalObjectReference.Name)
|
||||||
|
assert.Equal(t, "my-key", envSecret.ValueFrom.SecretKeyRef.Key)
|
||||||
|
|
||||||
|
deploy = Deployment("velero", WithoutCredentialsVolume())
|
||||||
|
assert.Equal(t, 1, len(deploy.Spec.Template.Spec.Volumes))
|
||||||
|
|
||||||
|
deploy = Deployment("velero", WithImage("gcr.io/heptio-images/velero:v0.11"))
|
||||||
|
assert.Equal(t, "gcr.io/heptio-images/velero:v0.11", deploy.Spec.Template.Spec.Containers[0].Image)
|
||||||
|
assert.Equal(t, corev1.PullIfNotPresent, deploy.Spec.Template.Spec.Containers[0].ImagePullPolicy)
|
||||||
|
}
|
||||||
19
pkg/install/doc.go
Normal file
19
pkg/install/doc.go
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2019 the Velero contributors.
|
||||||
|
|
||||||
|
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 install provides public functions for easily creating and installing
|
||||||
|
// resources necessary for Velero to operate. Some default settings are assumed with these functions.
|
||||||
|
package install
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2018 the Heptio Ark contributors.
|
Copyright 2018, 2019 the Velero contributors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -20,6 +20,8 @@ import (
|
|||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
rbacv1beta1 "k8s.io/api/rbac/v1beta1"
|
rbacv1beta1 "k8s.io/api/rbac/v1beta1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
|
||||||
|
"github.com/heptio/velero/pkg/apis/velero/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
func labels() map[string]string {
|
func labels() map[string]string {
|
||||||
@@ -56,13 +58,19 @@ func objectMeta(namespace, name string) metav1.ObjectMeta {
|
|||||||
func ServiceAccount(namespace string) *corev1.ServiceAccount {
|
func ServiceAccount(namespace string) *corev1.ServiceAccount {
|
||||||
return &corev1.ServiceAccount{
|
return &corev1.ServiceAccount{
|
||||||
ObjectMeta: objectMeta(namespace, "velero"),
|
ObjectMeta: objectMeta(namespace, "velero"),
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
Kind: "ServiceAccount",
|
||||||
|
APIVersion: corev1.SchemeGroupVersion.String(),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ClusterRoleBinding(namespace string) *rbacv1beta1.ClusterRoleBinding {
|
func ClusterRoleBinding(namespace string) *rbacv1beta1.ClusterRoleBinding {
|
||||||
return &rbacv1beta1.ClusterRoleBinding{
|
crb := &rbacv1beta1.ClusterRoleBinding{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: objectMeta("", "velero"),
|
||||||
Name: "velero",
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
Kind: "ClusterRoleBinding",
|
||||||
|
APIVersion: rbacv1beta1.SchemeGroupVersion.String(),
|
||||||
},
|
},
|
||||||
Subjects: []rbacv1beta1.Subject{
|
Subjects: []rbacv1beta1.Subject{
|
||||||
{
|
{
|
||||||
@@ -77,12 +85,50 @@ func ClusterRoleBinding(namespace string) *rbacv1beta1.ClusterRoleBinding {
|
|||||||
APIGroup: "rbac.authorization.k8s.io",
|
APIGroup: "rbac.authorization.k8s.io",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return crb
|
||||||
}
|
}
|
||||||
|
|
||||||
func Namespace(namespace string) *corev1.Namespace {
|
func Namespace(namespace string) *corev1.Namespace {
|
||||||
return &corev1.Namespace{
|
return &corev1.Namespace{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: objectMeta("", namespace),
|
||||||
Name: namespace,
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
Kind: "Namespace",
|
||||||
|
APIVersion: corev1.SchemeGroupVersion.String(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func BackupStorageLocation(namespace, provider, bucket, prefix string, config map[string]string) *v1.BackupStorageLocation {
|
||||||
|
return &v1.BackupStorageLocation{
|
||||||
|
ObjectMeta: objectMeta(namespace, "default"),
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
Kind: "BackupStorageLocation",
|
||||||
|
APIVersion: v1.SchemeGroupVersion.String(),
|
||||||
|
},
|
||||||
|
Spec: v1.BackupStorageLocationSpec{
|
||||||
|
Provider: provider,
|
||||||
|
StorageType: v1.StorageType{
|
||||||
|
ObjectStorage: &v1.ObjectStorageLocation{
|
||||||
|
Bucket: bucket,
|
||||||
|
Prefix: prefix,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Config: config,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func VolumeSnapshotLocation(namespace, provider string, config map[string]string) *v1.VolumeSnapshotLocation {
|
||||||
|
return &v1.VolumeSnapshotLocation{
|
||||||
|
ObjectMeta: objectMeta(namespace, "default"),
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
Kind: "VolumeSnapshotLocation",
|
||||||
|
APIVersion: v1.SchemeGroupVersion.String(),
|
||||||
|
},
|
||||||
|
Spec: v1.VolumeSnapshotLocationSpec{
|
||||||
|
Provider: provider,
|
||||||
|
Config: config,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
50
pkg/install/resources_test.go
Normal file
50
pkg/install/resources_test.go
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2019 the Velero contributors.
|
||||||
|
|
||||||
|
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 install
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestResources(t *testing.T) {
|
||||||
|
bsl := BackupStorageLocation("velero", "test", "test", "", make(map[string]string))
|
||||||
|
|
||||||
|
assert.Equal(t, "velero", bsl.ObjectMeta.Namespace)
|
||||||
|
assert.Equal(t, "test", bsl.Spec.Provider)
|
||||||
|
assert.Equal(t, "test", bsl.Spec.StorageType.ObjectStorage.Bucket)
|
||||||
|
assert.Equal(t, make(map[string]string), bsl.Spec.Config)
|
||||||
|
|
||||||
|
vsl := VolumeSnapshotLocation("velero", "test", make(map[string]string))
|
||||||
|
|
||||||
|
assert.Equal(t, "velero", vsl.ObjectMeta.Namespace)
|
||||||
|
assert.Equal(t, "test", vsl.Spec.Provider)
|
||||||
|
assert.Equal(t, make(map[string]string), vsl.Spec.Config)
|
||||||
|
|
||||||
|
ns := Namespace("velero")
|
||||||
|
|
||||||
|
assert.Equal(t, "velero", ns.Name)
|
||||||
|
|
||||||
|
crb := ClusterRoleBinding("velero")
|
||||||
|
// The CRB is a cluster-scoped resource
|
||||||
|
assert.Equal(t, "", crb.ObjectMeta.Namespace)
|
||||||
|
assert.Equal(t, "velero", crb.Subjects[0].Namespace)
|
||||||
|
|
||||||
|
sa := ServiceAccount("velero")
|
||||||
|
assert.Equal(t, "velero", sa.ObjectMeta.Namespace)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user