From 2f32459fff016d5f0189313fb70367bc36614823 Mon Sep 17 00:00:00 2001 From: chengwang86 Date: Tue, 7 Mar 2017 08:32:17 -0800 Subject: [PATCH] add plugins --- pkg/version/plugin2/commonSpecForVCH.go | 123 ++++++++++++++++++ pkg/version/plugin3/commonSpecForContainer.go | 112 ++++++++++++++++ 2 files changed, 235 insertions(+) create mode 100644 pkg/version/plugin2/commonSpecForVCH.go create mode 100644 pkg/version/plugin3/commonSpecForContainer.go diff --git a/pkg/version/plugin2/commonSpecForVCH.go b/pkg/version/plugin2/commonSpecForVCH.go new file mode 100644 index 0000000000..7cf5085865 --- /dev/null +++ b/pkg/version/plugin2/commonSpecForVCH.go @@ -0,0 +1,123 @@ +// Copyright 2017 VMware, Inc. All Rights Reserved. +// +// 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 plugin1 + +import ( + "context" + "fmt" + + "github.com/vmware/vic/lib/migration/manager" + + log "github.com/Sirupsen/logrus" + "github.com/vmware/vic/lib/migration/errors" + "github.com/vmware/vic/pkg/trace" + "github.com/vmware/vic/pkg/vsphere/extraconfig" + "github.com/vmware/vic/pkg/vsphere/session" +) + +const ( + version = 2 + target = manager.ApplianceConfigure +) + +func init() { + defer trace.End(trace.Begin(fmt.Sprintf("Registering plugin %s:%d", target, version))) + if err := manager.Migrator.Register(version, target, &AddCommonSpecForVCH{}); err != nil { + log.Errorf("Failed to register plugin %s:%d, %s", target, version, err) + } +} + +// AddCommonSpecForVM is plugin for vic 0.8.0-GA version upgrade +type AddCommonSpecForVCH struct { +} + +type VirtualContainerHostConfigSpec struct { + ExecutorConfig `vic:"0.1" scope:"read-only" key:"init"` +} + +type ExecutorConfig struct { + Common `vic:"0.1" scope:"read-only" key:"common"` +} + +type Common struct { + // A reference to the components hosting execution environment, if any + ExecutionEnvironment string + + // Unambiguous ID with meaning in the context of its hosting execution environment + ID string `vic:"0.1" scope:"read-only" key:"id"` + + // Convenience field to record a human readable name + Name string `vic:"0.1" scope:"read-only" key:"name"` + + // Freeform notes related to the entity + Notes string `vic:"0.1" scope:"hidden" key:"notes"` +} + +type NewVirtualContainerHostConfigSpec struct { + NewExecutorConfig `vic:"0.1" scope:"read-only" key:"init"` +} + +type NewExecutorConfig struct { + CommonSpecForVM `vic:"0.1" scope:"read-only" key:"common"` +} + +type CommonSpecForVM struct { + // A reference to the components hosting execution environment, if any + ExecutionEnvironment string + + // Unambiguous ID with meaning in the context of its hosting execution environment + ID string `vic:"0.1" scope:"read-only" key:"id"` + + // Convenience field to record a human readable name + Name string `vic:"0.1" scope:"hidden" key:"name"` + + // Freeform notes related to the entity + Notes string `vic:"0.1" scope:"hidden" key:"notes"` +} + +func (p *AddCommonSpecForVCH) Migrate(ctx context.Context, s *session.Session, data interface{}) error { + defer trace.End(trace.Begin(fmt.Sprintf("AddCommonSpecForVCH version: %d", version))) + if data == nil { + return nil + } + mapData := data.(map[string]string) + oldStruct := &VirtualContainerHostConfigSpec{} + result := extraconfig.Decode(extraconfig.MapSource(mapData), oldStruct) + log.Debugf("The oldStruct is %+v", oldStruct) + if result == nil { + return &errors.DecodeError{} + } + + newStruct := &NewVirtualContainerHostConfigSpec{ + NewExecutorConfig: NewExecutorConfig{ + CommonSpecForVM: CommonSpecForVM{ + Name: oldStruct.Name, + ID: oldStruct.ID, + ExecutionEnvironment: oldStruct.ExecutionEnvironment, + Notes: oldStruct.Notes, + }, + }, + } + + cfg := make(map[string]string) + extraconfig.Encode(extraconfig.MapSink(cfg), newStruct) + log.Debugf("The newStruct is %+v", newStruct) + + for k, v := range cfg { + log.Debugf("New data: %s:%s", k, v) + mapData[k] = v + } + return nil +} diff --git a/pkg/version/plugin3/commonSpecForContainer.go b/pkg/version/plugin3/commonSpecForContainer.go new file mode 100644 index 0000000000..e5c7e6c3bc --- /dev/null +++ b/pkg/version/plugin3/commonSpecForContainer.go @@ -0,0 +1,112 @@ +// Copyright 2017 VMware, Inc. All Rights Reserved. +// +// 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 plugin1 + +import ( + "context" + "fmt" + + "github.com/vmware/vic/lib/migration/manager" + + log "github.com/Sirupsen/logrus" + "github.com/vmware/vic/lib/migration/errors" + "github.com/vmware/vic/pkg/trace" + "github.com/vmware/vic/pkg/vsphere/extraconfig" + "github.com/vmware/vic/pkg/vsphere/session" +) + +const ( + version = 3 + target = manager.ContainerConfigure +) + +func init() { + defer trace.End(trace.Begin(fmt.Sprintf("Registering plugin %s:%d", target, version))) + if err := manager.Migrator.Register(version, target, &AddCommonSpecForContainer{}); err != nil { + log.Errorf("Failed to register plugin %s:%d, %s", target, version, err) + } +} + +// AddCommonSpecForVM is plugin for vic 0.8.0-GA version upgrade +type AddCommonSpecForContainer struct { +} + +type ExecutorConfig struct { + Common `vic:"0.1" scope:"read-only" key:"common"` +} + +type Common struct { + // A reference to the components hosting execution environment, if any + ExecutionEnvironment string + + // Unambiguous ID with meaning in the context of its hosting execution environment + ID string `vic:"0.1" scope:"read-only" key:"id"` + + // Convenience field to record a human readable name + Name string `vic:"0.1" scope:"read-only" key:"name"` + + // Freeform notes related to the entity + Notes string `vic:"0.1" scope:"hidden" key:"notes"` +} + +type NewExecutorConfig struct { + CommonSpecForVM `vic:"0.1" scope:"read-only" key:"common"` +} + +type CommonSpecForVM struct { + // A reference to the components hosting execution environment, if any + ExecutionEnvironment string + + // Unambiguous ID with meaning in the context of its hosting execution environment + ID string `vic:"0.1" scope:"read-only" key:"id"` + + // Convenience field to record a human readable name + Name string `vic:"0.1" scope:"hidden" key:"name"` + + // Freeform notes related to the entity + Notes string `vic:"0.1" scope:"hidden" key:"notes"` +} + +func (p *AddCommonSpecForContainer) Migrate(ctx context.Context, s *session.Session, data interface{}) error { + defer trace.End(trace.Begin(fmt.Sprintf("AddCommonSpecForContainer version %d", version))) + if data == nil { + return nil + } + mapData := data.(map[string]string) + oldStruct := &ExecutorConfig{} + result := extraconfig.Decode(extraconfig.MapSource(mapData), oldStruct) + log.Debugf("The oldStruct is %+v", oldStruct) + if result == nil { + return &errors.DecodeError{} + } + + newStruct := &NewExecutorConfig{ + CommonSpecForVM: CommonSpecForVM{ + Name: oldStruct.Name, + ID: oldStruct.ID, + Notes: oldStruct.Notes, + ExecutionEnvironment: oldStruct.ExecutionEnvironment, + }} + + cfg := make(map[string]string) + extraconfig.Encode(extraconfig.MapSink(cfg), newStruct) + log.Debugf("The newStruct is %+v", newStruct) + + for k, v := range cfg { + log.Debugf("New data: %s:%s", k, v) + mapData[k] = v + } + return nil +}