Skip to content

Commit

Permalink
split the provider interface
Browse files Browse the repository at this point in the history
  • Loading branch information
Liujingfang1 committed Nov 16, 2020
1 parent 7fba032 commit c8fc3d2
Show file tree
Hide file tree
Showing 15 changed files with 549 additions and 278 deletions.
15 changes: 10 additions & 5 deletions commands/livecmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import (
"sigs.k8s.io/cli-utils/cmd/initcmd"
"sigs.k8s.io/cli-utils/cmd/preview"
"sigs.k8s.io/cli-utils/cmd/status"
"sigs.k8s.io/cli-utils/pkg/manifestreader"
"sigs.k8s.io/cli-utils/pkg/provider"
)

Expand Down Expand Up @@ -65,9 +66,11 @@ func GetLiveCommand(name string, f util.Factory) *cobra.Command {
// inventory objects is used. If a package has both inventory objects, then
// an error is thrown.
var p provider.Provider = provider.NewProvider(f)
var l manifestreader.ManifestLoader = manifestreader.NewManifestLoader(f)
if _, exists := os.LookupEnv(resourceGroupEnv); exists {
klog.V(2).Infoln("provider supports ResourceGroup and ConfigMap inventory")
p = live.NewDualDelegatingProvider(f)
l = live.NewDualDelegatingManifestReader(f)
}

// The default init command creates the ConfigMap inventory yaml. If the magic
Expand All @@ -82,13 +85,13 @@ func GetLiveCommand(name string, f util.Factory) *cobra.Command {
initCmd.Long = livedocs.InitShort + "\n" + livedocs.InitLong
initCmd.Example = livedocs.InitExamples

applyCmd := apply.GetApplyRunner(p, ioStreams).Command
applyCmd := apply.GetApplyRunner(p, l, ioStreams).Command
_ = applyCmd.Flags().MarkHidden("no-prune")
applyCmd.Short = livedocs.ApplyShort
applyCmd.Long = livedocs.ApplyShort + "\n" + livedocs.ApplyLong
applyCmd.Example = livedocs.ApplyExamples

previewCmd := preview.GetPreviewRunner(p, ioStreams).Command
previewCmd := preview.GetPreviewRunner(p, l, ioStreams).Command
previewCmd.Short = livedocs.PreviewShort
previewCmd.Long = livedocs.PreviewShort + "\n" + livedocs.PreviewLong
previewCmd.Example = livedocs.PreviewExamples
Expand All @@ -98,12 +101,12 @@ func GetLiveCommand(name string, f util.Factory) *cobra.Command {
diffCmd.Long = livedocs.DiffShort + "\n" + livedocs.DiffLong
diffCmd.Example = livedocs.DiffExamples

destroyCmd := destroy.GetDestroyRunner(p, ioStreams).Command
destroyCmd := destroy.GetDestroyRunner(p, l, ioStreams).Command
destroyCmd.Short = livedocs.DestroyShort
destroyCmd.Long = livedocs.DestroyShort + "\n" + livedocs.DestroyLong
destroyCmd.Example = livedocs.DestroyExamples

statusCmd := status.GetStatusRunner(p).Command
statusCmd := status.GetStatusRunner(p, l).Command
statusCmd.Short = livedocs.StatusShort
statusCmd.Long = livedocs.StatusLong
statusCmd.Example = livedocs.StatusExamples
Expand All @@ -121,7 +124,9 @@ func GetLiveCommand(name string, f util.Factory) *cobra.Command {
// migrate command, and add the migrate command to live command.
cmProvider := provider.NewProvider(f)
rgProvider := live.NewResourceGroupProvider(f)
migrateCmd := GetMigrateRunner(cmProvider, rgProvider, ioStreams).Command
cmLoader := manifestreader.NewManifestLoader(f)
rgLoader := live.NewResourceGroupManifestLoader(f)
migrateCmd := GetMigrateRunner(cmProvider, rgProvider, cmLoader, rgLoader, ioStreams).Command
liveCmd.AddCommand(migrateCmd)
}

Expand Down
33 changes: 20 additions & 13 deletions commands/migratecmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
"sigs.k8s.io/cli-utils/pkg/common"
"sigs.k8s.io/cli-utils/pkg/config"
"sigs.k8s.io/cli-utils/pkg/inventory"
"sigs.k8s.io/cli-utils/pkg/manifestreader"
"sigs.k8s.io/cli-utils/pkg/object"
"sigs.k8s.io/cli-utils/pkg/provider"
"sigs.k8s.io/kustomize/kyaml/yaml"
Expand All @@ -39,16 +40,22 @@ type MigrateRunner struct {
initOptions *KptInitOptions
cmProvider provider.Provider
rgProvider provider.Provider
cmLoader manifestreader.ManifestLoader
rgLoader manifestreader.ManifestLoader
}

// NewMigrateRunner returns a pointer to an initial MigrateRunner structure.
func GetMigrateRunner(cmProvider provider.Provider, rgProvider provider.Provider, ioStreams genericclioptions.IOStreams) *MigrateRunner {
func GetMigrateRunner(cmProvider provider.Provider, rgProvider provider.Provider,
cmLoader manifestreader.ManifestLoader, rgLoader manifestreader.ManifestLoader,
ioStreams genericclioptions.IOStreams) *MigrateRunner {
r := &MigrateRunner{
ioStreams: ioStreams,
dryRun: false,
initOptions: NewKptInitOptions(cmProvider.Factory(), ioStreams),
cmProvider: cmProvider,
rgProvider: rgProvider,
cmLoader: cmLoader,
rgLoader: rgLoader,
dir: "",
}
cmd := &cobra.Command{
Expand Down Expand Up @@ -78,7 +85,9 @@ func GetMigrateRunner(cmProvider provider.Provider, rgProvider provider.Provider
func NewCmdMigrate(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command {
configMapProvider := provider.NewProvider(f)
resourceGroupProvider := live.NewResourceGroupProvider(f)
return GetMigrateRunner(configMapProvider, resourceGroupProvider, ioStreams).Command
cmLoader := manifestreader.NewManifestLoader(f)
rgLoader := live.NewResourceGroupManifestLoader(f)
return GetMigrateRunner(configMapProvider, resourceGroupProvider, cmLoader, rgLoader, ioStreams).Command
}

// Run executes the migration from the ConfigMap based inventory to the ResourceGroup
Expand Down Expand Up @@ -219,27 +228,24 @@ func (mr *MigrateRunner) updateKptfile(args []string) error {

// retrieveConfigMapInv retrieves the ConfigMap inventory object or
// an error if one occurred.
func (mr *MigrateRunner) retrieveConfigMapInv(reader io.Reader, args []string) (*unstructured.Unstructured, error) {
func (mr *MigrateRunner) retrieveConfigMapInv(reader io.Reader, args []string) (inventory.InventoryInfo, error) {
fmt.Fprint(mr.ioStreams.Out, " retrieve the current ConfigMap inventory...")
cmReader, err := mr.cmProvider.ManifestReader(reader, args)
cmReader, err := mr.cmLoader.ManifestReader(reader, args)
if err != nil {
return nil, err
}
objs, err := cmReader.Read()
if err != nil {
return nil, err
}
cmInv, _, err := inventory.SplitUnstructureds(objs)
if err != nil {
return nil, err
}
return cmInv, nil
cmInv, _, err := mr.cmLoader.InventoryInfo(objs)
return cmInv, err
}

// retrieveInvObjs returns the object references from the passed
// inventory object by querying the inventory object in the cluster,
// or an error if one occurred.
func (mr *MigrateRunner) retrieveInvObjs(invObj *unstructured.Unstructured) ([]object.ObjMetadata, error) {
func (mr *MigrateRunner) retrieveInvObjs(invObj inventory.InventoryInfo) ([]object.ObjMetadata, error) {
cmInvClient, err := mr.cmProvider.InventoryClient()
if err != nil {
return nil, err
Expand All @@ -261,7 +267,7 @@ func (mr *MigrateRunner) migrateObjs(cmObjs []object.ObjMetadata, reader io.Read
fmt.Fprint(mr.ioStreams.Out, "no inventory objects found\n")
return nil
}
rgReader, err := mr.rgProvider.ManifestReader(reader, args)
rgReader, err := mr.rgLoader.ManifestReader(reader, args)
if err != nil {
return err
}
Expand All @@ -278,7 +284,8 @@ func (mr *MigrateRunner) migrateObjs(cmObjs []object.ObjMetadata, reader io.Read
if err != nil {
return err
}
_, err = rgInvClient.Merge(rgInv, cmObjs)
inv := live.WrapInventoryInfoObj(rgInv)
_, err = rgInvClient.Merge(inv, cmObjs)
if err != nil {
return err
}
Expand All @@ -288,7 +295,7 @@ func (mr *MigrateRunner) migrateObjs(cmObjs []object.ObjMetadata, reader io.Read

// deleteConfigMapInv removes the passed inventory object from the
// cluster. Returns an error if one occurred.
func (mr *MigrateRunner) deleteConfigMapInv(invObj *unstructured.Unstructured) error {
func (mr *MigrateRunner) deleteConfigMapInv(invObj inventory.InventoryInfo) error {
fmt.Fprint(mr.ioStreams.Out, " deleting old ConfigMap inventory object...")
cmInvClient, err := mr.cmProvider.InventoryClient()
if err != nil {
Expand Down
17 changes: 12 additions & 5 deletions commands/migratecmd_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
"k8s.io/cli-runtime/pkg/genericclioptions"
cmdtesting "k8s.io/kubectl/pkg/cmd/testing"
"sigs.k8s.io/cli-utils/pkg/common"
"sigs.k8s.io/cli-utils/pkg/manifestreader"
"sigs.k8s.io/cli-utils/pkg/object"
"sigs.k8s.io/cli-utils/pkg/provider"
)
Expand Down Expand Up @@ -142,7 +143,9 @@ func TestKptMigrate_updateKptfile(t *testing.T) {
// Create MigrateRunner and call "updateKptfile"
cmProvider := provider.NewFakeProvider(tf, []object.ObjMetadata{})
rgProvider := live.NewResourceGroupProvider(tf)
migrateRunner := GetMigrateRunner(cmProvider, rgProvider, ioStreams)
cmLoader := manifestreader.NewManifestLoader(tf)
rgLoader := live.NewResourceGroupManifestLoader(tf)
migrateRunner := GetMigrateRunner(cmProvider, rgProvider, cmLoader, rgLoader, ioStreams)
migrateRunner.dryRun = tc.dryRun
err = migrateRunner.updateKptfile([]string{dir})
// Check if there should be an error
Expand Down Expand Up @@ -207,7 +210,9 @@ func TestKptMigrate_retrieveConfigMapInv(t *testing.T) {
// Create MigrateRunner and call "retrieveConfigMapInv"
cmProvider := provider.NewFakeProvider(tf, []object.ObjMetadata{})
rgProvider := live.NewResourceGroupProvider(tf)
migrateRunner := GetMigrateRunner(cmProvider, rgProvider, ioStreams)
cmLoader := manifestreader.NewManifestLoader(tf)
rgLoader := live.NewResourceGroupManifestLoader(tf)
migrateRunner := GetMigrateRunner(cmProvider, rgProvider, cmLoader, rgLoader, ioStreams)
actual, err := migrateRunner.retrieveConfigMapInv(strings.NewReader(tc.configMap), []string{})
// Check if there should be an error
if tc.isError {
Expand All @@ -217,10 +222,10 @@ func TestKptMigrate_retrieveConfigMapInv(t *testing.T) {
return
}
assert.NoError(t, err)
if tc.expected.GetName() != actual.GetName() {
if tc.expected.GetName() != actual.Name() {
t.Errorf("expected ConfigMap (%#v), got (%#v)", tc.expected, actual)
}
if tc.expected.GetNamespace() != actual.GetNamespace() {
if tc.expected.GetNamespace() != actual.Namespace() {
t.Errorf("expected ConfigMap (%#v), got (%#v)", tc.expected, actual)
}
})
Expand Down Expand Up @@ -308,7 +313,9 @@ func TestKptMigrate_migrateObjs(t *testing.T) {
// Create MigrateRunner and call "retrieveConfigMapInv"
cmProvider := provider.NewFakeProvider(tf, []object.ObjMetadata{})
rgProvider := live.NewFakeResourceGroupProvider(tf, tc.objs)
migrateRunner := GetMigrateRunner(cmProvider, rgProvider, ioStreams)
cmLoader := manifestreader.NewManifestLoader(tf)
rgLoader := live.NewResourceGroupManifestLoader(tf)
migrateRunner := GetMigrateRunner(cmProvider, rgProvider, cmLoader, rgLoader, ioStreams)
err := migrateRunner.migrateObjs(tc.objs, strings.NewReader(tc.invObj), []string{})
// Check if there should be an error
if tc.isError {
Expand Down
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,5 @@ require (
sigs.k8s.io/kustomize/cmd/config v0.8.5
sigs.k8s.io/kustomize/kyaml v0.9.4
)

replace sigs.k8s.io/cli-utils => ../../sigs.k8s.io/cli-utils
2 changes: 0 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -683,8 +683,6 @@ k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89 h1:d4vVOjXm687F1iLSP2q3lyPPuyvTU
k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0=
sigs.k8s.io/cli-utils v0.21.1 h1:cDNLRGvVshr9XjpaP0PghMXUQOLB4QFtZC+/YTGiWyw=
sigs.k8s.io/cli-utils v0.21.1/go.mod h1:Mt1gLc/Nfa7Z3Lhbfk72uT2Kc4GNyuX4oMqEN9FbPMs=
sigs.k8s.io/controller-runtime v0.6.0 h1:Fzna3DY7c4BIP6KwfSlrfnj20DJ+SeMBK8HSFvOk9NM=
sigs.k8s.io/controller-runtime v0.6.0/go.mod h1:CpYf5pdNY/B352A1TFLAS2JVSlnGQ5O2cftPHndTroo=
sigs.k8s.io/kustomize v2.0.3+incompatible h1:JUufWFNlI44MdtnjUqVnvh29rR37PQFzPbLXqhyOyX0=
Expand Down
14 changes: 14 additions & 0 deletions internal/cmdsearch/putpattern_test.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,17 @@
// Copyright 2019 Google LLC
//
// 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 cmdsearch

var putPatternCases = []test{
Expand Down
14 changes: 14 additions & 0 deletions internal/cmdsearch/searchreplace_test.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,17 @@
// Copyright 2019 Google LLC
//
// 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 cmdsearch

var searchReplaceCases = []test{
Expand Down
Loading

0 comments on commit c8fc3d2

Please sign in to comment.