From b8fbbbdd62cfcce32860fecd93cb28ce9fbd1a6f Mon Sep 17 00:00:00 2001 From: Eric Stroczynski Date: Thu, 18 Oct 2018 17:14:05 -0700 Subject: [PATCH 1/8] pkg/scaffold/*: moved filename constants to respective scaffold files and exported them --- pkg/scaffold/apis.go | 4 +++- pkg/scaffold/build_dockerfile.go | 4 +++- pkg/scaffold/cmd.go | 4 +++- pkg/scaffold/constants.go | 24 ----------------------- pkg/scaffold/controller.go | 4 +++- pkg/scaffold/doc.go | 4 +++- pkg/scaffold/gitignore.go | 4 +++- pkg/scaffold/go_test_script.go | 6 ++++-- pkg/scaffold/gopkgtoml.go | 4 +++- pkg/scaffold/operator.go | 4 +++- pkg/scaffold/register.go | 4 +++- pkg/scaffold/role.go | 4 +++- pkg/scaffold/rolebinding.go | 4 +++- pkg/scaffold/service_account.go | 4 +++- pkg/scaffold/test_framework_dockerfile.go | 2 +- pkg/scaffold/test_pod.go | 4 +++- pkg/scaffold/version.go | 4 +++- 17 files changed, 47 insertions(+), 41 deletions(-) diff --git a/pkg/scaffold/apis.go b/pkg/scaffold/apis.go index 181d20e9fc5..f4810e3a90d 100644 --- a/pkg/scaffold/apis.go +++ b/pkg/scaffold/apis.go @@ -20,13 +20,15 @@ import ( "github.com/operator-framework/operator-sdk/pkg/scaffold/input" ) +const ApisFile = "apis.go" + type Apis struct { input.Input } func (s *Apis) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(apisDir, apisFile) + s.Path = filepath.Join(apisDir, ApisFile) } s.TemplateBody = apisTmpl return s.Input, nil diff --git a/pkg/scaffold/build_dockerfile.go b/pkg/scaffold/build_dockerfile.go index f14f51e37c4..69c2778ede5 100644 --- a/pkg/scaffold/build_dockerfile.go +++ b/pkg/scaffold/build_dockerfile.go @@ -20,13 +20,15 @@ import ( "github.com/operator-framework/operator-sdk/pkg/scaffold/input" ) +const DockerfileFile = "Dockerfile" + type Dockerfile struct { input.Input } func (s *Dockerfile) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(buildDir, dockerfileFile) + s.Path = filepath.Join(buildDir, DockerfileFile) } s.TemplateBody = dockerfileTmpl return s.Input, nil diff --git a/pkg/scaffold/cmd.go b/pkg/scaffold/cmd.go index acc33911793..b813955a7e8 100644 --- a/pkg/scaffold/cmd.go +++ b/pkg/scaffold/cmd.go @@ -20,13 +20,15 @@ import ( "github.com/operator-framework/operator-sdk/pkg/scaffold/input" ) +const CmdFile = "main.go" + type Cmd struct { input.Input } func (s *Cmd) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(managerDir, cmdFile) + s.Path = filepath.Join(managerDir, CmdFile) } s.TemplateBody = cmdTmpl return s.Input, nil diff --git a/pkg/scaffold/constants.go b/pkg/scaffold/constants.go index 1608ae36d6b..57fa71ca69b 100644 --- a/pkg/scaffold/constants.go +++ b/pkg/scaffold/constants.go @@ -19,10 +19,6 @@ import ( ) const ( - // Boolean values for Input.IsExec - isExecTrue = true - isExecFalse = false - // Separator to statically create directories. filePathSep = string(filepath.Separator) @@ -38,24 +34,4 @@ const ( olmCatalogDir = deployDir + filePathSep + "olm-catalog" crdsDir = deployDir + filePathSep + "crds" versionDir = "version" - - // files - cmdFile = "main.go" - apisFile = "apis.go" - controllerFile = "controller.go" - dockerfileFile = "Dockerfile" - goTestScriptFile = "go-test.sh" - versionFile = "version.go" - docFile = "doc.go" - registerFile = "register.go" - serviceAccountYamlFile = "service_account.yaml" - roleYamlFile = "role.yaml" - roleBindingYamlFile = "role_binding.yaml" - operatorYamlFile = "operator.yaml" - catalogPackageYamlFile = "package.yaml" - catalogCSVYamlFile = "csv.yaml" - testPodYamlFile = "test-pod.yaml" - gitignoreFile = ".gitignore" - gopkgtomlFile = "Gopkg.toml" - gopkglockFile = "Gopkg.lock" ) diff --git a/pkg/scaffold/controller.go b/pkg/scaffold/controller.go index 790a4c0f673..1f7d9f47afc 100644 --- a/pkg/scaffold/controller.go +++ b/pkg/scaffold/controller.go @@ -20,13 +20,15 @@ import ( "github.com/operator-framework/operator-sdk/pkg/scaffold/input" ) +const ControllerFile = "controller.go" + type Controller struct { input.Input } func (s *Controller) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(controllerDir, controllerFile) + s.Path = filepath.Join(controllerDir, ControllerFile) } s.TemplateBody = controllerTmpl return s.Input, nil diff --git a/pkg/scaffold/doc.go b/pkg/scaffold/doc.go index ca58c491291..2a758bac4fa 100644 --- a/pkg/scaffold/doc.go +++ b/pkg/scaffold/doc.go @@ -21,6 +21,8 @@ import ( "github.com/operator-framework/operator-sdk/pkg/scaffold/input" ) +const DocFile = "doc.go" + // Doc is the input needed to generate a pkg/apis///doc.go file type Doc struct { input.Input @@ -34,7 +36,7 @@ func (s *Doc) GetInput() (input.Input, error) { s.Path = filepath.Join(apisDir, strings.ToLower(s.Resource.Group), strings.ToLower(s.Resource.Version), - docFile) + DocFile) } s.IfExistsAction = input.Skip s.TemplateBody = docTemplate diff --git a/pkg/scaffold/gitignore.go b/pkg/scaffold/gitignore.go index 3976d5890f3..b33b5f50697 100644 --- a/pkg/scaffold/gitignore.go +++ b/pkg/scaffold/gitignore.go @@ -18,13 +18,15 @@ import ( "github.com/operator-framework/operator-sdk/pkg/scaffold/input" ) +const GitignoreFile = ".gitignore" + type Gitignore struct { input.Input } func (s *Gitignore) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = gitignoreFile + s.Path = GitignoreFile } s.TemplateBody = gitignoreTmpl return s.Input, nil diff --git a/pkg/scaffold/go_test_script.go b/pkg/scaffold/go_test_script.go index 0a832ac17e6..122834d5431 100644 --- a/pkg/scaffold/go_test_script.go +++ b/pkg/scaffold/go_test_script.go @@ -20,15 +20,17 @@ import ( "github.com/operator-framework/operator-sdk/pkg/scaffold/input" ) +const GoTestScriptFile = "go-test.sh" + type GoTestScript struct { input.Input } func (s *GoTestScript) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(buildTestDir, goTestScriptFile) + s.Path = filepath.Join(buildTestDir, GoTestScriptFile) } - s.IsExec = isExecTrue + s.IsExec = true s.TemplateBody = goTestScriptTmpl return s.Input, nil } diff --git a/pkg/scaffold/gopkgtoml.go b/pkg/scaffold/gopkgtoml.go index 1552f7c3045..afd15bb8e0c 100644 --- a/pkg/scaffold/gopkgtoml.go +++ b/pkg/scaffold/gopkgtoml.go @@ -18,13 +18,15 @@ import ( "github.com/operator-framework/operator-sdk/pkg/scaffold/input" ) +const GopkgTomlFile = "Gopkg.toml" + type GopkgToml struct { input.Input } func (s *GopkgToml) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = gopkgtomlFile + s.Path = GopkgTomlFile } s.TemplateBody = gopkgTomlTmpl return s.Input, nil diff --git a/pkg/scaffold/operator.go b/pkg/scaffold/operator.go index 4e30e157743..02df5aa1caa 100644 --- a/pkg/scaffold/operator.go +++ b/pkg/scaffold/operator.go @@ -20,13 +20,15 @@ import ( "github.com/operator-framework/operator-sdk/pkg/scaffold/input" ) +const OperatorYamlFile = "operator.yaml" + type Operator struct { input.Input } func (s *Operator) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(deployDir, operatorYamlFile) + s.Path = filepath.Join(deployDir, OperatorYamlFile) } s.TemplateBody = operatorTemplate return s.Input, nil diff --git a/pkg/scaffold/register.go b/pkg/scaffold/register.go index 70c41b32291..b3dabc7c5ac 100644 --- a/pkg/scaffold/register.go +++ b/pkg/scaffold/register.go @@ -21,6 +21,8 @@ import ( "github.com/operator-framework/operator-sdk/pkg/scaffold/input" ) +const RegisterFile = "register.go" + // Register is the input needed to generate a pkg/apis///register.go file type Register struct { input.Input @@ -34,7 +36,7 @@ func (s *Register) GetInput() (input.Input, error) { s.Path = filepath.Join(apisDir, strings.ToLower(s.Resource.Group), strings.ToLower(s.Resource.Version), - registerFile) + RegisterFile) } // Do not overwrite this file if it exists. s.IfExistsAction = input.Skip diff --git a/pkg/scaffold/role.go b/pkg/scaffold/role.go index 8c3953496f6..439ac5940b5 100644 --- a/pkg/scaffold/role.go +++ b/pkg/scaffold/role.go @@ -20,13 +20,15 @@ import ( "github.com/operator-framework/operator-sdk/pkg/scaffold/input" ) +const RoleYamlFile = "role.yaml" + type Role struct { input.Input } func (s *Role) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(deployDir, roleYamlFile) + s.Path = filepath.Join(deployDir, RoleYamlFile) } s.TemplateBody = roleTemplate return s.Input, nil diff --git a/pkg/scaffold/rolebinding.go b/pkg/scaffold/rolebinding.go index 88907b04918..dee9a0cb18d 100644 --- a/pkg/scaffold/rolebinding.go +++ b/pkg/scaffold/rolebinding.go @@ -20,13 +20,15 @@ import ( "github.com/operator-framework/operator-sdk/pkg/scaffold/input" ) +const RoleBindingYamlFile = "role_binding.yaml" + type RoleBinding struct { input.Input } func (s *RoleBinding) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(deployDir, roleBindingYamlFile) + s.Path = filepath.Join(deployDir, RoleBindingYamlFile) } s.TemplateBody = roleBindingTemplate return s.Input, nil diff --git a/pkg/scaffold/service_account.go b/pkg/scaffold/service_account.go index 361fce28df4..9f471f04ad1 100644 --- a/pkg/scaffold/service_account.go +++ b/pkg/scaffold/service_account.go @@ -20,13 +20,15 @@ import ( "github.com/operator-framework/operator-sdk/pkg/scaffold/input" ) +const ServiceAccountYamlFile = "service_account.yaml" + type ServiceAccount struct { input.Input } func (s *ServiceAccount) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(deployDir, serviceAccountYamlFile) + s.Path = filepath.Join(deployDir, ServiceAccountYamlFile) } s.TemplateBody = serviceAccountTemplate return s.Input, nil diff --git a/pkg/scaffold/test_framework_dockerfile.go b/pkg/scaffold/test_framework_dockerfile.go index 6fdf8d03616..8ac63b0cf4b 100644 --- a/pkg/scaffold/test_framework_dockerfile.go +++ b/pkg/scaffold/test_framework_dockerfile.go @@ -26,7 +26,7 @@ type TestFrameworkDockerfile struct { func (s *TestFrameworkDockerfile) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(buildTestDir, dockerfileFile) + s.Path = filepath.Join(buildTestDir, DockerfileFile) } s.TemplateBody = testFrameworkDockerfileTmpl return s.Input, nil diff --git a/pkg/scaffold/test_pod.go b/pkg/scaffold/test_pod.go index 9ae77fd56d6..d780efbb702 100644 --- a/pkg/scaffold/test_pod.go +++ b/pkg/scaffold/test_pod.go @@ -20,6 +20,8 @@ import ( "github.com/operator-framework/operator-sdk/pkg/scaffold/input" ) +const TestPodYamlFile = "test-pod.yaml" + type TestPod struct { input.Input @@ -32,7 +34,7 @@ type TestPod struct { func (s *TestPod) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(deployDir, testPodYamlFile) + s.Path = filepath.Join(deployDir, TestPodYamlFile) } s.TemplateBody = testPodTmpl return s.Input, nil diff --git a/pkg/scaffold/version.go b/pkg/scaffold/version.go index 60e8b78629d..87fab76387e 100644 --- a/pkg/scaffold/version.go +++ b/pkg/scaffold/version.go @@ -20,13 +20,15 @@ import ( "github.com/operator-framework/operator-sdk/pkg/scaffold/input" ) +const VersionFile = "version.go" + type Version struct { input.Input } func (s *Version) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(versionDir, versionFile) + s.Path = filepath.Join(versionDir, VersionFile) } s.TemplateBody = versionTemplate return s.Input, nil From 1f2fa729cad0c7027a4fcda94366a36c6f6e16d9 Mon Sep 17 00:00:00 2001 From: Eric Stroczynski Date: Thu, 18 Oct 2018 17:18:05 -0700 Subject: [PATCH 2/8] pkg/scaffold/*: exported directory names --- pkg/scaffold/add_controller.go | 2 +- pkg/scaffold/addtoscheme.go | 2 +- pkg/scaffold/apis.go | 2 +- pkg/scaffold/build_dockerfile.go | 2 +- pkg/scaffold/cmd.go | 2 +- pkg/scaffold/constants.go | 22 +++++++++++----------- pkg/scaffold/controller.go | 2 +- pkg/scaffold/controller_kind.go | 2 +- pkg/scaffold/cr.go | 2 +- pkg/scaffold/crd.go | 2 +- pkg/scaffold/doc.go | 2 +- pkg/scaffold/go_test_script.go | 2 +- pkg/scaffold/operator.go | 2 +- pkg/scaffold/register.go | 2 +- pkg/scaffold/role.go | 2 +- pkg/scaffold/rolebinding.go | 2 +- pkg/scaffold/service_account.go | 2 +- pkg/scaffold/test_framework_dockerfile.go | 2 +- pkg/scaffold/test_pod.go | 2 +- pkg/scaffold/types.go | 2 +- pkg/scaffold/version.go | 2 +- 21 files changed, 31 insertions(+), 31 deletions(-) diff --git a/pkg/scaffold/add_controller.go b/pkg/scaffold/add_controller.go index e77cc54c52c..a7f9310c71d 100644 --- a/pkg/scaffold/add_controller.go +++ b/pkg/scaffold/add_controller.go @@ -31,7 +31,7 @@ type AddController struct { func (s *AddController) GetInput() (input.Input, error) { if s.Path == "" { fileName := "add_" + s.Resource.LowerKind + ".go" - s.Path = filepath.Join(controllerDir, fileName) + s.Path = filepath.Join(ControllerDir, fileName) } s.TemplateBody = addControllerTemplate return s.Input, nil diff --git a/pkg/scaffold/addtoscheme.go b/pkg/scaffold/addtoscheme.go index b3e96e4f66a..343f8b263e2 100644 --- a/pkg/scaffold/addtoscheme.go +++ b/pkg/scaffold/addtoscheme.go @@ -35,7 +35,7 @@ func (s *AddToScheme) GetInput() (input.Input, error) { fileName := fmt.Sprintf("addtoscheme_%s_%s.go", strings.ToLower(s.Resource.Group), strings.ToLower(s.Resource.Version)) - s.Path = filepath.Join(apisDir, fileName) + s.Path = filepath.Join(ApisDir, fileName) } s.TemplateBody = addToSchemeTemplate return s.Input, nil diff --git a/pkg/scaffold/apis.go b/pkg/scaffold/apis.go index f4810e3a90d..5f32d7ce5b5 100644 --- a/pkg/scaffold/apis.go +++ b/pkg/scaffold/apis.go @@ -28,7 +28,7 @@ type Apis struct { func (s *Apis) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(apisDir, ApisFile) + s.Path = filepath.Join(ApisDir, ApisFile) } s.TemplateBody = apisTmpl return s.Input, nil diff --git a/pkg/scaffold/build_dockerfile.go b/pkg/scaffold/build_dockerfile.go index 69c2778ede5..e62572a28e2 100644 --- a/pkg/scaffold/build_dockerfile.go +++ b/pkg/scaffold/build_dockerfile.go @@ -28,7 +28,7 @@ type Dockerfile struct { func (s *Dockerfile) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(buildDir, DockerfileFile) + s.Path = filepath.Join(BuildDir, DockerfileFile) } s.TemplateBody = dockerfileTmpl return s.Input, nil diff --git a/pkg/scaffold/cmd.go b/pkg/scaffold/cmd.go index b813955a7e8..38f51f9357c 100644 --- a/pkg/scaffold/cmd.go +++ b/pkg/scaffold/cmd.go @@ -28,7 +28,7 @@ type Cmd struct { func (s *Cmd) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(managerDir, CmdFile) + s.Path = filepath.Join(ManagerDir, CmdFile) } s.TemplateBody = cmdTmpl return s.Input, nil diff --git a/pkg/scaffold/constants.go b/pkg/scaffold/constants.go index 57fa71ca69b..c71b6132366 100644 --- a/pkg/scaffold/constants.go +++ b/pkg/scaffold/constants.go @@ -23,15 +23,15 @@ const ( filePathSep = string(filepath.Separator) // dirs - cmdDir = "cmd" - managerDir = cmdDir + filePathSep + "manager" - pkgDir = "pkg" - apisDir = pkgDir + filePathSep + "apis" - controllerDir = pkgDir + filePathSep + "controller" - buildDir = "build" - buildTestDir = buildDir + filePathSep + "test-framework" - deployDir = "deploy" - olmCatalogDir = deployDir + filePathSep + "olm-catalog" - crdsDir = deployDir + filePathSep + "crds" - versionDir = "version" + CmdDir = "cmd" + ManagerDir = CmdDir + filePathSep + "manager" + PkgDir = "pkg" + ApisDir = PkgDir + filePathSep + "apis" + ControllerDir = PkgDir + filePathSep + "controller" + BuildDir = "build" + BuildTestDir = BuildDir + filePathSep + "test-framework" + DeployDir = "deploy" + OlmCatalogDir = DeployDir + filePathSep + "olm-catalog" + CrdsDir = DeployDir + filePathSep + "crds" + VersionDir = "version" ) diff --git a/pkg/scaffold/controller.go b/pkg/scaffold/controller.go index 1f7d9f47afc..d47fa919276 100644 --- a/pkg/scaffold/controller.go +++ b/pkg/scaffold/controller.go @@ -28,7 +28,7 @@ type Controller struct { func (s *Controller) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(controllerDir, ControllerFile) + s.Path = filepath.Join(ControllerDir, ControllerFile) } s.TemplateBody = controllerTmpl return s.Input, nil diff --git a/pkg/scaffold/controller_kind.go b/pkg/scaffold/controller_kind.go index 8a5bba1b3a2..d831066b0d9 100644 --- a/pkg/scaffold/controller_kind.go +++ b/pkg/scaffold/controller_kind.go @@ -31,7 +31,7 @@ type ControllerKind struct { func (s *ControllerKind) GetInput() (input.Input, error) { if s.Path == "" { fileName := s.Resource.LowerKind + "_controller.go" - s.Path = filepath.Join(controllerDir, s.Resource.LowerKind, fileName) + s.Path = filepath.Join(ControllerDir, s.Resource.LowerKind, fileName) } // Error if this file exists. s.IfExistsAction = input.Error diff --git a/pkg/scaffold/cr.go b/pkg/scaffold/cr.go index 609d24878ff..18d58cc03e2 100644 --- a/pkg/scaffold/cr.go +++ b/pkg/scaffold/cr.go @@ -36,7 +36,7 @@ func (s *Cr) GetInput() (input.Input, error) { strings.ToLower(s.Resource.Group), strings.ToLower(s.Resource.Version), s.Resource.LowerKind) - s.Path = filepath.Join(crdsDir, fileName) + s.Path = filepath.Join(CrdsDir, fileName) } s.TemplateBody = crTemplate return s.Input, nil diff --git a/pkg/scaffold/crd.go b/pkg/scaffold/crd.go index cf9c9700cff..91ba943b612 100644 --- a/pkg/scaffold/crd.go +++ b/pkg/scaffold/crd.go @@ -36,7 +36,7 @@ func (s *Crd) GetInput() (input.Input, error) { strings.ToLower(s.Resource.Group), strings.ToLower(s.Resource.Version), s.Resource.LowerKind) - s.Path = filepath.Join(crdsDir, fileName) + s.Path = filepath.Join(CrdsDir, fileName) } s.TemplateBody = crdTemplate return s.Input, nil diff --git a/pkg/scaffold/doc.go b/pkg/scaffold/doc.go index 2a758bac4fa..86bd812d7db 100644 --- a/pkg/scaffold/doc.go +++ b/pkg/scaffold/doc.go @@ -33,7 +33,7 @@ type Doc struct { func (s *Doc) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(apisDir, + s.Path = filepath.Join(ApisDir, strings.ToLower(s.Resource.Group), strings.ToLower(s.Resource.Version), DocFile) diff --git a/pkg/scaffold/go_test_script.go b/pkg/scaffold/go_test_script.go index 122834d5431..2a4427887b9 100644 --- a/pkg/scaffold/go_test_script.go +++ b/pkg/scaffold/go_test_script.go @@ -28,7 +28,7 @@ type GoTestScript struct { func (s *GoTestScript) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(buildTestDir, GoTestScriptFile) + s.Path = filepath.Join(BuildTestDir, GoTestScriptFile) } s.IsExec = true s.TemplateBody = goTestScriptTmpl diff --git a/pkg/scaffold/operator.go b/pkg/scaffold/operator.go index 02df5aa1caa..f89eaf8d140 100644 --- a/pkg/scaffold/operator.go +++ b/pkg/scaffold/operator.go @@ -28,7 +28,7 @@ type Operator struct { func (s *Operator) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(deployDir, OperatorYamlFile) + s.Path = filepath.Join(DeployDir, OperatorYamlFile) } s.TemplateBody = operatorTemplate return s.Input, nil diff --git a/pkg/scaffold/register.go b/pkg/scaffold/register.go index b3dabc7c5ac..7c8a0329a98 100644 --- a/pkg/scaffold/register.go +++ b/pkg/scaffold/register.go @@ -33,7 +33,7 @@ type Register struct { func (s *Register) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(apisDir, + s.Path = filepath.Join(ApisDir, strings.ToLower(s.Resource.Group), strings.ToLower(s.Resource.Version), RegisterFile) diff --git a/pkg/scaffold/role.go b/pkg/scaffold/role.go index 439ac5940b5..eb6299850ee 100644 --- a/pkg/scaffold/role.go +++ b/pkg/scaffold/role.go @@ -28,7 +28,7 @@ type Role struct { func (s *Role) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(deployDir, RoleYamlFile) + s.Path = filepath.Join(DeployDir, RoleYamlFile) } s.TemplateBody = roleTemplate return s.Input, nil diff --git a/pkg/scaffold/rolebinding.go b/pkg/scaffold/rolebinding.go index dee9a0cb18d..a9718354f37 100644 --- a/pkg/scaffold/rolebinding.go +++ b/pkg/scaffold/rolebinding.go @@ -28,7 +28,7 @@ type RoleBinding struct { func (s *RoleBinding) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(deployDir, RoleBindingYamlFile) + s.Path = filepath.Join(DeployDir, RoleBindingYamlFile) } s.TemplateBody = roleBindingTemplate return s.Input, nil diff --git a/pkg/scaffold/service_account.go b/pkg/scaffold/service_account.go index 9f471f04ad1..456f89a4921 100644 --- a/pkg/scaffold/service_account.go +++ b/pkg/scaffold/service_account.go @@ -28,7 +28,7 @@ type ServiceAccount struct { func (s *ServiceAccount) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(deployDir, ServiceAccountYamlFile) + s.Path = filepath.Join(DeployDir, ServiceAccountYamlFile) } s.TemplateBody = serviceAccountTemplate return s.Input, nil diff --git a/pkg/scaffold/test_framework_dockerfile.go b/pkg/scaffold/test_framework_dockerfile.go index 8ac63b0cf4b..618c6bd912b 100644 --- a/pkg/scaffold/test_framework_dockerfile.go +++ b/pkg/scaffold/test_framework_dockerfile.go @@ -26,7 +26,7 @@ type TestFrameworkDockerfile struct { func (s *TestFrameworkDockerfile) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(buildTestDir, DockerfileFile) + s.Path = filepath.Join(BuildTestDir, DockerfileFile) } s.TemplateBody = testFrameworkDockerfileTmpl return s.Input, nil diff --git a/pkg/scaffold/test_pod.go b/pkg/scaffold/test_pod.go index d780efbb702..0bb423530b7 100644 --- a/pkg/scaffold/test_pod.go +++ b/pkg/scaffold/test_pod.go @@ -34,7 +34,7 @@ type TestPod struct { func (s *TestPod) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(deployDir, TestPodYamlFile) + s.Path = filepath.Join(DeployDir, TestPodYamlFile) } s.TemplateBody = testPodTmpl return s.Input, nil diff --git a/pkg/scaffold/types.go b/pkg/scaffold/types.go index 5c90f0224cb..ccf5d7d4364 100644 --- a/pkg/scaffold/types.go +++ b/pkg/scaffold/types.go @@ -31,7 +31,7 @@ type Types struct { func (s *Types) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(apisDir, + s.Path = filepath.Join(ApisDir, strings.ToLower(s.Resource.Group), strings.ToLower(s.Resource.Version), s.Resource.LowerKind+"_types.go") diff --git a/pkg/scaffold/version.go b/pkg/scaffold/version.go index 87fab76387e..f844062a6ca 100644 --- a/pkg/scaffold/version.go +++ b/pkg/scaffold/version.go @@ -28,7 +28,7 @@ type Version struct { func (s *Version) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join(versionDir, VersionFile) + s.Path = filepath.Join(VersionDir, VersionFile) } s.TemplateBody = versionTemplate return s.Input, nil From 2477da49c5cd17e2ddb051c5f91403f1c2533bf9 Mon Sep 17 00:00:00 2001 From: Eric Stroczynski Date: Thu, 18 Oct 2018 17:26:05 -0700 Subject: [PATCH 3/8] pkg/scaffold/ansible/*: update Ansible scaffolds with scaffold constants --- pkg/scaffold/ansible/dockerfile.go | 3 ++- pkg/scaffold/ansible/operator.go | 3 ++- pkg/scaffold/ansible/playbook.go | 4 +++- pkg/scaffold/ansible/{watches_yaml.go => watches.go} | 6 ++---- 4 files changed, 9 insertions(+), 7 deletions(-) rename pkg/scaffold/ansible/{watches_yaml.go => watches.go} (95%) diff --git a/pkg/scaffold/ansible/dockerfile.go b/pkg/scaffold/ansible/dockerfile.go index 9d5c8af6a9d..dc49c141dff 100644 --- a/pkg/scaffold/ansible/dockerfile.go +++ b/pkg/scaffold/ansible/dockerfile.go @@ -17,6 +17,7 @@ package ansible import ( "path/filepath" + "github.com/operator-framework/operator-sdk/pkg/scaffold" "github.com/operator-framework/operator-sdk/pkg/scaffold/input" ) @@ -30,7 +31,7 @@ type Dockerfile struct { // GetInput - gets the input func (d *Dockerfile) GetInput() (input.Input, error) { if d.Path == "" { - d.Path = filepath.Join("build", "Dockerfile") + d.Path = filepath.Join(scaffold.BuildDir, scaffold.DockerfileFile) } d.TemplateBody = dockerFileAnsibleTmpl return d.Input, nil diff --git a/pkg/scaffold/ansible/operator.go b/pkg/scaffold/ansible/operator.go index 7e2ade5a22c..c4031e7eb0d 100644 --- a/pkg/scaffold/ansible/operator.go +++ b/pkg/scaffold/ansible/operator.go @@ -17,6 +17,7 @@ package ansible import ( "path/filepath" + "github.com/operator-framework/operator-sdk/pkg/scaffold" "github.com/operator-framework/operator-sdk/pkg/scaffold/input" ) @@ -26,7 +27,7 @@ type Operator struct { func (s *Operator) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = filepath.Join("deploy", "operator.yaml") + s.Path = filepath.Join(scaffold.DeployDir, scaffold.OperatorYamlFile) } s.TemplateBody = operatorTemplate return s.Input, nil diff --git a/pkg/scaffold/ansible/playbook.go b/pkg/scaffold/ansible/playbook.go index d1609cbdfe7..b0c4f634c7e 100644 --- a/pkg/scaffold/ansible/playbook.go +++ b/pkg/scaffold/ansible/playbook.go @@ -19,6 +19,8 @@ import ( "github.com/operator-framework/operator-sdk/pkg/scaffold/input" ) +const PlaybookYamlFile = "playbook.yaml" + // Playbook - the playbook tmpl wrapper type Playbook struct { input.Input @@ -28,7 +30,7 @@ type Playbook struct { // GetInput - gets the input func (p *Playbook) GetInput() (input.Input, error) { if p.Path == "" { - p.Path = "playbook.yaml" + p.Path = PlaybookYamlFile } p.TemplateBody = playbookTmpl return p.Input, nil diff --git a/pkg/scaffold/ansible/watches_yaml.go b/pkg/scaffold/ansible/watches.go similarity index 95% rename from pkg/scaffold/ansible/watches_yaml.go rename to pkg/scaffold/ansible/watches.go index 0f5c7c45d5d..749bda165eb 100644 --- a/pkg/scaffold/ansible/watches_yaml.go +++ b/pkg/scaffold/ansible/watches.go @@ -19,9 +19,7 @@ import ( "github.com/operator-framework/operator-sdk/pkg/scaffold/input" ) -const ( - watchesFile = "watches.yaml" -) +const WatchesYamlFile = "watches.yaml" // WatchesYAML - watches yaml input wrapper type WatchesYAML struct { @@ -34,7 +32,7 @@ type WatchesYAML struct { // GetInput - gets the input func (s *WatchesYAML) GetInput() (input.Input, error) { if s.Path == "" { - s.Path = watchesFile + s.Path = WatchesYamlFile } s.TemplateBody = watchesYAMLTmpl return s.Input, nil From be5ae8d8e1cdcedb9d514b35655b05fe59a2b238 Mon Sep 17 00:00:00 2001 From: Eric Stroczynski Date: Thu, 18 Oct 2018 17:59:55 -0700 Subject: [PATCH 4/8] commands/operator-sdk/cmd/*,pkg/scaffold/constants.go: use scaffold constants instead of hard-coded strings for dirs and filenames --- commands/operator-sdk/cmd/add/crd.go | 9 ++----- commands/operator-sdk/cmd/build.go | 22 +++++++--------- commands/operator-sdk/cmd/generate/k8s.go | 9 +++---- commands/operator-sdk/cmd/test/cluster.go | 3 ++- commands/operator-sdk/cmd/test/local.go | 32 +++++++++++++---------- commands/operator-sdk/cmd/up/local.go | 7 +++-- pkg/scaffold/constants.go | 1 + 7 files changed, 41 insertions(+), 42 deletions(-) diff --git a/commands/operator-sdk/cmd/add/crd.go b/commands/operator-sdk/cmd/add/crd.go index 185242a3a2d..f63f04cc704 100644 --- a/commands/operator-sdk/cmd/add/crd.go +++ b/commands/operator-sdk/cmd/add/crd.go @@ -28,11 +28,6 @@ import ( "github.com/spf13/cobra" ) -const ( - goDir = "GOPATH" - deployCrdDir = "deploy" -) - // NewAddCrdCmd - add crd command func NewAddCrdCmd() *cobra.Command { crdCmd := &cobra.Command{ @@ -111,8 +106,8 @@ func verifyCrdDeployPath() { log.Fatalf("failed to determine the full path of the current directory: %v", err) } // check if the deploy sub-directory exist - _, err = os.Stat(filepath.Join(wd, deployCrdDir)) + _, err = os.Stat(filepath.Join(wd, scaffold.DeployDir)) if err != nil { - log.Fatalf("the path (./%v) does not exist. run this command in your project directory", deployCrdDir) + log.Fatalf("the path (./%v) does not exist. run this command in your project directory", scaffold.DeployDir) } } diff --git a/commands/operator-sdk/cmd/build.go b/commands/operator-sdk/cmd/build.go index 247e26bc384..f3b694780bc 100644 --- a/commands/operator-sdk/cmd/build.go +++ b/commands/operator-sdk/cmd/build.go @@ -132,10 +132,6 @@ func verifyTestManifest(image string) { } } -const ( - mainGo = "./cmd/manager/main.go" -) - func buildFunc(cmd *cobra.Command, args []string) { if len(args) != 1 { log.Fatalf("build command needs exactly 1 argument") @@ -150,8 +146,8 @@ func buildFunc(cmd *cobra.Command, args []string) { // Don't need to buld go code if Ansible Operator if mainExists() { - managerDir := filepath.Join(cmdutil.CheckAndGetCurrPkg(), "cmd/manager") - outputBinName := filepath.Join(wd, "build/_output/bin", filepath.Base(wd)) + managerDir := filepath.Join(cmdutil.CheckAndGetCurrPkg(), scaffold.ManagerDir) + outputBinName := filepath.Join(wd, scaffold.BuildBinDir, filepath.Base(wd)) buildCmd := exec.Command("go", "build", "-o", outputBinName, managerDir) buildCmd.Env = goBuildEnv o, err := buildCmd.CombinedOutput() @@ -178,7 +174,8 @@ func buildFunc(cmd *cobra.Command, args []string) { fmt.Fprintln(os.Stdout, string(o)) if enableTests { - buildTestCmd := exec.Command("go", "test", "-c", "-o", filepath.Join(wd, "build/_output/bin", filepath.Base(wd)+"-test"), testLocationBuild+"/...") + testBinary := filepath.Join(wd, scaffold.BuildBinDir, filepath.Base(wd)+"-test") + buildTestCmd := exec.Command("go", "test", "-c", "-o", testBinary, testLocationBuild+"/...") buildTestCmd.Env = goBuildEnv o, err := buildTestCmd.CombinedOutput() if err != nil { @@ -186,7 +183,8 @@ func buildFunc(cmd *cobra.Command, args []string) { } fmt.Fprintln(os.Stdout, string(o)) // if a user is using an older sdk repo as their library, make sure they have required build files - _, err = os.Stat("build/test-framework/Dockerfile") + testDockerfile := filepath.Join(scaffold.BuildTestDir, scaffold.DockerfileFile) + _, err = os.Stat(testDockerfile) if err != nil && os.IsNotExist(err) { absProjectPath := cmdutil.MustGetwd() @@ -207,7 +205,7 @@ func buildFunc(cmd *cobra.Command, args []string) { } } - testDbcmd := exec.Command("docker", "build", ".", "-f", "build/test-framework/Dockerfile", "-t", image, "--build-arg", "NAMESPACEDMAN="+namespacedManBuild, "--build-arg", "BASEIMAGE="+baseImageName) + testDbcmd := exec.Command("docker", "build", ".", "-f", testDockerfile, "-t", image, "--build-arg", "NAMESPACEDMAN="+namespacedManBuild, "--build-arg", "BASEIMAGE="+baseImageName) o, err = testDbcmd.CombinedOutput() if err != nil { log.Fatalf("failed to output build image %s: %v (%s)", image, err, string(o)) @@ -219,8 +217,6 @@ func buildFunc(cmd *cobra.Command, args []string) { } func mainExists() bool { - if _, err := os.Stat(mainGo); err == nil { - return true - } - return false + _, err := os.Stat(filepath.Join(scaffold.ManagerDir, scaffold.CmdFile)) + return err == nil } diff --git a/commands/operator-sdk/cmd/generate/k8s.go b/commands/operator-sdk/cmd/generate/k8s.go index beaa45c774e..d7fac1f85c5 100644 --- a/commands/operator-sdk/cmd/generate/k8s.go +++ b/commands/operator-sdk/cmd/generate/k8s.go @@ -51,7 +51,7 @@ func K8sCodegen() { cmdutil.MustInProjectRoot() repoPkg := cmdutil.CheckAndGetCurrPkg() outputPkg := filepath.Join(repoPkg, "pkg/generated") - apisPkg := filepath.Join(repoPkg, "pkg/apis") + apisPkg := filepath.Join(repoPkg, scaffold.ApisDir) groupVersions, err := parseGroupVersions() if err != nil { log.Fatalf("failed to parse group versions: (%v)", err) @@ -79,16 +79,15 @@ func K8sCodegen() { // in the format "groupA:v1,v2 groupB:v1 groupC:v2", // as required by the generate-groups.sh script func parseGroupVersions() (string, error) { - groupVersions := "" - apisDir := filepath.Join("pkg", "apis") - groups, err := ioutil.ReadDir(apisDir) + var groupVersions string + groups, err := ioutil.ReadDir(scaffold.ApisDir) if err != nil { return "", fmt.Errorf("could not read pkg/apis directory to find api Versions: %v", err) } for _, g := range groups { if g.IsDir() { - groupDir := filepath.Join(apisDir, g.Name()) + groupDir := filepath.Join(scaffold.ApisDir, g.Name()) versions, err := ioutil.ReadDir(groupDir) if err != nil { return "", fmt.Errorf("could not read %s directory to find api Versions: %v", groupDir, err) diff --git a/commands/operator-sdk/cmd/test/cluster.go b/commands/operator-sdk/cmd/test/cluster.go index 678dfb8538f..cb02ab939e4 100644 --- a/commands/operator-sdk/cmd/test/cluster.go +++ b/commands/operator-sdk/cmd/test/cluster.go @@ -21,6 +21,7 @@ import ( "strings" "time" + "github.com/operator-framework/operator-sdk/pkg/scaffold" "github.com/operator-framework/operator-sdk/pkg/test" "github.com/spf13/cobra" @@ -89,7 +90,7 @@ func testClusterFunc(cmd *cobra.Command, args []string) error { Name: "operator-test", Image: args[0], ImagePullPolicy: pullPolicy, - Command: []string{"/go-test.sh"}, + Command: []string{"/" + scaffold.GoTestScriptFile}, Env: []v1.EnvVar{{ Name: test.TestNamespaceEnv, ValueFrom: &v1.EnvVarSource{FieldRef: &v1.ObjectFieldSelector{FieldPath: "metadata.namespace"}}, diff --git a/commands/operator-sdk/cmd/test/local.go b/commands/operator-sdk/cmd/test/local.go index 074ac0bd8d1..f075eb76186 100644 --- a/commands/operator-sdk/cmd/test/local.go +++ b/commands/operator-sdk/cmd/test/local.go @@ -24,11 +24,14 @@ import ( "strings" "github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/cmdutil" + "github.com/operator-framework/operator-sdk/pkg/scaffold" "github.com/operator-framework/operator-sdk/pkg/test" "github.com/spf13/cobra" ) +var deployTestDir = filepath.Join(scaffold.DeployDir, "test") + type testLocalConfig struct { kubeconfig string globalManPath string @@ -65,25 +68,26 @@ func testLocalFunc(cmd *cobra.Command, args []string) { } // if no namespaced manifest path is given, combine deploy/service_account.yaml, deploy/role.yaml, deploy/role_binding.yaml and deploy/operator.yaml if tlConfig.namespacedManPath == "" { - err := os.MkdirAll("deploy/test", os.FileMode(cmdutil.DefaultDirFileMode)) + err := os.MkdirAll(deployTestDir, os.FileMode(cmdutil.DefaultDirFileMode)) if err != nil { - log.Fatalf("could not create deploy/test: %v", err) + log.Fatalf("could not create %s: %v", deployTestDir, err) } - tlConfig.namespacedManPath = "deploy/test/namespace-manifests.yaml" + tlConfig.namespacedManPath = filepath.Join(deployTestDir, "namespace-manifests.yaml") - sa, err := ioutil.ReadFile("deploy/service_account.yaml") + saFile := filepath.Join(scaffold.DeployDir, scaffold.ServiceAccountYamlFile) + sa, err := ioutil.ReadFile(saFile) if err != nil { - log.Fatalf("could not find the manifest deploy/service_account.yaml: %v", err) + log.Fatalf("could not find the manifest %s: %v", saFile, err) } - role, err := ioutil.ReadFile("deploy/role.yaml") + role, err := ioutil.ReadFile(filepath.Join(scaffold.DeployDir, scaffold.RoleYamlFile)) if err != nil { log.Fatalf("could not find role manifest: %v", err) } - roleBinding, err := ioutil.ReadFile("deploy/role_binding.yaml") + roleBinding, err := ioutil.ReadFile(filepath.Join(scaffold.DeployDir, scaffold.RoleBindingYamlFile)) if err != nil { log.Fatalf("could not find role_binding manifest: %v", err) } - operator, err := ioutil.ReadFile("deploy/operator.yaml") + operator, err := ioutil.ReadFile(filepath.Join(scaffold.DeployDir, scaffold.OperatorYamlFile)) if err != nil { log.Fatalf("could not find operator manifest: %v", err) } @@ -105,21 +109,21 @@ func testLocalFunc(cmd *cobra.Command, args []string) { }() } if tlConfig.globalManPath == "" { - err := os.MkdirAll("deploy/test", os.FileMode(cmdutil.DefaultDirFileMode)) + err := os.MkdirAll(deployTestDir, os.FileMode(cmdutil.DefaultDirFileMode)) if err != nil { - log.Fatalf("could not create deploy/test: %v", err) + log.Fatalf("could not create %s: %v", deployTestDir, err) } - tlConfig.globalManPath = "deploy/test/global-manifests.yaml" - files, err := ioutil.ReadDir("deploy/crds") + tlConfig.globalManPath = filepath.Join(deployTestDir, "global-manifests.yaml") + files, err := ioutil.ReadDir(scaffold.CrdsDir) if err != nil { log.Fatalf("could not read deploy directory: %v", err) } var combined []byte for _, file := range files { if strings.HasSuffix(file.Name(), "crd.yaml") { - fileBytes, err := ioutil.ReadFile(filepath.Join("deploy/crds", file.Name())) + fileBytes, err := ioutil.ReadFile(filepath.Join(scaffold.CrdsDir, file.Name())) if err != nil { - log.Fatalf("could not read file deploy/crds/%s: %v", file.Name(), err) + log.Fatalf("could not read file %s: %v", filepath.Join(scaffold.CrdsDir, file.Name()), err) } if combined == nil { combined = []byte{} diff --git a/commands/operator-sdk/cmd/up/local.go b/commands/operator-sdk/cmd/up/local.go index 4b5fbbf8c5b..96923bab403 100644 --- a/commands/operator-sdk/cmd/up/local.go +++ b/commands/operator-sdk/cmd/up/local.go @@ -30,8 +30,11 @@ import ( "github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/cmdutil" ansibleOperator "github.com/operator-framework/operator-sdk/pkg/ansible/operator" proxy "github.com/operator-framework/operator-sdk/pkg/ansible/proxy" + "github.com/operator-framework/operator-sdk/pkg/scaffold" + ansibleScaffold "github.com/operator-framework/operator-sdk/pkg/scaffold/ansible" "github.com/operator-framework/operator-sdk/pkg/util/k8sutil" sdkVersion "github.com/operator-framework/operator-sdk/version" + "github.com/sirupsen/logrus" "github.com/spf13/cobra" "sigs.k8s.io/controller-runtime/pkg/client/config" @@ -97,7 +100,7 @@ func mustKubeConfig() { } func upLocal() { - args := []string{"run", filepath.Join("cmd", "manager", "main.go")} + args := []string{"run", filepath.Join(scaffold.ManagerDir, scaffold.CmdFile)} if operatorFlags != "" { extraArgs := strings.Split(operatorFlags, " ") args = append(args, extraArgs...) @@ -143,7 +146,7 @@ func upLocalAnsible() { } // start the operator - go ansibleOperator.Run(done, mgr, "./watches.yaml", time.Minute) + go ansibleOperator.Run(done, mgr, "./"+ansibleScaffold.WatchesYamlFile, time.Minute) // wait for either to finish err = <-done diff --git a/pkg/scaffold/constants.go b/pkg/scaffold/constants.go index c71b6132366..fdcbbccb067 100644 --- a/pkg/scaffold/constants.go +++ b/pkg/scaffold/constants.go @@ -30,6 +30,7 @@ const ( ControllerDir = PkgDir + filePathSep + "controller" BuildDir = "build" BuildTestDir = BuildDir + filePathSep + "test-framework" + BuildBinDir = BuildDir + filePathSep + "_output" + filePathSep + "bin" DeployDir = "deploy" OlmCatalogDir = DeployDir + filePathSep + "olm-catalog" CrdsDir = DeployDir + filePathSep + "crds" From 1f17426a6b0ba5c79a0d2064da0a583cc6af5916 Mon Sep 17 00:00:00 2001 From: Eric Stroczynski Date: Fri, 19 Oct 2018 16:32:01 -0700 Subject: [PATCH 5/8] internal: moved file and project utilities that are not intended to be exported commands/operator-sdk/cmd/*: use internal/util packages and get rid of command/.../cmdutil pkg/util/*: move all pkg utilities into pkg/util --- commands/operator-sdk/cmd/add/api.go | 9 +++--- commands/operator-sdk/cmd/add/controller.go | 8 ++--- commands/operator-sdk/cmd/add/crd.go | 4 +-- commands/operator-sdk/cmd/build.go | 8 ++--- commands/operator-sdk/cmd/generate/k8s.go | 6 ++-- commands/operator-sdk/cmd/new.go | 29 ++++++++++--------- commands/operator-sdk/cmd/test/local.go | 15 +++++----- commands/operator-sdk/cmd/up/local.go | 10 +++---- .../util/fileutil}/file_util.go | 2 +- .../util/projutil/project_util.go | 16 ++++------ pkg/scaffold/scaffold.go | 8 ++--- 11 files changed, 57 insertions(+), 58 deletions(-) rename {pkg/util => internal/util/fileutil}/file_util.go (99%) rename commands/operator-sdk/cmd/cmdutil/util.go => internal/util/projutil/project_util.go (98%) diff --git a/commands/operator-sdk/cmd/add/api.go b/commands/operator-sdk/cmd/add/api.go index ce8e1ccaa3e..67d63f76cb0 100644 --- a/commands/operator-sdk/cmd/add/api.go +++ b/commands/operator-sdk/cmd/add/api.go @@ -17,8 +17,9 @@ package add import ( "log" - "github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/cmdutil" "github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/generate" + "github.com/operator-framework/operator-sdk/internal/util/fileutil" + "github.com/operator-framework/operator-sdk/internal/util/projutil" "github.com/operator-framework/operator-sdk/pkg/scaffold" "github.com/operator-framework/operator-sdk/pkg/scaffold/input" @@ -64,16 +65,16 @@ Example: func apiRun(cmd *cobra.Command, args []string) { // Create and validate new resource - cmdutil.MustInProjectRoot() + projutil.MustInProjectRoot() r, err := scaffold.NewResource(apiVersion, kind) if err != nil { log.Fatal(err) } - absProjectPath := cmdutil.MustGetwd() + absProjectPath := projutil.MustGetwd() cfg := &input.Config{ - Repo: cmdutil.CheckAndGetCurrPkg(), + Repo: projutil.CheckAndGetCurrPkg(), AbsProjectPath: absProjectPath, } diff --git a/commands/operator-sdk/cmd/add/controller.go b/commands/operator-sdk/cmd/add/controller.go index dd52233d807..dff0303a686 100644 --- a/commands/operator-sdk/cmd/add/controller.go +++ b/commands/operator-sdk/cmd/add/controller.go @@ -17,7 +17,7 @@ package add import ( "log" - "github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/cmdutil" + "github.com/operator-framework/operator-sdk/internal/util/projutil" "github.com/operator-framework/operator-sdk/pkg/scaffold" "github.com/operator-framework/operator-sdk/pkg/scaffold/input" @@ -57,7 +57,7 @@ Example: } func controllerRun(cmd *cobra.Command, args []string) { - cmdutil.MustInProjectRoot() + projutil.MustInProjectRoot() // Create and validate new resource r, err := scaffold.NewResource(apiVersion, kind) if err != nil { @@ -65,8 +65,8 @@ func controllerRun(cmd *cobra.Command, args []string) { } cfg := &input.Config{ - Repo: cmdutil.CheckAndGetCurrPkg(), - AbsProjectPath: cmdutil.MustGetwd(), + Repo: projutil.CheckAndGetCurrPkg(), + AbsProjectPath: projutil.MustGetwd(), } s := &scaffold.Scaffold{} diff --git a/commands/operator-sdk/cmd/add/crd.go b/commands/operator-sdk/cmd/add/crd.go index f63f04cc704..0c587eae991 100644 --- a/commands/operator-sdk/cmd/add/crd.go +++ b/commands/operator-sdk/cmd/add/crd.go @@ -21,7 +21,7 @@ import ( "path/filepath" "strings" - "github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/cmdutil" + "github.com/operator-framework/operator-sdk/internal/util/projutil" "github.com/operator-framework/operator-sdk/pkg/scaffold" "github.com/operator-framework/operator-sdk/pkg/scaffold/input" @@ -52,7 +52,7 @@ Generated CR filename: /deploy/crds/___cr.y func crdFunc(cmd *cobra.Command, args []string) { cfg := &input.Config{ - AbsProjectPath: cmdutil.MustGetwd(), + AbsProjectPath: projutil.MustGetwd(), } if len(args) != 0 { log.Fatal("crd command doesn't accept any arguments") diff --git a/commands/operator-sdk/cmd/build.go b/commands/operator-sdk/cmd/build.go index f3b694780bc..7db71a17ea4 100644 --- a/commands/operator-sdk/cmd/build.go +++ b/commands/operator-sdk/cmd/build.go @@ -24,7 +24,7 @@ import ( "os/exec" "path/filepath" - "github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/cmdutil" + "github.com/operator-framework/operator-sdk/internal/util/projutil" "github.com/operator-framework/operator-sdk/pkg/scaffold" "github.com/operator-framework/operator-sdk/pkg/scaffold/input" "github.com/operator-framework/operator-sdk/pkg/test" @@ -137,7 +137,7 @@ func buildFunc(cmd *cobra.Command, args []string) { log.Fatalf("build command needs exactly 1 argument") } - cmdutil.MustInProjectRoot() + projutil.MustInProjectRoot() goBuildEnv := append(os.Environ(), "GOOS=linux", "GOARCH=amd64", "CGO_ENABLED=0") wd, err := os.Getwd() if err != nil { @@ -187,9 +187,9 @@ func buildFunc(cmd *cobra.Command, args []string) { _, err = os.Stat(testDockerfile) if err != nil && os.IsNotExist(err) { - absProjectPath := cmdutil.MustGetwd() + absProjectPath := projutil.MustGetwd() cfg := &input.Config{ - Repo: cmdutil.CheckAndGetCurrPkg(), + Repo: projutil.CheckAndGetCurrPkg(), AbsProjectPath: absProjectPath, ProjectName: filepath.Base(wd), } diff --git a/commands/operator-sdk/cmd/generate/k8s.go b/commands/operator-sdk/cmd/generate/k8s.go index d7fac1f85c5..6ab093caaed 100644 --- a/commands/operator-sdk/cmd/generate/k8s.go +++ b/commands/operator-sdk/cmd/generate/k8s.go @@ -22,7 +22,7 @@ import ( "os/exec" "path/filepath" - "github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/cmdutil" + "github.com/operator-framework/operator-sdk/internal/util/projutil" "github.com/operator-framework/operator-sdk/pkg/scaffold" "github.com/spf13/cobra" @@ -48,8 +48,8 @@ func k8sFunc(cmd *cobra.Command, args []string) { // K8sCodegen performs deepcopy code-generation for all custom resources under pkg/apis func K8sCodegen() { - cmdutil.MustInProjectRoot() - repoPkg := cmdutil.CheckAndGetCurrPkg() + projutil.MustInProjectRoot() + repoPkg := projutil.CheckAndGetCurrPkg() outputPkg := filepath.Join(repoPkg, "pkg/generated") apisPkg := filepath.Join(repoPkg, scaffold.ApisDir) groupVersions, err := parseGroupVersions() diff --git a/commands/operator-sdk/cmd/new.go b/commands/operator-sdk/cmd/new.go index c918854f852..2665ed86f19 100644 --- a/commands/operator-sdk/cmd/new.go +++ b/commands/operator-sdk/cmd/new.go @@ -23,7 +23,8 @@ import ( "path/filepath" "strings" - "github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/cmdutil" + "github.com/operator-framework/operator-sdk/internal/util/fileutil" + "github.com/operator-framework/operator-sdk/internal/util/projutil" "github.com/operator-framework/operator-sdk/pkg/scaffold" "github.com/operator-framework/operator-sdk/pkg/scaffold/ansible" "github.com/operator-framework/operator-sdk/pkg/scaffold/input" @@ -83,10 +84,10 @@ func newFunc(cmd *cobra.Command, args []string) { verifyFlags() switch operatorType { - case cmdutil.OperatorTypeGo: + case projutil.OperatorTypeGo: doScaffold() pullDep() - case cmdutil.OperatorTypeAnsible: + case projutil.OperatorTypeAnsible: doAnsibleScaffold() } initGit() @@ -105,7 +106,7 @@ func parse(args []string) { // mustBeNewProject checks if the given project exists under the current diretory. // it exits with error when the project exists. func mustBeNewProject() { - fp := filepath.Join(cmdutil.MustGetwd(), projectName) + fp := filepath.Join(projutil.MustGetwd(), projectName) stat, err := os.Stat(fp) if err != nil && os.IsNotExist(err) { return @@ -120,8 +121,8 @@ func mustBeNewProject() { func doScaffold() { cfg := &input.Config{ - Repo: filepath.Join(cmdutil.CheckAndGetCurrPkg(), projectName), - AbsProjectPath: filepath.Join(cmdutil.MustGetwd(), projectName), + Repo: filepath.Join(projutil.CheckAndGetCurrPkg(), projectName), + AbsProjectPath: filepath.Join(projutil.MustGetwd(), projectName), ProjectName: projectName, } @@ -146,7 +147,7 @@ func doScaffold() { func doAnsibleScaffold() { cfg := &input.Config{ - AbsProjectPath: filepath.Join(cmdutil.MustGetwd(), projectName), + AbsProjectPath: filepath.Join(projutil.MustGetwd(), projectName), ProjectName: projectName, } @@ -225,8 +226,8 @@ func doAnsibleScaffold() { // repoPath field on generator is used primarily in generation of Go operator. For Ansible we will set it to cwd func repoPath() string { // We only care about GOPATH constraint checks if we are a Go operator - wd := cmdutil.MustGetwd() - if operatorType == cmdutil.OperatorTypeGo { + wd := projutil.MustGetwd() + if operatorType == projutil.OperatorTypeGo { gp := os.Getenv(gopath) if len(gp) == 0 { log.Fatal("$GOPATH env not set") @@ -244,17 +245,17 @@ func repoPath() string { } func verifyFlags() { - if operatorType != cmdutil.OperatorTypeGo && operatorType != cmdutil.OperatorTypeAnsible { + if operatorType != projutil.OperatorTypeGo && operatorType != projutil.OperatorTypeAnsible { log.Fatal("--type can only be `go` or `ansible`") } - if operatorType != cmdutil.OperatorTypeAnsible && generatePlaybook { + if operatorType != projutil.OperatorTypeAnsible && generatePlaybook { log.Fatal("--generate-playbook can only be used with --type `ansible`") } - if operatorType == cmdutil.OperatorTypeGo && (len(apiVersion) != 0 || len(kind) != 0) { + if operatorType == projutil.OperatorTypeGo && (len(apiVersion) != 0 || len(kind) != 0) { log.Fatal(`go type operator does not use --api-version or --kind. Please see "operator-sdk add" command after running new.`) } - if operatorType != cmdutil.OperatorTypeGo { + if operatorType != projutil.OperatorTypeGo { if len(apiVersion) == 0 { log.Fatal("--api-version must not have empty value") } @@ -273,7 +274,7 @@ func verifyFlags() { func execCmd(stdout *os.File, cmd string, args ...string) { dc := exec.Command(cmd, args...) - dc.Dir = filepath.Join(cmdutil.MustGetwd(), projectName) + dc.Dir = filepath.Join(projutil.MustGetwd(), projectName) dc.Stdout = stdout dc.Stderr = os.Stderr err := dc.Run() diff --git a/commands/operator-sdk/cmd/test/local.go b/commands/operator-sdk/cmd/test/local.go index f075eb76186..6a2ff5db993 100644 --- a/commands/operator-sdk/cmd/test/local.go +++ b/commands/operator-sdk/cmd/test/local.go @@ -23,7 +23,8 @@ import ( "path/filepath" "strings" - "github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/cmdutil" + "github.com/operator-framework/operator-sdk/internal/util/fileutil" + "github.com/operator-framework/operator-sdk/internal/util/projutil" "github.com/operator-framework/operator-sdk/pkg/scaffold" "github.com/operator-framework/operator-sdk/pkg/test" @@ -68,7 +69,7 @@ func testLocalFunc(cmd *cobra.Command, args []string) { } // if no namespaced manifest path is given, combine deploy/service_account.yaml, deploy/role.yaml, deploy/role_binding.yaml and deploy/operator.yaml if tlConfig.namespacedManPath == "" { - err := os.MkdirAll(deployTestDir, os.FileMode(cmdutil.DefaultDirFileMode)) + err := os.MkdirAll(deployTestDir, os.FileMode(fileutil.DefaultDirFileMode)) if err != nil { log.Fatalf("could not create %s: %v", deployTestDir, err) } @@ -97,7 +98,7 @@ func testLocalFunc(cmd *cobra.Command, args []string) { combined = append(combined, roleBinding...) combined = append(combined, []byte("\n---\n")...) combined = append(combined, operator...) - err = ioutil.WriteFile(tlConfig.namespacedManPath, combined, os.FileMode(cmdutil.DefaultFileMode)) + err = ioutil.WriteFile(tlConfig.namespacedManPath, combined, os.FileMode(fileutil.DefaultFileMode)) if err != nil { log.Fatalf("could not create temporary namespaced manifest file: %v", err) } @@ -109,7 +110,7 @@ func testLocalFunc(cmd *cobra.Command, args []string) { }() } if tlConfig.globalManPath == "" { - err := os.MkdirAll(deployTestDir, os.FileMode(cmdutil.DefaultDirFileMode)) + err := os.MkdirAll(deployTestDir, os.FileMode(fileutil.DefaultDirFileMode)) if err != nil { log.Fatalf("could not create %s: %v", deployTestDir, err) } @@ -133,7 +134,7 @@ func testLocalFunc(cmd *cobra.Command, args []string) { combined = append(combined, fileBytes...) } } - err = ioutil.WriteFile(tlConfig.globalManPath, combined, os.FileMode(cmdutil.DefaultFileMode)) + err = ioutil.WriteFile(tlConfig.globalManPath, combined, os.FileMode(fileutil.DefaultFileMode)) if err != nil { log.Fatalf("could not create temporary global manifest file: %v", err) } @@ -148,7 +149,7 @@ func testLocalFunc(cmd *cobra.Command, args []string) { testArgs = append(testArgs, "-"+test.KubeConfigFlag, tlConfig.kubeconfig) testArgs = append(testArgs, "-"+test.NamespacedManPathFlag, tlConfig.namespacedManPath) testArgs = append(testArgs, "-"+test.GlobalManPathFlag, tlConfig.globalManPath) - testArgs = append(testArgs, "-"+test.ProjRootFlag, cmdutil.MustGetwd()) + testArgs = append(testArgs, "-"+test.ProjRootFlag, projutil.MustGetwd()) // if we do the append using an empty go flags, it inserts an empty arg, which causes // any later flags to be ignored if tlConfig.goTestFlags != "" { @@ -159,7 +160,7 @@ func testLocalFunc(cmd *cobra.Command, args []string) { } dc := exec.Command("go", testArgs...) dc.Env = append(os.Environ(), fmt.Sprintf("%v=%v", test.TestNamespaceEnv, tlConfig.namespace)) - dc.Dir = cmdutil.MustGetwd() + dc.Dir = projutil.MustGetwd() dc.Stdout = os.Stdout dc.Stderr = os.Stderr err := dc.Run() diff --git a/commands/operator-sdk/cmd/up/local.go b/commands/operator-sdk/cmd/up/local.go index 96923bab403..a4cc41a9af1 100644 --- a/commands/operator-sdk/cmd/up/local.go +++ b/commands/operator-sdk/cmd/up/local.go @@ -27,7 +27,7 @@ import ( "syscall" "time" - "github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/cmdutil" + "github.com/operator-framework/operator-sdk/internal/util/projutil" ansibleOperator "github.com/operator-framework/operator-sdk/pkg/ansible/operator" proxy "github.com/operator-framework/operator-sdk/pkg/ansible/proxy" "github.com/operator-framework/operator-sdk/pkg/scaffold" @@ -71,11 +71,11 @@ const ( func upLocalFunc(cmd *cobra.Command, args []string) { mustKubeConfig() - switch cmdutil.GetOperatorType() { - case cmdutil.OperatorTypeGo: - cmdutil.MustInProjectRoot() + switch projutil.GetOperatorType() { + case projutil.OperatorTypeGo: + projutil.MustInProjectRoot() upLocal() - case cmdutil.OperatorTypeAnsible: + case projutil.OperatorTypeAnsible: upLocalAnsible() default: log.Fatal("failed to determine operator type") diff --git a/pkg/util/file_util.go b/internal/util/fileutil/file_util.go similarity index 99% rename from pkg/util/file_util.go rename to internal/util/fileutil/file_util.go index dc96edd76aa..995edc210f7 100644 --- a/pkg/util/file_util.go +++ b/internal/util/fileutil/file_util.go @@ -14,7 +14,7 @@ // Modified from github.com/kubernetes-sigs/controller-tools/pkg/util/util.go -package util +package fileutil import ( "fmt" diff --git a/commands/operator-sdk/cmd/cmdutil/util.go b/internal/util/projutil/project_util.go similarity index 98% rename from commands/operator-sdk/cmd/cmdutil/util.go rename to internal/util/projutil/project_util.go index 64d2c1a8f5f..dcb03bfd0b7 100644 --- a/commands/operator-sdk/cmd/cmdutil/util.go +++ b/internal/util/projutil/project_util.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package cmdutil +package projutil import ( "encoding/json" @@ -32,10 +32,15 @@ import ( ) const ( + SrcDir = "src" gopkgToml = "./Gopkg.toml" buildDockerfile = "./build/Dockerfile" ) +const ( + GopathEnv = "GOPATH" +) + // OperatorType - the type of operator type OperatorType = string @@ -46,15 +51,6 @@ const ( OperatorTypeAnsible OperatorType = "ansible" ) -const ( - GopathEnv = "GOPATH" - SrcDir = "src" - - DefaultDirFileMode = 0750 - DefaultFileMode = 0644 - DefaultExecFileMode = 0744 -) - // MustInProjectRoot checks if the current dir is the project root and returns the current repo's import path // e.g github.com/example-inc/app-operator func MustInProjectRoot() { diff --git a/pkg/scaffold/scaffold.go b/pkg/scaffold/scaffold.go index 5b5c859cae5..18de34a82d2 100644 --- a/pkg/scaffold/scaffold.go +++ b/pkg/scaffold/scaffold.go @@ -26,8 +26,8 @@ import ( "strings" "text/template" + "github.com/operator-framework/operator-sdk/internal/util/fileutil" "github.com/operator-framework/operator-sdk/pkg/scaffold/input" - "github.com/operator-framework/operator-sdk/pkg/util" "golang.org/x/tools/imports" ) @@ -74,7 +74,7 @@ func (s *Scaffold) configure(cfg *input.Config) { // Execute executes scaffolding the Files func (s *Scaffold) Execute(cfg *input.Config, files ...input.File) error { if s.GetWriter == nil { - s.GetWriter = (&util.FileWriter{}).WriteCloser + s.GetWriter = (&fileutil.FileWriter{}).WriteCloser } // Configure s using common fields from cfg. @@ -128,9 +128,9 @@ func (s *Scaffold) doTemplate(i input.Input, e input.File, absPath string) error return err } - var mode os.FileMode = util.DefaultFileMode + var mode os.FileMode = fileutil.DefaultFileMode if i.IsExec { - mode = util.DefaultExecFileMode + mode = fileutil.DefaultExecFileMode } f, err := s.GetWriter(absPath, mode) if err != nil { From df4aa3bdaf57e574c9758a56d39f484bd1e51702 Mon Sep 17 00:00:00 2001 From: Eric Stroczynski Date: Tue, 23 Oct 2018 14:18:46 -0700 Subject: [PATCH 6/8] pkg/util/k8sutil -> pkg/k8sutil, pkg/tlsutil -> pkg/tls --- commands/operator-sdk/cmd/up/local.go | 2 +- pkg/{util => }/k8sutil/constants.go | 0 pkg/k8sutil/k8sutil.go | 83 +++++++ pkg/{util => }/k8sutil/k8sutil_test.go | 0 pkg/scaffold/cmd.go | 2 +- pkg/scaffold/cmd_test.go | 2 +- pkg/sdk/metrics.go | 2 +- pkg/{tlsutil => tls}/error.go | 0 pkg/{tlsutil => tls}/primitives.go | 2 +- pkg/{tlsutil => tls}/tls.go | 0 pkg/util/k8sutil/k8sutil.go | 208 ------------------ .../cmd/ansible-operator/main.go | 2 +- test/e2e/tls_util_test.go | 2 +- 13 files changed, 90 insertions(+), 215 deletions(-) rename pkg/{util => }/k8sutil/constants.go (100%) create mode 100644 pkg/k8sutil/k8sutil.go rename pkg/{util => }/k8sutil/k8sutil_test.go (100%) rename pkg/{tlsutil => tls}/error.go (100%) rename pkg/{tlsutil => tls}/primitives.go (99%) rename pkg/{tlsutil => tls}/tls.go (100%) delete mode 100644 pkg/util/k8sutil/k8sutil.go diff --git a/commands/operator-sdk/cmd/up/local.go b/commands/operator-sdk/cmd/up/local.go index a4cc41a9af1..b712f2255a9 100644 --- a/commands/operator-sdk/cmd/up/local.go +++ b/commands/operator-sdk/cmd/up/local.go @@ -30,9 +30,9 @@ import ( "github.com/operator-framework/operator-sdk/internal/util/projutil" ansibleOperator "github.com/operator-framework/operator-sdk/pkg/ansible/operator" proxy "github.com/operator-framework/operator-sdk/pkg/ansible/proxy" + "github.com/operator-framework/operator-sdk/pkg/k8sutil" "github.com/operator-framework/operator-sdk/pkg/scaffold" ansibleScaffold "github.com/operator-framework/operator-sdk/pkg/scaffold/ansible" - "github.com/operator-framework/operator-sdk/pkg/util/k8sutil" sdkVersion "github.com/operator-framework/operator-sdk/version" "github.com/sirupsen/logrus" diff --git a/pkg/util/k8sutil/constants.go b/pkg/k8sutil/constants.go similarity index 100% rename from pkg/util/k8sutil/constants.go rename to pkg/k8sutil/constants.go diff --git a/pkg/k8sutil/k8sutil.go b/pkg/k8sutil/k8sutil.go new file mode 100644 index 00000000000..3e6570853a9 --- /dev/null +++ b/pkg/k8sutil/k8sutil.go @@ -0,0 +1,83 @@ +// Copyright 2018 The Operator-SDK Authors +// +// 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 k8sutil + +import ( + "fmt" + "os" + + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + intstr "k8s.io/apimachinery/pkg/util/intstr" +) + +// GetWatchNamespace returns the namespace the operator should be watching for changes +func GetWatchNamespace() (string, error) { + ns, found := os.LookupEnv(WatchNamespaceEnvVar) + if !found { + return "", fmt.Errorf("%s must be set", WatchNamespaceEnvVar) + } + return ns, nil +} + +// GetOperatorName return the operator name +func GetOperatorName() (string, error) { + operatorName, found := os.LookupEnv(OperatorNameEnvVar) + if !found { + return "", fmt.Errorf("%s must be set", OperatorNameEnvVar) + } + if len(operatorName) == 0 { + return "", fmt.Errorf("%s must not be empty", OperatorNameEnvVar) + } + return operatorName, nil +} + +// InitOperatorService return the static service which expose operator metrics +func InitOperatorService() (*v1.Service, error) { + operatorName, err := GetOperatorName() + if err != nil { + return nil, err + } + namespace, err := GetWatchNamespace() + if err != nil { + return nil, err + } + service := &v1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: operatorName, + Namespace: namespace, + Labels: map[string]string{"name": operatorName}, + }, + TypeMeta: metav1.TypeMeta{ + Kind: "Service", + APIVersion: "v1", + }, + Spec: v1.ServiceSpec{ + Ports: []v1.ServicePort{ + { + Port: PrometheusMetricsPort, + Protocol: v1.ProtocolTCP, + TargetPort: intstr.IntOrString{ + Type: intstr.String, + StrVal: PrometheusMetricsPortName, + }, + Name: PrometheusMetricsPortName, + }, + }, + Selector: map[string]string{"name": operatorName}, + }, + } + return service, nil +} diff --git a/pkg/util/k8sutil/k8sutil_test.go b/pkg/k8sutil/k8sutil_test.go similarity index 100% rename from pkg/util/k8sutil/k8sutil_test.go rename to pkg/k8sutil/k8sutil_test.go diff --git a/pkg/scaffold/cmd.go b/pkg/scaffold/cmd.go index 38f51f9357c..a9f1923449c 100644 --- a/pkg/scaffold/cmd.go +++ b/pkg/scaffold/cmd.go @@ -44,7 +44,7 @@ import ( "{{ .Repo }}/pkg/apis" "{{ .Repo }}/pkg/controller" - k8sutil "github.com/operator-framework/operator-sdk/pkg/util/k8sutil" + "github.com/operator-framework/operator-sdk/pkg/k8sutil" sdkVersion "github.com/operator-framework/operator-sdk/version" _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" "sigs.k8s.io/controller-runtime/pkg/client/config" diff --git a/pkg/scaffold/cmd_test.go b/pkg/scaffold/cmd_test.go index e4eba028c9e..49aa8406045 100644 --- a/pkg/scaffold/cmd_test.go +++ b/pkg/scaffold/cmd_test.go @@ -40,7 +40,7 @@ import ( "github.com/example-inc/app-operator/pkg/apis" "github.com/example-inc/app-operator/pkg/controller" - k8sutil "github.com/operator-framework/operator-sdk/pkg/util/k8sutil" + "github.com/operator-framework/operator-sdk/pkg/k8sutil" sdkVersion "github.com/operator-framework/operator-sdk/version" _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" "sigs.k8s.io/controller-runtime/pkg/client/config" diff --git a/pkg/sdk/metrics.go b/pkg/sdk/metrics.go index 719cfdeda3a..2e603e97355 100644 --- a/pkg/sdk/metrics.go +++ b/pkg/sdk/metrics.go @@ -19,7 +19,7 @@ import ( "net/http" "strconv" - k8sutil "github.com/operator-framework/operator-sdk/pkg/util/k8sutil" + "github.com/operator-framework/operator-sdk/pkg/k8sutil" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/sirupsen/logrus" v1 "k8s.io/api/core/v1" diff --git a/pkg/tlsutil/error.go b/pkg/tls/error.go similarity index 100% rename from pkg/tlsutil/error.go rename to pkg/tls/error.go diff --git a/pkg/tlsutil/primitives.go b/pkg/tls/primitives.go similarity index 99% rename from pkg/tlsutil/primitives.go rename to pkg/tls/primitives.go index a8673479bdc..0f9d935e937 100644 --- a/pkg/tlsutil/primitives.go +++ b/pkg/tls/primitives.go @@ -87,7 +87,7 @@ func newSelfSignedCACertificate(key *rsa.PrivateKey) (*x509.Certificate, error) NotAfter: now.Add(duration365d).UTC(), KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign, BasicConstraintsValid: true, - IsCA: true, + IsCA: true, } certDERBytes, err := x509.CreateCertificate(rand.Reader, &tmpl, &tmpl, key.Public(), key) if err != nil { diff --git a/pkg/tlsutil/tls.go b/pkg/tls/tls.go similarity index 100% rename from pkg/tlsutil/tls.go rename to pkg/tls/tls.go diff --git a/pkg/util/k8sutil/k8sutil.go b/pkg/util/k8sutil/k8sutil.go deleted file mode 100644 index d2d23faa458..00000000000 --- a/pkg/util/k8sutil/k8sutil.go +++ /dev/null @@ -1,208 +0,0 @@ -// Copyright 2018 The Operator-SDK Authors -// -// 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 k8sutil - -import ( - "encoding/json" - "fmt" - "os" - - v1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/meta" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/runtime/serializer" - intstr "k8s.io/apimachinery/pkg/util/intstr" - cgoscheme "k8s.io/client-go/kubernetes/scheme" -) - -var ( - // scheme tracks the type registry for the sdk - // This scheme is used to decode json data into the correct Go type based on the object's GVK - // All types that the operator watches must be added to this scheme - scheme = runtime.NewScheme() - codecs = serializer.NewCodecFactory(scheme) - decoderFunc = decoder -) - -func init() { - // Add the standard kubernetes [GVK:Types] type registry - // e.g (v1,Pods):&v1.Pod{} - metav1.AddToGroupVersion(scheme, schema.GroupVersion{Version: "v1"}) - cgoscheme.AddToScheme(scheme) -} - -// UtilDecoderFunc retrieve the correct decoder from a GroupVersion -// and the schemes codec factory. -type UtilDecoderFunc func(schema.GroupVersion, serializer.CodecFactory) runtime.Decoder - -// SetDecoderFunc sets a non default decoder function -// This is used as a work around to add support for unstructured objects -func SetDecoderFunc(u UtilDecoderFunc) { - decoderFunc = u -} - -func decoder(gv schema.GroupVersion, codecs serializer.CodecFactory) runtime.Decoder { - codec := codecs.UniversalDecoder(gv) - return codec -} - -type addToSchemeFunc func(*runtime.Scheme) error - -// AddToSDKScheme allows CRDs to register their types with the sdk scheme -func AddToSDKScheme(addToScheme addToSchemeFunc) { - addToScheme(scheme) -} - -// RuntimeObjectFromUnstructured converts an unstructured to a runtime object -func RuntimeObjectFromUnstructured(u *unstructured.Unstructured) (runtime.Object, error) { - gvk := u.GroupVersionKind() - decoder := decoderFunc(gvk.GroupVersion(), codecs) - - b, err := u.MarshalJSON() - if err != nil { - return nil, fmt.Errorf("error running MarshalJSON on unstructured object: %v", err) - } - ro, _, err := decoder.Decode(b, &gvk, nil) - if err != nil { - return nil, fmt.Errorf("failed to decode json data with gvk(%v): %v", gvk.String(), err) - } - return ro, nil -} - -// UnstructuredFromRuntimeObject converts a runtime object to an unstructured -func UnstructuredFromRuntimeObject(ro runtime.Object) (*unstructured.Unstructured, error) { - b, err := json.Marshal(ro) - if err != nil { - return nil, fmt.Errorf("error running MarshalJSON on runtime object: %v", err) - } - var u unstructured.Unstructured - if err := json.Unmarshal(b, &u.Object); err != nil { - return nil, fmt.Errorf("failed to unmarshal json into unstructured object: %v", err) - } - return &u, nil -} - -// UnstructuredIntoRuntimeObject unmarshalls an unstructured into a given runtime object -// TODO: https://github.com/operator-framework/operator-sdk/issues/127 -func UnstructuredIntoRuntimeObject(u *unstructured.Unstructured, into runtime.Object) error { - gvk := u.GroupVersionKind() - decoder := decoderFunc(gvk.GroupVersion(), codecs) - - b, err := u.MarshalJSON() - if err != nil { - return err - } - _, _, err = decoder.Decode(b, &gvk, into) - if err != nil { - return fmt.Errorf("failed to decode json data with gvk(%v): %v", gvk.String(), err) - } - return nil -} - -// RuntimeObjectIntoRuntimeObject unmarshalls an runtime.Object into a given runtime object -func RuntimeObjectIntoRuntimeObject(from runtime.Object, into runtime.Object) error { - b, err := json.Marshal(from) - if err != nil { - return err - } - gvk := from.GetObjectKind().GroupVersionKind() - decoder := decoderFunc(gvk.GroupVersion(), codecs) - _, _, err = decoder.Decode(b, &gvk, into) - if err != nil { - return fmt.Errorf("failed to decode json data with gvk(%v): %v", gvk.String(), err) - } - return nil -} - -// GetNameAndNamespace extracts the name and namespace from the given runtime.Object -// and returns a error if any of those is missing. -func GetNameAndNamespace(object runtime.Object) (string, string, error) { - accessor := meta.NewAccessor() - name, err := accessor.Name(object) - if err != nil { - return "", "", fmt.Errorf("failed to get name for object: %v", err) - } - namespace, err := accessor.Namespace(object) - if err != nil { - return "", "", fmt.Errorf("failed to get namespace for object: %v", err) - } - return name, namespace, nil -} - -func ObjectInfo(kind, name, namespace string) string { - return kind + ": " + namespace + "/" + name -} - -// GetWatchNamespace returns the namespace the operator should be watching for changes -func GetWatchNamespace() (string, error) { - ns, found := os.LookupEnv(WatchNamespaceEnvVar) - if !found { - return "", fmt.Errorf("%s must be set", WatchNamespaceEnvVar) - } - return ns, nil -} - -// GetOperatorName return the operator name -func GetOperatorName() (string, error) { - operatorName, found := os.LookupEnv(OperatorNameEnvVar) - if !found { - return "", fmt.Errorf("%s must be set", OperatorNameEnvVar) - } - if len(operatorName) == 0 { - return "", fmt.Errorf("%s must not be empty", OperatorNameEnvVar) - } - return operatorName, nil -} - -// InitOperatorService return the static service which expose operator metrics -func InitOperatorService() (*v1.Service, error) { - operatorName, err := GetOperatorName() - if err != nil { - return nil, err - } - namespace, err := GetWatchNamespace() - if err != nil { - return nil, err - } - service := &v1.Service{ - ObjectMeta: metav1.ObjectMeta{ - Name: operatorName, - Namespace: namespace, - Labels: map[string]string{"name": operatorName}, - }, - TypeMeta: metav1.TypeMeta{ - Kind: "Service", - APIVersion: "v1", - }, - Spec: v1.ServiceSpec{ - Ports: []v1.ServicePort{ - { - Port: PrometheusMetricsPort, - Protocol: v1.ProtocolTCP, - TargetPort: intstr.IntOrString{ - Type: intstr.String, - StrVal: PrometheusMetricsPortName, - }, - Name: PrometheusMetricsPortName, - }, - }, - Selector: map[string]string{"name": operatorName}, - }, - } - return service, nil -} diff --git a/test/ansible-operator/cmd/ansible-operator/main.go b/test/ansible-operator/cmd/ansible-operator/main.go index 0aeffc21a07..38d45eab24e 100644 --- a/test/ansible-operator/cmd/ansible-operator/main.go +++ b/test/ansible-operator/cmd/ansible-operator/main.go @@ -22,7 +22,7 @@ import ( "github.com/operator-framework/operator-sdk/pkg/ansible/operator" proxy "github.com/operator-framework/operator-sdk/pkg/ansible/proxy" - "github.com/operator-framework/operator-sdk/pkg/util/k8sutil" + "github.com/operator-framework/operator-sdk/pkg/k8sutil" sdkVersion "github.com/operator-framework/operator-sdk/version" "sigs.k8s.io/controller-runtime/pkg/client/config" "sigs.k8s.io/controller-runtime/pkg/manager" diff --git a/test/e2e/tls_util_test.go b/test/e2e/tls_util_test.go index f87a60f3dff..14b39e46fb4 100644 --- a/test/e2e/tls_util_test.go +++ b/test/e2e/tls_util_test.go @@ -19,7 +19,7 @@ import ( "reflect" "testing" - "github.com/operator-framework/operator-sdk/pkg/tlsutil" + tlsutil "github.com/operator-framework/operator-sdk/pkg/tls" framework "github.com/operator-framework/operator-sdk/test/e2e/framework" "k8s.io/api/core/v1" From 8d907640234ab1accda6e904e7c96a9a1191b6bb Mon Sep 17 00:00:00 2001 From: Eric Stroczynski Date: Mon, 22 Oct 2018 12:33:18 -0700 Subject: [PATCH 7/8] pkg/scaffold/role.go: moved UpdateRoleForResource here commands/.../add/*,new.go: update to 'internal/util' imports --- commands/operator-sdk/cmd/add/api.go | 3 +- commands/operator-sdk/cmd/add/crd.go | 2 +- commands/operator-sdk/cmd/build.go | 2 +- commands/operator-sdk/cmd/new.go | 3 +- internal/util/projutil/project_util.go | 114 ------------------------- pkg/scaffold/role.go | 114 +++++++++++++++++++++++++ 6 files changed, 118 insertions(+), 120 deletions(-) diff --git a/commands/operator-sdk/cmd/add/api.go b/commands/operator-sdk/cmd/add/api.go index 67d63f76cb0..7a5dc6fe83f 100644 --- a/commands/operator-sdk/cmd/add/api.go +++ b/commands/operator-sdk/cmd/add/api.go @@ -18,7 +18,6 @@ import ( "log" "github.com/operator-framework/operator-sdk/commands/operator-sdk/cmd/generate" - "github.com/operator-framework/operator-sdk/internal/util/fileutil" "github.com/operator-framework/operator-sdk/internal/util/projutil" "github.com/operator-framework/operator-sdk/pkg/scaffold" "github.com/operator-framework/operator-sdk/pkg/scaffold/input" @@ -92,7 +91,7 @@ func apiRun(cmd *cobra.Command, args []string) { } // update deploy/role.yaml for the given resource r. - if err := cmdutil.UpdateRoleForResource(r, absProjectPath); err != nil { + if err := scaffold.UpdateRoleForResource(r, absProjectPath); err != nil { log.Fatalf("failed to update the RBAC manifest for the resource (%v, %v): %v", r.APIVersion, r.Kind, err) } diff --git a/commands/operator-sdk/cmd/add/crd.go b/commands/operator-sdk/cmd/add/crd.go index 0c587eae991..e6980bae40d 100644 --- a/commands/operator-sdk/cmd/add/crd.go +++ b/commands/operator-sdk/cmd/add/crd.go @@ -78,7 +78,7 @@ func crdFunc(cmd *cobra.Command, args []string) { } // update deploy/role.yaml for the given resource r. - if err := cmdutil.UpdateRoleForResource(resource, cfg.AbsProjectPath); err != nil { + if err := scaffold.UpdateRoleForResource(resource, cfg.AbsProjectPath); err != nil { log.Fatalf("failed to update the RBAC manifest for the resource (%v, %v): %v", resource.APIVersion, resource.Kind, err) } } diff --git a/commands/operator-sdk/cmd/build.go b/commands/operator-sdk/cmd/build.go index 7db71a17ea4..059fbe4c970 100644 --- a/commands/operator-sdk/cmd/build.go +++ b/commands/operator-sdk/cmd/build.go @@ -146,7 +146,7 @@ func buildFunc(cmd *cobra.Command, args []string) { // Don't need to buld go code if Ansible Operator if mainExists() { - managerDir := filepath.Join(cmdutil.CheckAndGetCurrPkg(), scaffold.ManagerDir) + managerDir := filepath.Join(projutil.CheckAndGetCurrPkg(), scaffold.ManagerDir) outputBinName := filepath.Join(wd, scaffold.BuildBinDir, filepath.Base(wd)) buildCmd := exec.Command("go", "build", "-o", outputBinName, managerDir) buildCmd.Env = goBuildEnv diff --git a/commands/operator-sdk/cmd/new.go b/commands/operator-sdk/cmd/new.go index 2665ed86f19..5b4d4c5e942 100644 --- a/commands/operator-sdk/cmd/new.go +++ b/commands/operator-sdk/cmd/new.go @@ -23,7 +23,6 @@ import ( "path/filepath" "strings" - "github.com/operator-framework/operator-sdk/internal/util/fileutil" "github.com/operator-framework/operator-sdk/internal/util/projutil" "github.com/operator-framework/operator-sdk/pkg/scaffold" "github.com/operator-framework/operator-sdk/pkg/scaffold/ansible" @@ -217,7 +216,7 @@ func doAnsibleScaffold() { } // update deploy/role.yaml for the given resource r. - if err := cmdutil.UpdateRoleForResource(resource, cfg.AbsProjectPath); err != nil { + if err := scaffold.UpdateRoleForResource(resource, cfg.AbsProjectPath); err != nil { log.Fatalf("failed to update the RBAC manifest for the resource (%v, %v): %v", resource.APIVersion, resource.Kind, err) } } diff --git a/internal/util/projutil/project_util.go b/internal/util/projutil/project_util.go index dcb03bfd0b7..502cfa9e5de 100644 --- a/internal/util/projutil/project_util.go +++ b/internal/util/projutil/project_util.go @@ -15,20 +15,10 @@ package projutil import ( - "encoding/json" - "errors" - "fmt" - "io/ioutil" "log" "os" "path/filepath" "strings" - - "github.com/operator-framework/operator-sdk/pkg/scaffold" - - yaml "gopkg.in/yaml.v2" - rbacv1 "k8s.io/api/rbac/v1" - cgoscheme "k8s.io/client-go/kubernetes/scheme" ) const ( @@ -99,107 +89,3 @@ func GetOperatorType() OperatorType { } return OperatorTypeGo } - -func UpdateRoleForResource(r *scaffold.Resource, absProjectPath string) error { - // append rbac rule to deploy/role.yaml - roleFilePath := filepath.Join(absProjectPath, "deploy", "role.yaml") - roleYAML, err := ioutil.ReadFile(roleFilePath) - if err != nil { - return fmt.Errorf("failed to read role manifest %v: %v", roleFilePath, err) - } - obj, _, err := cgoscheme.Codecs.UniversalDeserializer().Decode(roleYAML, nil, nil) - if err != nil { - return fmt.Errorf("failed to decode role manifest %v: %v", roleFilePath, err) - } - switch role := obj.(type) { - // TODO: use rbac/v1. - case *rbacv1.Role: - pr := &rbacv1.PolicyRule{} - apiGroupFound := false - for i := range role.Rules { - if role.Rules[i].APIGroups[0] == r.FullGroup { - apiGroupFound = true - pr = &role.Rules[i] - break - } - } - // check if the resource already exists - for _, resource := range pr.Resources { - if resource == r.Resource { - log.Printf("deploy/role.yaml RBAC rules already up to date for the resource (%v, %v)", r.APIVersion, r.Kind) - return nil - } - } - - pr.Resources = append(pr.Resources, r.Resource) - // create a new apiGroup if not found. - if !apiGroupFound { - pr.APIGroups = []string{r.FullGroup} - // Using "*" to allow access to the resource and all its subresources e.g "memcacheds" and "memcacheds/finalizers" - // https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#ownerreferencespermissionenforcement - pr.Resources = []string{"*"} - pr.Verbs = []string{"*"} - role.Rules = append(role.Rules, *pr) - } - // update role.yaml - d, err := json.Marshal(&role) - if err != nil { - return fmt.Errorf("failed to marshal role(%+v): %v", role, err) - } - m := &map[string]interface{}{} - err = yaml.Unmarshal(d, m) - data, err := yaml.Marshal(m) - if err != nil { - return fmt.Errorf("failed to marshal role(%+v): %v", role, err) - } - if err := ioutil.WriteFile(roleFilePath, data, DefaultFileMode); err != nil { - return fmt.Errorf("failed to update %v: %v", roleFilePath, err) - } - case *rbacv1.ClusterRole: - pr := &rbacv1.PolicyRule{} - apiGroupFound := false - for i := range role.Rules { - if role.Rules[i].APIGroups[0] == r.FullGroup { - apiGroupFound = true - pr = &role.Rules[i] - break - } - } - // check if the resource already exists - for _, resource := range pr.Resources { - if resource == r.Resource { - log.Printf("deploy/role.yaml RBAC rules already up to date for the resource (%v, %v)", r.APIVersion, r.Kind) - return nil - } - } - - pr.Resources = append(pr.Resources, r.Resource) - // create a new apiGroup if not found. - if !apiGroupFound { - pr.APIGroups = []string{r.FullGroup} - // Using "*" to allow access to the resource and all its subresources e.g "memcacheds" and "memcacheds/finalizers" - // https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#ownerreferencespermissionenforcement - pr.Resources = []string{"*"} - pr.Verbs = []string{"*"} - role.Rules = append(role.Rules, *pr) - } - // update role.yaml - d, err := json.Marshal(&role) - if err != nil { - return fmt.Errorf("failed to marshal role(%+v): %v", role, err) - } - m := &map[string]interface{}{} - err = yaml.Unmarshal(d, m) - data, err := yaml.Marshal(m) - if err != nil { - return fmt.Errorf("failed to marshal role(%+v): %v", role, err) - } - if err := ioutil.WriteFile(roleFilePath, data, DefaultFileMode); err != nil { - return fmt.Errorf("failed to update %v: %v", roleFilePath, err) - } - default: - return errors.New("failed to parse role.yaml as a role") - } - // not reachable - return nil -} diff --git a/pkg/scaffold/role.go b/pkg/scaffold/role.go index eb6299850ee..7f76f566ad0 100644 --- a/pkg/scaffold/role.go +++ b/pkg/scaffold/role.go @@ -15,9 +15,19 @@ package scaffold import ( + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "log" "path/filepath" + "github.com/operator-framework/operator-sdk/internal/util/fileutil" "github.com/operator-framework/operator-sdk/pkg/scaffold/input" + + yaml "gopkg.in/yaml.v2" + rbacv1 "k8s.io/api/rbac/v1" + cgoscheme "k8s.io/client-go/kubernetes/scheme" ) const RoleYamlFile = "role.yaml" @@ -34,6 +44,110 @@ func (s *Role) GetInput() (input.Input, error) { return s.Input, nil } +func UpdateRoleForResource(r *Resource, absProjectPath string) error { + // append rbac rule to deploy/role.yaml + roleFilePath := filepath.Join(absProjectPath, DeployDir, RoleYamlFile) + roleYAML, err := ioutil.ReadFile(roleFilePath) + if err != nil { + return fmt.Errorf("failed to read role manifest %v: %v", roleFilePath, err) + } + obj, _, err := cgoscheme.Codecs.UniversalDeserializer().Decode(roleYAML, nil, nil) + if err != nil { + return fmt.Errorf("failed to decode role manifest %v: %v", roleFilePath, err) + } + switch role := obj.(type) { + // TODO: use rbac/v1. + case *rbacv1.Role: + pr := &rbacv1.PolicyRule{} + apiGroupFound := false + for i := range role.Rules { + if role.Rules[i].APIGroups[0] == r.FullGroup { + apiGroupFound = true + pr = &role.Rules[i] + break + } + } + // check if the resource already exists + for _, resource := range pr.Resources { + if resource == r.Resource { + log.Printf("deploy/role.yaml RBAC rules already up to date for the resource (%v, %v)", r.APIVersion, r.Kind) + return nil + } + } + + pr.Resources = append(pr.Resources, r.Resource) + // create a new apiGroup if not found. + if !apiGroupFound { + pr.APIGroups = []string{r.FullGroup} + // Using "*" to allow access to the resource and all its subresources e.g "memcacheds" and "memcacheds/finalizers" + // https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#ownerreferencespermissionenforcement + pr.Resources = []string{"*"} + pr.Verbs = []string{"*"} + role.Rules = append(role.Rules, *pr) + } + // update role.yaml + d, err := json.Marshal(&role) + if err != nil { + return fmt.Errorf("failed to marshal role(%+v): %v", role, err) + } + m := &map[string]interface{}{} + err = yaml.Unmarshal(d, m) + data, err := yaml.Marshal(m) + if err != nil { + return fmt.Errorf("failed to marshal role(%+v): %v", role, err) + } + if err := ioutil.WriteFile(roleFilePath, data, fileutil.DefaultFileMode); err != nil { + return fmt.Errorf("failed to update %v: %v", roleFilePath, err) + } + case *rbacv1.ClusterRole: + pr := &rbacv1.PolicyRule{} + apiGroupFound := false + for i := range role.Rules { + if role.Rules[i].APIGroups[0] == r.FullGroup { + apiGroupFound = true + pr = &role.Rules[i] + break + } + } + // check if the resource already exists + for _, resource := range pr.Resources { + if resource == r.Resource { + log.Printf("deploy/role.yaml RBAC rules already up to date for the resource (%v, %v)", r.APIVersion, r.Kind) + return nil + } + } + + pr.Resources = append(pr.Resources, r.Resource) + // create a new apiGroup if not found. + if !apiGroupFound { + pr.APIGroups = []string{r.FullGroup} + // Using "*" to allow access to the resource and all its subresources e.g "memcacheds" and "memcacheds/finalizers" + // https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#ownerreferencespermissionenforcement + pr.Resources = []string{"*"} + pr.Verbs = []string{"*"} + role.Rules = append(role.Rules, *pr) + } + // update role.yaml + d, err := json.Marshal(&role) + if err != nil { + return fmt.Errorf("failed to marshal role(%+v): %v", role, err) + } + m := &map[string]interface{}{} + err = yaml.Unmarshal(d, m) + data, err := yaml.Marshal(m) + if err != nil { + return fmt.Errorf("failed to marshal role(%+v): %v", role, err) + } + if err := ioutil.WriteFile(roleFilePath, data, fileutil.DefaultFileMode); err != nil { + return fmt.Errorf("failed to update %v: %v", roleFilePath, err) + } + default: + return errors.New("failed to parse role.yaml as a role") + } + // not reachable + return nil +} + const roleTemplate = `kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: From 62eb94bdd5bd62c1c577b37b5f50110ce6b6ddd5 Mon Sep 17 00:00:00 2001 From: Eric Stroczynski Date: Wed, 24 Oct 2018 13:30:02 -0700 Subject: [PATCH 8/8] test/e2e/memcached_test.go: early branch sub to fix 'dep ensure' solve issue --- test/e2e/memcached_test.go | 69 +++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 27 deletions(-) diff --git a/test/e2e/memcached_test.go b/test/e2e/memcached_test.go index 5389c4e3d4c..b6b16cc60f1 100644 --- a/test/e2e/memcached_test.go +++ b/test/e2e/memcached_test.go @@ -68,11 +68,51 @@ func TestMemcached(t *testing.T) { "new", "memcached-operator").CombinedOutput() if err != nil { - t.Fatalf("error: %v\nCommand Output: %s\n", err, string(cmdOut)) + // HACK: dep cannot resolve non-master branches as the base branch for PR's, + // so running `dep ensure` will fail when first running + // `operator-sdk new ...`. For now we can ignore the first solve failure. + // A permanent solution can be implemented once the following is merged: + // https://github.com/golang/dep/pull/1658 + solveFailRe := regexp.MustCompile(`(?m)^[ \t]*Solving failure:.+github\.com/operator-framework/operator-sdk.+:$`) + if !solveFailRe.Match(cmdOut) { + t.Fatalf("error: %v\nCommand Output: %s\n", err, string(cmdOut)) + } } ctx.AddFinalizerFn(func() error { return os.RemoveAll(absProjectPath) }) os.Chdir("memcached-operator") + prSlug, ok := os.LookupEnv("TRAVIS_PULL_REQUEST_SLUG") + if ok && prSlug != "" { + prSha, ok := os.LookupEnv("TRAVIS_PULL_REQUEST_SHA") + if ok && prSha != "" { + gopkg, err := ioutil.ReadFile("Gopkg.toml") + if err != nil { + t.Fatal(err) + } + // Match against the '#osdk_branch_annotation' used for version substitution + // and comment out the current branch. + branchRe := regexp.MustCompile("([ ]+)(.+#osdk_branch_annotation)") + gopkg = branchRe.ReplaceAll(gopkg, []byte("$1# $2")) + // Plug in the fork to test against so `dep ensure` can resolve dependencies + // correctly. + gopkgString := string(gopkg) + gopkgLoc := strings.LastIndex(gopkgString, "\n name = \"github.com/operator-framework/operator-sdk\"\n") + gopkgString = gopkgString[:gopkgLoc] + "\n source = \"https://github.com/" + prSlug + "\"\n revision = \"" + prSha + "\"\n" + gopkgString[gopkgLoc+1:] + err = ioutil.WriteFile("Gopkg.toml", []byte(gopkgString), filemode) + if err != nil { + t.Fatalf("failed to write updated Gopkg.toml: %v", err) + } + + t.Logf("Gopkg.toml: %v", gopkgString) + } else { + t.Fatal("could not find sha of PR") + } + } + cmdOut, err = exec.Command("dep", "ensure").CombinedOutput() + if err != nil { + t.Fatalf("error: %v\nCommand Output: %s\n", err, string(cmdOut)) + } + cmdOut, err = exec.Command("operator-sdk", "add", "api", @@ -143,33 +183,8 @@ func TestMemcached(t *testing.T) { if err != nil { t.Fatalf("could not rename test/e2e/memcached_test.go.tmpl: %v\nCommand Output:\n%v", err, string(cmdOut)) } + t.Log("Pulling new dependencies with dep ensure") - prSlug, ok := os.LookupEnv("TRAVIS_PULL_REQUEST_SLUG") - if ok && prSlug != "" { - prSha, ok := os.LookupEnv("TRAVIS_PULL_REQUEST_SHA") - if ok && prSha != "" { - gopkg, err := ioutil.ReadFile("Gopkg.toml") - if err != nil { - t.Fatal(err) - } - // Match against the '#osdk_branch_annotation' used for version substitution - // and comment out the current branch. - branchRe := regexp.MustCompile("([ ]+)(.+#osdk_branch_annotation)") - gopkg = branchRe.ReplaceAll(gopkg, []byte("$1# $2")) - // Plug in the fork to test against so `dep ensure` can resolve dependencies - // correctly. - gopkgString := string(gopkg) - gopkgLoc := strings.LastIndex(gopkgString, "\n name = \"github.com/operator-framework/operator-sdk\"\n") - gopkgString = gopkgString[:gopkgLoc] + "\n source = \"https://github.com/" + prSlug + "\"\n revision = \"" + prSha + "\"\n" + gopkgString[gopkgLoc+1:] - err = ioutil.WriteFile("Gopkg.toml", []byte(gopkgString), filemode) - if err != nil { - t.Fatalf("failed to write updated Gopkg.toml: %v", err) - } - t.Logf("Gopkg.toml: %v", gopkgString) - } else { - t.Fatal("could not find sha of PR") - } - } cmdOut, err = exec.Command("dep", "ensure").CombinedOutput() if err != nil { t.Fatalf("dep ensure failed: %v\nCommand Output:\n%v", err, string(cmdOut))