diff --git a/pkg/migration/fake/mocks/mock.go b/pkg/migration/fake/mocks/mock.go new file mode 100644 index 00000000..1d81bf8b --- /dev/null +++ b/pkg/migration/fake/mocks/mock.go @@ -0,0 +1,631 @@ +// Copyright 2021 Upbound Inc. +// +// 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. + +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/crossplane/crossplane-runtime/pkg/resource (interfaces: Managed) + +// Package mocks is a generated GoMock package. +package mocks + +import ( + reflect "reflect" + + v1 "github.com/crossplane/crossplane-runtime/apis/common/v1" + gomock "github.com/golang/mock/gomock" + v10 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" +) + +// MockManaged is a mock of Managed interface. +type MockManaged struct { + ctrl *gomock.Controller + recorder *MockManagedMockRecorder +} + +// MockManagedMockRecorder is the mock recorder for MockManaged. +type MockManagedMockRecorder struct { + mock *MockManaged +} + +// NewMockManaged creates a new mock instance. +func NewMockManaged(ctrl *gomock.Controller) *MockManaged { + mock := &MockManaged{ctrl: ctrl} + mock.recorder = &MockManagedMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockManaged) EXPECT() *MockManagedMockRecorder { + return m.recorder +} + +// DeepCopyObject mocks base method. +func (m *MockManaged) DeepCopyObject() runtime.Object { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeepCopyObject") + ret0, _ := ret[0].(runtime.Object) + return ret0 +} + +// DeepCopyObject indicates an expected call of DeepCopyObject. +func (mr *MockManagedMockRecorder) DeepCopyObject() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeepCopyObject", reflect.TypeOf((*MockManaged)(nil).DeepCopyObject)) +} + +// GetAnnotations mocks base method. +func (m *MockManaged) GetAnnotations() map[string]string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetAnnotations") + ret0, _ := ret[0].(map[string]string) + return ret0 +} + +// GetAnnotations indicates an expected call of GetAnnotations. +func (mr *MockManagedMockRecorder) GetAnnotations() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAnnotations", reflect.TypeOf((*MockManaged)(nil).GetAnnotations)) +} + +// GetCondition mocks base method. +func (m *MockManaged) GetCondition(arg0 v1.ConditionType) v1.Condition { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetCondition", arg0) + ret0, _ := ret[0].(v1.Condition) + return ret0 +} + +// GetCondition indicates an expected call of GetCondition. +func (mr *MockManagedMockRecorder) GetCondition(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCondition", reflect.TypeOf((*MockManaged)(nil).GetCondition), arg0) +} + +// GetCreationTimestamp mocks base method. +func (m *MockManaged) GetCreationTimestamp() v10.Time { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetCreationTimestamp") + ret0, _ := ret[0].(v10.Time) + return ret0 +} + +// GetCreationTimestamp indicates an expected call of GetCreationTimestamp. +func (mr *MockManagedMockRecorder) GetCreationTimestamp() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCreationTimestamp", reflect.TypeOf((*MockManaged)(nil).GetCreationTimestamp)) +} + +// GetDeletionGracePeriodSeconds mocks base method. +func (m *MockManaged) GetDeletionGracePeriodSeconds() *int64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetDeletionGracePeriodSeconds") + ret0, _ := ret[0].(*int64) + return ret0 +} + +// GetDeletionGracePeriodSeconds indicates an expected call of GetDeletionGracePeriodSeconds. +func (mr *MockManagedMockRecorder) GetDeletionGracePeriodSeconds() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDeletionGracePeriodSeconds", reflect.TypeOf((*MockManaged)(nil).GetDeletionGracePeriodSeconds)) +} + +// GetDeletionPolicy mocks base method. +func (m *MockManaged) GetDeletionPolicy() v1.DeletionPolicy { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetDeletionPolicy") + ret0, _ := ret[0].(v1.DeletionPolicy) + return ret0 +} + +// GetDeletionPolicy indicates an expected call of GetDeletionPolicy. +func (mr *MockManagedMockRecorder) GetDeletionPolicy() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDeletionPolicy", reflect.TypeOf((*MockManaged)(nil).GetDeletionPolicy)) +} + +// GetDeletionTimestamp mocks base method. +func (m *MockManaged) GetDeletionTimestamp() *v10.Time { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetDeletionTimestamp") + ret0, _ := ret[0].(*v10.Time) + return ret0 +} + +// GetDeletionTimestamp indicates an expected call of GetDeletionTimestamp. +func (mr *MockManagedMockRecorder) GetDeletionTimestamp() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDeletionTimestamp", reflect.TypeOf((*MockManaged)(nil).GetDeletionTimestamp)) +} + +// GetFinalizers mocks base method. +func (m *MockManaged) GetFinalizers() []string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetFinalizers") + ret0, _ := ret[0].([]string) + return ret0 +} + +// GetFinalizers indicates an expected call of GetFinalizers. +func (mr *MockManagedMockRecorder) GetFinalizers() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetFinalizers", reflect.TypeOf((*MockManaged)(nil).GetFinalizers)) +} + +// GetGenerateName mocks base method. +func (m *MockManaged) GetGenerateName() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetGenerateName") + ret0, _ := ret[0].(string) + return ret0 +} + +// GetGenerateName indicates an expected call of GetGenerateName. +func (mr *MockManagedMockRecorder) GetGenerateName() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetGenerateName", reflect.TypeOf((*MockManaged)(nil).GetGenerateName)) +} + +// GetGeneration mocks base method. +func (m *MockManaged) GetGeneration() int64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetGeneration") + ret0, _ := ret[0].(int64) + return ret0 +} + +// GetGeneration indicates an expected call of GetGeneration. +func (mr *MockManagedMockRecorder) GetGeneration() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetGeneration", reflect.TypeOf((*MockManaged)(nil).GetGeneration)) +} + +// GetLabels mocks base method. +func (m *MockManaged) GetLabels() map[string]string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetLabels") + ret0, _ := ret[0].(map[string]string) + return ret0 +} + +// GetLabels indicates an expected call of GetLabels. +func (mr *MockManagedMockRecorder) GetLabels() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetLabels", reflect.TypeOf((*MockManaged)(nil).GetLabels)) +} + +// GetManagedFields mocks base method. +func (m *MockManaged) GetManagedFields() []v10.ManagedFieldsEntry { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetManagedFields") + ret0, _ := ret[0].([]v10.ManagedFieldsEntry) + return ret0 +} + +// GetManagedFields indicates an expected call of GetManagedFields. +func (mr *MockManagedMockRecorder) GetManagedFields() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetManagedFields", reflect.TypeOf((*MockManaged)(nil).GetManagedFields)) +} + +// GetName mocks base method. +func (m *MockManaged) GetName() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetName") + ret0, _ := ret[0].(string) + return ret0 +} + +// GetName indicates an expected call of GetName. +func (mr *MockManagedMockRecorder) GetName() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetName", reflect.TypeOf((*MockManaged)(nil).GetName)) +} + +// GetNamespace mocks base method. +func (m *MockManaged) GetNamespace() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetNamespace") + ret0, _ := ret[0].(string) + return ret0 +} + +// GetNamespace indicates an expected call of GetNamespace. +func (mr *MockManagedMockRecorder) GetNamespace() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNamespace", reflect.TypeOf((*MockManaged)(nil).GetNamespace)) +} + +// GetObjectKind mocks base method. +func (m *MockManaged) GetObjectKind() schema.ObjectKind { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetObjectKind") + ret0, _ := ret[0].(schema.ObjectKind) + return ret0 +} + +// GetObjectKind indicates an expected call of GetObjectKind. +func (mr *MockManagedMockRecorder) GetObjectKind() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetObjectKind", reflect.TypeOf((*MockManaged)(nil).GetObjectKind)) +} + +// GetOwnerReferences mocks base method. +func (m *MockManaged) GetOwnerReferences() []v10.OwnerReference { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetOwnerReferences") + ret0, _ := ret[0].([]v10.OwnerReference) + return ret0 +} + +// GetOwnerReferences indicates an expected call of GetOwnerReferences. +func (mr *MockManagedMockRecorder) GetOwnerReferences() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetOwnerReferences", reflect.TypeOf((*MockManaged)(nil).GetOwnerReferences)) +} + +// GetProviderConfigReference mocks base method. +func (m *MockManaged) GetProviderConfigReference() *v1.Reference { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetProviderConfigReference") + ret0, _ := ret[0].(*v1.Reference) + return ret0 +} + +// GetProviderConfigReference indicates an expected call of GetProviderConfigReference. +func (mr *MockManagedMockRecorder) GetProviderConfigReference() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetProviderConfigReference", reflect.TypeOf((*MockManaged)(nil).GetProviderConfigReference)) +} + +// GetProviderReference mocks base method. +func (m *MockManaged) GetProviderReference() *v1.Reference { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetProviderReference") + ret0, _ := ret[0].(*v1.Reference) + return ret0 +} + +// GetProviderReference indicates an expected call of GetProviderReference. +func (mr *MockManagedMockRecorder) GetProviderReference() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetProviderReference", reflect.TypeOf((*MockManaged)(nil).GetProviderReference)) +} + +// GetPublishConnectionDetailsTo mocks base method. +func (m *MockManaged) GetPublishConnectionDetailsTo() *v1.PublishConnectionDetailsTo { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetPublishConnectionDetailsTo") + ret0, _ := ret[0].(*v1.PublishConnectionDetailsTo) + return ret0 +} + +// GetPublishConnectionDetailsTo indicates an expected call of GetPublishConnectionDetailsTo. +func (mr *MockManagedMockRecorder) GetPublishConnectionDetailsTo() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetPublishConnectionDetailsTo", reflect.TypeOf((*MockManaged)(nil).GetPublishConnectionDetailsTo)) +} + +// GetResourceVersion mocks base method. +func (m *MockManaged) GetResourceVersion() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetResourceVersion") + ret0, _ := ret[0].(string) + return ret0 +} + +// GetResourceVersion indicates an expected call of GetResourceVersion. +func (mr *MockManagedMockRecorder) GetResourceVersion() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetResourceVersion", reflect.TypeOf((*MockManaged)(nil).GetResourceVersion)) +} + +// GetSelfLink mocks base method. +func (m *MockManaged) GetSelfLink() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetSelfLink") + ret0, _ := ret[0].(string) + return ret0 +} + +// GetSelfLink indicates an expected call of GetSelfLink. +func (mr *MockManagedMockRecorder) GetSelfLink() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSelfLink", reflect.TypeOf((*MockManaged)(nil).GetSelfLink)) +} + +// GetUID mocks base method. +func (m *MockManaged) GetUID() types.UID { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetUID") + ret0, _ := ret[0].(types.UID) + return ret0 +} + +// GetUID indicates an expected call of GetUID. +func (mr *MockManagedMockRecorder) GetUID() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetUID", reflect.TypeOf((*MockManaged)(nil).GetUID)) +} + +// GetWriteConnectionSecretToReference mocks base method. +func (m *MockManaged) GetWriteConnectionSecretToReference() *v1.SecretReference { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetWriteConnectionSecretToReference") + ret0, _ := ret[0].(*v1.SecretReference) + return ret0 +} + +// GetWriteConnectionSecretToReference indicates an expected call of GetWriteConnectionSecretToReference. +func (mr *MockManagedMockRecorder) GetWriteConnectionSecretToReference() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetWriteConnectionSecretToReference", reflect.TypeOf((*MockManaged)(nil).GetWriteConnectionSecretToReference)) +} + +// SetAnnotations mocks base method. +func (m *MockManaged) SetAnnotations(arg0 map[string]string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetAnnotations", arg0) +} + +// SetAnnotations indicates an expected call of SetAnnotations. +func (mr *MockManagedMockRecorder) SetAnnotations(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetAnnotations", reflect.TypeOf((*MockManaged)(nil).SetAnnotations), arg0) +} + +// SetConditions mocks base method. +func (m *MockManaged) SetConditions(arg0 ...v1.Condition) { + m.ctrl.T.Helper() + varargs := []interface{}{} + for _, a := range arg0 { + varargs = append(varargs, a) + } + m.ctrl.Call(m, "SetConditions", varargs...) +} + +// SetConditions indicates an expected call of SetConditions. +func (mr *MockManagedMockRecorder) SetConditions(arg0 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetConditions", reflect.TypeOf((*MockManaged)(nil).SetConditions), arg0...) +} + +// SetCreationTimestamp mocks base method. +func (m *MockManaged) SetCreationTimestamp(arg0 v10.Time) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetCreationTimestamp", arg0) +} + +// SetCreationTimestamp indicates an expected call of SetCreationTimestamp. +func (mr *MockManagedMockRecorder) SetCreationTimestamp(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetCreationTimestamp", reflect.TypeOf((*MockManaged)(nil).SetCreationTimestamp), arg0) +} + +// SetDeletionGracePeriodSeconds mocks base method. +func (m *MockManaged) SetDeletionGracePeriodSeconds(arg0 *int64) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetDeletionGracePeriodSeconds", arg0) +} + +// SetDeletionGracePeriodSeconds indicates an expected call of SetDeletionGracePeriodSeconds. +func (mr *MockManagedMockRecorder) SetDeletionGracePeriodSeconds(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetDeletionGracePeriodSeconds", reflect.TypeOf((*MockManaged)(nil).SetDeletionGracePeriodSeconds), arg0) +} + +// SetDeletionPolicy mocks base method. +func (m *MockManaged) SetDeletionPolicy(arg0 v1.DeletionPolicy) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetDeletionPolicy", arg0) +} + +// SetDeletionPolicy indicates an expected call of SetDeletionPolicy. +func (mr *MockManagedMockRecorder) SetDeletionPolicy(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetDeletionPolicy", reflect.TypeOf((*MockManaged)(nil).SetDeletionPolicy), arg0) +} + +// SetDeletionTimestamp mocks base method. +func (m *MockManaged) SetDeletionTimestamp(arg0 *v10.Time) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetDeletionTimestamp", arg0) +} + +// SetDeletionTimestamp indicates an expected call of SetDeletionTimestamp. +func (mr *MockManagedMockRecorder) SetDeletionTimestamp(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetDeletionTimestamp", reflect.TypeOf((*MockManaged)(nil).SetDeletionTimestamp), arg0) +} + +// SetFinalizers mocks base method. +func (m *MockManaged) SetFinalizers(arg0 []string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetFinalizers", arg0) +} + +// SetFinalizers indicates an expected call of SetFinalizers. +func (mr *MockManagedMockRecorder) SetFinalizers(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetFinalizers", reflect.TypeOf((*MockManaged)(nil).SetFinalizers), arg0) +} + +// SetGenerateName mocks base method. +func (m *MockManaged) SetGenerateName(arg0 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetGenerateName", arg0) +} + +// SetGenerateName indicates an expected call of SetGenerateName. +func (mr *MockManagedMockRecorder) SetGenerateName(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetGenerateName", reflect.TypeOf((*MockManaged)(nil).SetGenerateName), arg0) +} + +// SetGeneration mocks base method. +func (m *MockManaged) SetGeneration(arg0 int64) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetGeneration", arg0) +} + +// SetGeneration indicates an expected call of SetGeneration. +func (mr *MockManagedMockRecorder) SetGeneration(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetGeneration", reflect.TypeOf((*MockManaged)(nil).SetGeneration), arg0) +} + +// SetLabels mocks base method. +func (m *MockManaged) SetLabels(arg0 map[string]string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetLabels", arg0) +} + +// SetLabels indicates an expected call of SetLabels. +func (mr *MockManagedMockRecorder) SetLabels(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetLabels", reflect.TypeOf((*MockManaged)(nil).SetLabels), arg0) +} + +// SetManagedFields mocks base method. +func (m *MockManaged) SetManagedFields(arg0 []v10.ManagedFieldsEntry) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetManagedFields", arg0) +} + +// SetManagedFields indicates an expected call of SetManagedFields. +func (mr *MockManagedMockRecorder) SetManagedFields(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetManagedFields", reflect.TypeOf((*MockManaged)(nil).SetManagedFields), arg0) +} + +// SetName mocks base method. +func (m *MockManaged) SetName(arg0 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetName", arg0) +} + +// SetName indicates an expected call of SetName. +func (mr *MockManagedMockRecorder) SetName(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetName", reflect.TypeOf((*MockManaged)(nil).SetName), arg0) +} + +// SetNamespace mocks base method. +func (m *MockManaged) SetNamespace(arg0 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetNamespace", arg0) +} + +// SetNamespace indicates an expected call of SetNamespace. +func (mr *MockManagedMockRecorder) SetNamespace(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetNamespace", reflect.TypeOf((*MockManaged)(nil).SetNamespace), arg0) +} + +// SetOwnerReferences mocks base method. +func (m *MockManaged) SetOwnerReferences(arg0 []v10.OwnerReference) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetOwnerReferences", arg0) +} + +// SetOwnerReferences indicates an expected call of SetOwnerReferences. +func (mr *MockManagedMockRecorder) SetOwnerReferences(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetOwnerReferences", reflect.TypeOf((*MockManaged)(nil).SetOwnerReferences), arg0) +} + +// SetProviderConfigReference mocks base method. +func (m *MockManaged) SetProviderConfigReference(arg0 *v1.Reference) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetProviderConfigReference", arg0) +} + +// SetProviderConfigReference indicates an expected call of SetProviderConfigReference. +func (mr *MockManagedMockRecorder) SetProviderConfigReference(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetProviderConfigReference", reflect.TypeOf((*MockManaged)(nil).SetProviderConfigReference), arg0) +} + +// SetProviderReference mocks base method. +func (m *MockManaged) SetProviderReference(arg0 *v1.Reference) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetProviderReference", arg0) +} + +// SetProviderReference indicates an expected call of SetProviderReference. +func (mr *MockManagedMockRecorder) SetProviderReference(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetProviderReference", reflect.TypeOf((*MockManaged)(nil).SetProviderReference), arg0) +} + +// SetPublishConnectionDetailsTo mocks base method. +func (m *MockManaged) SetPublishConnectionDetailsTo(arg0 *v1.PublishConnectionDetailsTo) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetPublishConnectionDetailsTo", arg0) +} + +// SetPublishConnectionDetailsTo indicates an expected call of SetPublishConnectionDetailsTo. +func (mr *MockManagedMockRecorder) SetPublishConnectionDetailsTo(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetPublishConnectionDetailsTo", reflect.TypeOf((*MockManaged)(nil).SetPublishConnectionDetailsTo), arg0) +} + +// SetResourceVersion mocks base method. +func (m *MockManaged) SetResourceVersion(arg0 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetResourceVersion", arg0) +} + +// SetResourceVersion indicates an expected call of SetResourceVersion. +func (mr *MockManagedMockRecorder) SetResourceVersion(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetResourceVersion", reflect.TypeOf((*MockManaged)(nil).SetResourceVersion), arg0) +} + +// SetSelfLink mocks base method. +func (m *MockManaged) SetSelfLink(arg0 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetSelfLink", arg0) +} + +// SetSelfLink indicates an expected call of SetSelfLink. +func (mr *MockManagedMockRecorder) SetSelfLink(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetSelfLink", reflect.TypeOf((*MockManaged)(nil).SetSelfLink), arg0) +} + +// SetUID mocks base method. +func (m *MockManaged) SetUID(arg0 types.UID) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetUID", arg0) +} + +// SetUID indicates an expected call of SetUID. +func (mr *MockManagedMockRecorder) SetUID(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetUID", reflect.TypeOf((*MockManaged)(nil).SetUID), arg0) +} + +// SetWriteConnectionSecretToReference mocks base method. +func (m *MockManaged) SetWriteConnectionSecretToReference(arg0 *v1.SecretReference) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetWriteConnectionSecretToReference", arg0) +} + +// SetWriteConnectionSecretToReference indicates an expected call of SetWriteConnectionSecretToReference. +func (mr *MockManagedMockRecorder) SetWriteConnectionSecretToReference(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWriteConnectionSecretToReference", reflect.TypeOf((*MockManaged)(nil).SetWriteConnectionSecretToReference), arg0) +} diff --git a/pkg/migration/fake/objects.go b/pkg/migration/fake/objects.go new file mode 100644 index 00000000..fd515366 --- /dev/null +++ b/pkg/migration/fake/objects.go @@ -0,0 +1,108 @@ +// Copyright 2022 Upbound Inc. +// +// 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. + +//go:generate go run github.com/golang/mock/mockgen -copyright_file ../../../hack/boilerplate.txt -destination=./mocks/mock.go -package mocks github.com/crossplane/crossplane-runtime/pkg/resource Managed + +package fake + +import ( + xpv1 "github.com/crossplane/crossplane-runtime/apis/common/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + + "github.com/upbound/upjet/pkg/migration/fake/mocks" +) + +const ( + MigrationSourceGroup = "fakesourceapi" + MigrationSourceVersion = "v1alpha1" + MigrationSourceKind = "VPC" + + MigrationTargetGroup = "faketargetapi" + MigrationTargetVersion = "v1alpha1" + MigrationTargetKind = "VPC" +) + +var ( + MigrationSourceGVK = schema.GroupVersionKind{ + Group: MigrationSourceGroup, + Version: MigrationSourceVersion, + Kind: MigrationSourceKind, + } + + MigrationTargetGVK = schema.GroupVersionKind{ + Group: MigrationTargetGroup, + Version: MigrationTargetVersion, + Kind: MigrationTargetKind, + } +) + +type MigrationSourceObject struct { + mocks.MockManaged + // cannot inline v1.TypeMeta here as mocks.MockManaged is also inlined + APIVersion string `json:"apiVersion,omitempty"` + Kind string `json:"kind,omitempty"` + // cannot inline v1.ObjectMeta here as mocks.MockManaged is also inlined + ObjectMeta ObjectMeta `json:"metadata,omitempty"` + Spec SourceSpec `json:"spec"` + Status Status `json:"status,omitempty"` +} + +type SourceSpec struct { + xpv1.ResourceSpec `json:",inline"` + ForProvider SourceSpecParameters `json:"forProvider"` +} + +type SourceSpecParameters struct { + Region *string `json:"region,omitempty"` + CIDRBlock string `json:"cidrBlock"` + Tags []Tag `json:"tags,omitempty"` +} + +type Tag struct { + Key string `json:"key"` + Value string `json:"value"` +} + +type Status struct { + xpv1.ResourceStatus `json:",inline"` + AtProvider Observation `json:"atProvider,omitempty"` +} + +type Observation struct{} + +type MigrationTargetObject struct { + mocks.MockManaged + // cannot inline v1.TypeMeta here as mocks.MockManaged is also inlined + APIVersion string `json:"apiVersion,omitempty"` + Kind string `json:"kind,omitempty"` + // cannot inline v1.ObjectMeta here as mocks.MockManaged is also inlined + ObjectMeta ObjectMeta `json:"metadata,omitempty"` + Spec TargetSpec `json:"spec"` + Status Status `json:"status,omitempty"` +} + +type ObjectMeta struct { + Name string `json:"name,omitempty"` +} + +type TargetSpec struct { + xpv1.ResourceSpec `json:",inline"` + ForProvider TargetSpecParameters `json:"forProvider"` +} + +type TargetSpecParameters struct { + Region *string `json:"region,omitempty"` + CIDRBlock string `json:"cidrBlock"` + Tags map[string]string `json:"tags,omitempty"` +} diff --git a/pkg/migration/plan_generator.go b/pkg/migration/plan_generator.go index 587bc1be..0913f4aa 100644 --- a/pkg/migration/plan_generator.go +++ b/pkg/migration/plan_generator.go @@ -392,17 +392,8 @@ func (pg *PlanGenerator) stepDeleteOldManagedResource(u *UnstructuredWithMetadat }) } -func addPauseAnnotation(u *unstructured.Unstructured) { - annot := u.GetAnnotations() - if annot == nil { - annot = make(map[string]string) - } - annot[meta.AnnotationKeyReconciliationPaused] = "true" - u.SetAnnotations(annot) -} - func (pg *PlanGenerator) pause(fp string, u *unstructured.Unstructured) error { - addPauseAnnotation(u) + meta.AddAnnotations(u, map[string]string{meta.AnnotationKeyReconciliationPaused: "true"}) return errors.Wrap(pg.target.Put(UnstructuredWithMetadata{ Object: *u, Metadata: Metadata{ @@ -417,7 +408,7 @@ func getQualifiedName(u unstructured.Unstructured) string { } func (pg *PlanGenerator) stepNewManagedResource(u *UnstructuredWithMetadata) error { - addPauseAnnotation(&u.Object) + meta.AddAnnotations(&u.Object, map[string]string{meta.AnnotationKeyReconciliationPaused: "true"}) u.Metadata.Path = fmt.Sprintf("%s/%s.yaml", pg.Plan.Spec.Steps[stepCreateNewManaged].Name, getQualifiedName(u.Object)) pg.Plan.Spec.Steps[stepCreateNewManaged].Apply.Files = append(pg.Plan.Spec.Steps[stepCreateNewManaged].Apply.Files, u.Metadata.Path) if err := pg.target.Put(*u); err != nil { diff --git a/pkg/migration/plan_generator_test.go b/pkg/migration/plan_generator_test.go new file mode 100644 index 00000000..67e28ff7 --- /dev/null +++ b/pkg/migration/plan_generator_test.go @@ -0,0 +1,262 @@ +// Copyright 2022 Upbound Inc. +// +// 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 migration + +import ( + "bytes" + "fmt" + "os" + "path/filepath" + "strings" + "testing" + + "github.com/crossplane/crossplane-runtime/pkg/fieldpath" + xpresource "github.com/crossplane/crossplane-runtime/pkg/resource" + "github.com/crossplane/crossplane-runtime/pkg/test" + v1 "github.com/crossplane/crossplane/apis/apiextensions/v1" + "github.com/google/go-cmp/cmp" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/yaml" + "k8s.io/client-go/kubernetes/scheme" + k8syaml "sigs.k8s.io/yaml" + + "github.com/upbound/upjet/pkg/migration/fake" +) + +func TestGeneratePlan(t *testing.T) { + type fields struct { + source Source + target *testTarget + registry Registry + } + type want struct { + err error + migrationPlanPath string + // names of resource files to be loaded + migratedResourceNames []string + } + tests := map[string]struct { + fields fields + want want + }{ + "PlanWithManagedResourceAndClaim": { + fields: fields{ + source: newTestSource(map[string]Metadata{ + "testdata/plan/sourcevpc.yaml": {}, + "testdata/plan/claim.yaml": {IsClaim: true}, + "testdata/plan/composition.yaml": {}, + "testdata/plan/xrd.yaml": {}, + "testdata/plan/xr.yaml": {IsComposite: true}}), + target: newTestTarget(), + registry: getRegistryWithConverters(map[schema.GroupVersionKind]Converter{ + fake.MigrationSourceGVK: &testConverter{}, + }), + }, + want: want{ + migrationPlanPath: "testdata/plan/migration_plan.yaml", + migratedResourceNames: []string{ + "pause-managed/sample-vpc.vpcs.fakesourceapi.yaml", + "edit-claims/my-resource.myresources.test.com.yaml", + "start-managed/sample-vpc.vpcs.faketargetapi.yaml", + "pause-composites/my-resource-dwjgh.xmyresources.test.com.yaml", + "edit-composites/my-resource-dwjgh.xmyresources.test.com.yaml", + "deletion-policy-orphan/sample-vpc.vpcs.fakesourceapi.yaml", + "new-compositions/example-migrated.compositions.apiextensions.crossplane.io.yaml", + "start-composites/my-resource-dwjgh.xmyresources.test.com.yaml", + "create-new-managed/sample-vpc.vpcs.faketargetapi.yaml", + }, + }, + }, + } + for name, tt := range tests { + t.Run(name, func(t *testing.T) { + pg := NewPlanGenerator(tt.fields.source, tt.fields.target) + err := pg.GeneratePlan() + // compare error state + if diff := cmp.Diff(tt.want.err, err, test.EquateErrors()); diff != "" { + t.Fatalf("GeneratePlan(): -wantError, +gotError: %s", diff) + } + if err != nil { + return + } + // compare generated plan with the expected plan + p, err := loadPlan(tt.want.migrationPlanPath) + if err != nil { + t.Fatalf("Failed to load plan file from path %s: %v", tt.want.migrationPlanPath, err) + } + if diff := cmp.Diff(p, &pg.Plan); diff != "" { + t.Errorf("GeneratePlan(): -wantPlan, +gotPlan: %s", diff) + } + // compare generated migration files with the expected ones + for _, name := range tt.want.migratedResourceNames { + path := filepath.Join("testdata/plan/generated", name) + buff, err := os.ReadFile(path) + if err != nil { + t.Fatalf("Failed to read a generated migration resource from path %s: %v", path, err) + } + u := unstructured.Unstructured{} + if err := k8syaml.Unmarshal(buff, &u); err != nil { + t.Fatalf("Failed to unmarshal a generated migration resource from path %s: %v", path, err) + } + gU, ok := tt.fields.target.targetManifests[name] + if !ok { + t.Errorf("GeneratePlan(): Expected generated migration resource file not found: %s", name) + continue + } + if diff := cmp.Diff(u, gU.Object); diff != "" { + t.Errorf("GeneratePlan(): -wantMigratedResource, +gotMigratedResource with name %q: %s", name, diff) + } + delete(tt.fields.target.targetManifests, name) + } + // check for unexpected generated migration files + for name := range tt.fields.target.targetManifests { + t.Errorf("GeneratePlan(): Unexpected generated migration file: %s", name) + } + }) + } +} + +type testSource struct { + sourceManifests map[string]Metadata + paths []string + index int +} + +func newTestSource(sourceManifests map[string]Metadata) *testSource { + result := &testSource{sourceManifests: sourceManifests} + result.paths = make([]string, 0, len(result.sourceManifests)) + for k := range result.sourceManifests { + result.paths = append(result.paths, k) + } + return result +} + +func (f *testSource) HasNext() (bool, error) { + return f.index <= len(f.paths)-1, nil +} + +func (f *testSource) Next() (UnstructuredWithMetadata, error) { + um := UnstructuredWithMetadata{ + Metadata: f.sourceManifests[f.paths[f.index]], + Object: unstructured.Unstructured{}, + } + um.Metadata.Path = f.paths[f.index] + buff, err := os.ReadFile(f.paths[f.index]) + if err != nil { + return um, err + } + decoder := yaml.NewYAMLOrJSONDecoder(bytes.NewBufferString(string(buff)), 1024) + if err := decoder.Decode(&um.Object); err != nil { + return um, err + } + f.index++ + return um, nil +} + +type testTarget struct { + targetManifests map[string]UnstructuredWithMetadata +} + +func newTestTarget() *testTarget { + return &testTarget{ + targetManifests: make(map[string]UnstructuredWithMetadata), + } +} + +func (f *testTarget) Put(o UnstructuredWithMetadata) error { + f.targetManifests[o.Metadata.Path] = o + return nil +} + +func (f *testTarget) Delete(o UnstructuredWithMetadata) error { + delete(f.targetManifests, o.Metadata.Path) + return nil +} + +// can be utilized to populate test artifacts +/*func (f *testTarget) dumpFiles(parentDir string) error { + for f, u := range f.targetManifests { + path := filepath.Join(parentDir, f) + buff, err := k8syaml.Marshal(u.Object.Object) + if err != nil { + return err + } + if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { + return err + } + if err := os.WriteFile(path, buff, 0o600); err != nil { + return err + } + } + return nil +}*/ + +type testConverter struct{} + +func (f *testConverter) Resources(mg xpresource.Managed) ([]xpresource.Managed, error) { + s := mg.(*fake.MigrationSourceObject) + t := &fake.MigrationTargetObject{} + if _, err := CopyInto(s, t, fake.MigrationTargetGVK, "spec.forProvider.tags", "mockManaged"); err != nil { + return nil, err + } + t.Spec.ForProvider.Tags = make(map[string]string, len(s.Spec.ForProvider.Tags)) + for _, tag := range s.Spec.ForProvider.Tags { + v := tag.Value + t.Spec.ForProvider.Tags[tag.Key] = v + } + return []xpresource.Managed{ + t, + }, nil +} + +func (f *testConverter) ComposedTemplates(cmp v1.ComposedTemplate, convertedBase ...*v1.ComposedTemplate) error { + for i, cb := range convertedBase { + for j, p := range cb.Patches { + if p.ToFieldPath == nil || !strings.HasPrefix(*p.ToFieldPath, "spec.forProvider.tags") { + continue + } + u, err := FromRawExtension(cmp.Base) + if err != nil { + return err + } + paved := fieldpath.Pave(u.Object) + key, err := paved.GetString(strings.ReplaceAll(*p.ToFieldPath, ".value", ".key")) + if err != nil { + return err + } + s := fmt.Sprintf(`spec.forProvider.tags["%s"]`, key) + convertedBase[i].Patches[j].ToFieldPath = &s + } + } + return nil +} + +func getRegistryWithConverters(converters map[schema.GroupVersionKind]Converter) Registry { + scheme.Scheme.AddKnownTypeWithName(fake.MigrationSourceGVK, &fake.MigrationSourceObject{}) + for gvk, c := range converters { + RegisterConverter(gvk, c) + } + return registry +} + +func loadPlan(planPath string) (*Plan, error) { + buff, err := os.ReadFile(planPath) + if err != nil { + return nil, err + } + p := &Plan{} + return p, k8syaml.Unmarshal(buff, p) +} diff --git a/pkg/migration/testdata/plan/claim.yaml b/pkg/migration/testdata/plan/claim.yaml new file mode 100644 index 00000000..9dc72a8f --- /dev/null +++ b/pkg/migration/testdata/plan/claim.yaml @@ -0,0 +1,10 @@ +apiVersion: test.com/v1alpha1 +kind: MyResource +metadata: + name: my-resource + namespace: upbound-system +spec: + compositionRef: + name: example + parameters: + tagValue: demo-test diff --git a/pkg/migration/testdata/plan/composition.yaml b/pkg/migration/testdata/plan/composition.yaml new file mode 100644 index 00000000..78ece5e1 --- /dev/null +++ b/pkg/migration/testdata/plan/composition.yaml @@ -0,0 +1,33 @@ +apiVersion: apiextensions.crossplane.io/v1 +kind: Composition +metadata: + labels: + purpose: example + name: example +spec: + compositeTypeRef: + apiVersion: test.com/v1alpha1 + kind: XMyResource + resources: + - base: + apiVersion: fakesourceapi/v1alpha1 + kind: VPC + spec: + forProvider: + cidrBlock: "192.168.0.0/16" + region: "us-west-1" + tags: + - key: key1 + value: val1 + - key: key2 + value: val2 + - key: key3 + value: val3 + name: vpc + patches: + - fromFieldPath: "spec.parameters.tagValue" + toFieldPath: spec.forProvider.tags[0].value + - fromFieldPath: "spec.parameters.tagValue" + toFieldPath: spec.forProvider.tags[1].value + - fromFieldPath: "spec.parameters.tagValue" + toFieldPath: spec.forProvider.tags[2].value diff --git a/pkg/migration/testdata/plan/generated/create-new-managed/sample-vpc.vpcs.faketargetapi.yaml b/pkg/migration/testdata/plan/generated/create-new-managed/sample-vpc.vpcs.faketargetapi.yaml new file mode 100644 index 00000000..8d418694 --- /dev/null +++ b/pkg/migration/testdata/plan/generated/create-new-managed/sample-vpc.vpcs.faketargetapi.yaml @@ -0,0 +1,14 @@ +apiVersion: faketargetapi/v1alpha1 +kind: VPC +metadata: + annotations: {} + name: sample-vpc +mockManaged: + ctrl: null + recorder: null +spec: + forProvider: + cidrBlock: 172.16.0.0/16 + region: us-west-1 + tags: + tag1: value1 diff --git a/pkg/migration/testdata/plan/generated/deletion-policy-orphan/sample-vpc.vpcs.fakesourceapi.yaml b/pkg/migration/testdata/plan/generated/deletion-policy-orphan/sample-vpc.vpcs.fakesourceapi.yaml new file mode 100644 index 00000000..696dd049 --- /dev/null +++ b/pkg/migration/testdata/plan/generated/deletion-policy-orphan/sample-vpc.vpcs.fakesourceapi.yaml @@ -0,0 +1,14 @@ +apiVersion: fakesourceapi/v1alpha1 +kind: VPC +metadata: + annotations: + crossplane.io/paused: "true" + name: sample-vpc +spec: + deletionPolicy: Orphan + forProvider: + cidrBlock: 172.16.0.0/16 + region: us-west-1 + tags: + - key: tag1 + value: value1 diff --git a/pkg/migration/testdata/plan/generated/edit-claims/my-resource.myresources.test.com.yaml b/pkg/migration/testdata/plan/generated/edit-claims/my-resource.myresources.test.com.yaml new file mode 100644 index 00000000..34b8dec9 --- /dev/null +++ b/pkg/migration/testdata/plan/generated/edit-claims/my-resource.myresources.test.com.yaml @@ -0,0 +1,10 @@ +apiVersion: test.com/v1alpha1 +kind: MyResource +metadata: + name: my-resource + namespace: upbound-system +spec: + compositionRef: + name: example-migrated + parameters: + tagValue: demo-test diff --git a/pkg/migration/testdata/plan/generated/edit-composites/my-resource-dwjgh.xmyresources.test.com.yaml b/pkg/migration/testdata/plan/generated/edit-composites/my-resource-dwjgh.xmyresources.test.com.yaml new file mode 100644 index 00000000..4bbdaf4e --- /dev/null +++ b/pkg/migration/testdata/plan/generated/edit-composites/my-resource-dwjgh.xmyresources.test.com.yaml @@ -0,0 +1,36 @@ +apiVersion: test.com/v1alpha1 +kind: XMyResource +metadata: + annotations: {} + creationTimestamp: "2022-12-13T18:38:30Z" + finalizers: + - composite.apiextensions.crossplane.io + generateName: my-resource- + generation: 2 + labels: + crossplane.io/claim-name: my-resource + crossplane.io/claim-namespace: upbound-system + crossplane.io/composite: my-resource-dwjgh + name: my-resource-dwjgh + resourceVersion: "368861" + uid: 443f32ec-670e-4bfe-8976-e2c73e91a011 +spec: + claimRef: + apiVersion: test.com/v1alpha1 + kind: MyResource + name: my-resource + namespace: upbound-system + compositionRef: + name: example-migrated + compositionUpdatePolicy: Automatic + parameters: + tagValue: demo-test + resourceRefs: + - apiVersion: fakesourceapi/v1alpha1 + kind: VPC +status: + conditions: + - lastTransitionTime: "2022-12-13T18:38:31Z" + reason: Creating + status: "False" + type: Ready diff --git a/pkg/migration/testdata/plan/generated/new-compositions/example-migrated.compositions.apiextensions.crossplane.io.yaml b/pkg/migration/testdata/plan/generated/new-compositions/example-migrated.compositions.apiextensions.crossplane.io.yaml new file mode 100644 index 00000000..9ba51787 --- /dev/null +++ b/pkg/migration/testdata/plan/generated/new-compositions/example-migrated.compositions.apiextensions.crossplane.io.yaml @@ -0,0 +1,33 @@ +apiVersion: apiextensions.crossplane.io/v1 +kind: Composition +metadata: + labels: + purpose: example + name: example-migrated +spec: + compositeTypeRef: + apiVersion: test.com/v1alpha1 + kind: XMyResource + resources: + - base: + apiVersion: faketargetapi/v1alpha1 + kind: VPC + mockManaged: + ctrl: null + recorder: null + spec: + forProvider: + cidrBlock: 192.168.0.0/16 + region: us-west-1 + tags: + key1: val1 + key2: val2 + key3: val3 + name: vpc + patches: + - fromFieldPath: spec.parameters.tagValue + toFieldPath: spec.forProvider.tags["key1"] + - fromFieldPath: spec.parameters.tagValue + toFieldPath: spec.forProvider.tags["key2"] + - fromFieldPath: spec.parameters.tagValue + toFieldPath: spec.forProvider.tags["key3"] diff --git a/pkg/migration/testdata/plan/generated/pause-composites/my-resource-dwjgh.xmyresources.test.com.yaml b/pkg/migration/testdata/plan/generated/pause-composites/my-resource-dwjgh.xmyresources.test.com.yaml new file mode 100644 index 00000000..4bbdaf4e --- /dev/null +++ b/pkg/migration/testdata/plan/generated/pause-composites/my-resource-dwjgh.xmyresources.test.com.yaml @@ -0,0 +1,36 @@ +apiVersion: test.com/v1alpha1 +kind: XMyResource +metadata: + annotations: {} + creationTimestamp: "2022-12-13T18:38:30Z" + finalizers: + - composite.apiextensions.crossplane.io + generateName: my-resource- + generation: 2 + labels: + crossplane.io/claim-name: my-resource + crossplane.io/claim-namespace: upbound-system + crossplane.io/composite: my-resource-dwjgh + name: my-resource-dwjgh + resourceVersion: "368861" + uid: 443f32ec-670e-4bfe-8976-e2c73e91a011 +spec: + claimRef: + apiVersion: test.com/v1alpha1 + kind: MyResource + name: my-resource + namespace: upbound-system + compositionRef: + name: example-migrated + compositionUpdatePolicy: Automatic + parameters: + tagValue: demo-test + resourceRefs: + - apiVersion: fakesourceapi/v1alpha1 + kind: VPC +status: + conditions: + - lastTransitionTime: "2022-12-13T18:38:31Z" + reason: Creating + status: "False" + type: Ready diff --git a/pkg/migration/testdata/plan/generated/pause-managed/sample-vpc.vpcs.fakesourceapi.yaml b/pkg/migration/testdata/plan/generated/pause-managed/sample-vpc.vpcs.fakesourceapi.yaml new file mode 100644 index 00000000..696dd049 --- /dev/null +++ b/pkg/migration/testdata/plan/generated/pause-managed/sample-vpc.vpcs.fakesourceapi.yaml @@ -0,0 +1,14 @@ +apiVersion: fakesourceapi/v1alpha1 +kind: VPC +metadata: + annotations: + crossplane.io/paused: "true" + name: sample-vpc +spec: + deletionPolicy: Orphan + forProvider: + cidrBlock: 172.16.0.0/16 + region: us-west-1 + tags: + - key: tag1 + value: value1 diff --git a/pkg/migration/testdata/plan/generated/start-composites/my-resource-dwjgh.xmyresources.test.com.yaml b/pkg/migration/testdata/plan/generated/start-composites/my-resource-dwjgh.xmyresources.test.com.yaml new file mode 100644 index 00000000..4bbdaf4e --- /dev/null +++ b/pkg/migration/testdata/plan/generated/start-composites/my-resource-dwjgh.xmyresources.test.com.yaml @@ -0,0 +1,36 @@ +apiVersion: test.com/v1alpha1 +kind: XMyResource +metadata: + annotations: {} + creationTimestamp: "2022-12-13T18:38:30Z" + finalizers: + - composite.apiextensions.crossplane.io + generateName: my-resource- + generation: 2 + labels: + crossplane.io/claim-name: my-resource + crossplane.io/claim-namespace: upbound-system + crossplane.io/composite: my-resource-dwjgh + name: my-resource-dwjgh + resourceVersion: "368861" + uid: 443f32ec-670e-4bfe-8976-e2c73e91a011 +spec: + claimRef: + apiVersion: test.com/v1alpha1 + kind: MyResource + name: my-resource + namespace: upbound-system + compositionRef: + name: example-migrated + compositionUpdatePolicy: Automatic + parameters: + tagValue: demo-test + resourceRefs: + - apiVersion: fakesourceapi/v1alpha1 + kind: VPC +status: + conditions: + - lastTransitionTime: "2022-12-13T18:38:31Z" + reason: Creating + status: "False" + type: Ready diff --git a/pkg/migration/testdata/plan/generated/start-managed/sample-vpc.vpcs.faketargetapi.yaml b/pkg/migration/testdata/plan/generated/start-managed/sample-vpc.vpcs.faketargetapi.yaml new file mode 100644 index 00000000..8d418694 --- /dev/null +++ b/pkg/migration/testdata/plan/generated/start-managed/sample-vpc.vpcs.faketargetapi.yaml @@ -0,0 +1,14 @@ +apiVersion: faketargetapi/v1alpha1 +kind: VPC +metadata: + annotations: {} + name: sample-vpc +mockManaged: + ctrl: null + recorder: null +spec: + forProvider: + cidrBlock: 172.16.0.0/16 + region: us-west-1 + tags: + tag1: value1 diff --git a/pkg/migration/testdata/plan/migration_plan.yaml b/pkg/migration/testdata/plan/migration_plan.yaml new file mode 100644 index 00000000..cc463690 --- /dev/null +++ b/pkg/migration/testdata/plan/migration_plan.yaml @@ -0,0 +1,57 @@ +spec: + steps: + - apply: + files: + - pause-managed/sample-vpc.vpcs.fakesourceapi.yaml + name: pause-managed + type: Apply + - apply: + files: + - pause-composites/my-resource-dwjgh.xmyresources.test.com.yaml + name: pause-composites + type: Apply + - apply: + files: + - create-new-managed/sample-vpc.vpcs.faketargetapi.yaml + name: create-new-managed + type: Apply + - apply: + files: + - new-compositions/example-migrated.compositions.apiextensions.crossplane.io.yaml + name: new-compositions + type: Apply + - apply: + files: + - edit-composites/my-resource-dwjgh.xmyresources.test.com.yaml + name: edit-composites + type: Apply + - apply: + files: + - edit-claims/my-resource.myresources.test.com.yaml + name: edit-claims + type: Apply + - apply: + files: + - deletion-policy-orphan/sample-vpc.vpcs.fakesourceapi.yaml + name: deletion-policy-orphan + type: Apply + - delete: + options: + finalizerPolicy: Remove + resources: + - group: fakesourceapi + kind: VPC + name: sample-vpc + version: v1alpha1 + name: delete-old-managed + type: Delete + - apply: + files: + - start-managed/sample-vpc.vpcs.faketargetapi.yaml + name: start-managed + type: Apply + - apply: + files: + - start-composites/my-resource-dwjgh.xmyresources.test.com.yaml + name: start-composites + type: Apply diff --git a/pkg/migration/testdata/plan/sourcevpc.yaml b/pkg/migration/testdata/plan/sourcevpc.yaml new file mode 100644 index 00000000..01ae52ec --- /dev/null +++ b/pkg/migration/testdata/plan/sourcevpc.yaml @@ -0,0 +1,11 @@ +apiVersion: fakesourceapi/v1alpha1 +kind: VPC +metadata: + name: sample-vpc +spec: + forProvider: + region: us-west-1 + cidrBlock: 172.16.0.0/16 + tags: + - key: tag1 + value: value1 diff --git a/pkg/migration/testdata/plan/xr.yaml b/pkg/migration/testdata/plan/xr.yaml new file mode 100644 index 00000000..db07a2b2 --- /dev/null +++ b/pkg/migration/testdata/plan/xr.yaml @@ -0,0 +1,35 @@ +apiVersion: test.com/v1alpha1 +kind: XMyResource +metadata: + creationTimestamp: "2022-12-13T18:38:30Z" + finalizers: + - composite.apiextensions.crossplane.io + generateName: my-resource- + generation: 2 + labels: + crossplane.io/claim-name: my-resource + crossplane.io/claim-namespace: upbound-system + crossplane.io/composite: my-resource-dwjgh + name: my-resource-dwjgh + resourceVersion: "368861" + uid: 443f32ec-670e-4bfe-8976-e2c73e91a011 +spec: + claimRef: + apiVersion: test.com/v1alpha1 + kind: MyResource + name: my-resource + namespace: upbound-system + compositionRef: + name: example + compositionUpdatePolicy: Automatic + parameters: + tagValue: demo-test + resourceRefs: + - apiVersion: fakesourceapi/v1alpha1 + kind: VPC +status: + conditions: + - lastTransitionTime: "2022-12-13T18:38:31Z" + reason: Creating + status: "False" + type: Ready diff --git a/pkg/migration/testdata/plan/xrd.yaml b/pkg/migration/testdata/plan/xrd.yaml new file mode 100644 index 00000000..0fdf8639 --- /dev/null +++ b/pkg/migration/testdata/plan/xrd.yaml @@ -0,0 +1,32 @@ +apiVersion: apiextensions.crossplane.io/v1 +kind: CompositeResourceDefinition +metadata: + name: xmyresources.test.com +spec: + claimNames: + kind: MyResource + plural: myresources + group: test.com + names: + kind: XMyResource + plural: xmyresources + versions: + - name: v1alpha1 + referenceable: true + schema: + openAPIV3Schema: + properties: + spec: + properties: + parameters: + properties: + tagValue: + type: string + required: + - tagValue + type: object + required: + - parameters + type: object + type: object + served: true