Skip to content

Commit

Permalink
feat: Add support for qa for external transformers using grpc (#518)
Browse files Browse the repository at this point in the history
Signed-off-by: Ashok Pon Kumar <[email protected]>
  • Loading branch information
ashokponkumar authored Jun 23, 2021
1 parent 8b23149 commit 4bd50c6
Show file tree
Hide file tree
Showing 17 changed files with 674 additions and 34 deletions.
2 changes: 1 addition & 1 deletion assets/constants.go

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion environment/container/container.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ var (
// Engine defines interface to manage containers
type ContainerEngine interface {
// RunCmdInContainer runs a container
RunCmdInContainer(image string, cmd environmenttypes.Command, workingdir string) (stdout, stderr string, exitcode int, err error)
RunCmdInContainer(image string, cmd environmenttypes.Command, workingdir string, env []string) (stdout, stderr string, exitcode int, err error)
// InspectImage gets Inspect output for a container
InspectImage(image string) (dockertypes.ImageInspect, error)
// TODO: Change paths from map to array
Expand Down
3 changes: 2 additions & 1 deletion environment/container/dockerengine.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,12 +80,13 @@ func (e *dockerEngine) pullImage(image string) bool {
}

// RunCmdInContainer executes a container
func (e *dockerEngine) RunCmdInContainer(containerID string, cmd environmenttypes.Command, workingdir string) (stdout, stderr string, exitCode int, err error) {
func (e *dockerEngine) RunCmdInContainer(containerID string, cmd environmenttypes.Command, workingdir string, env []string) (stdout, stderr string, exitCode int, err error) {
execConfig := types.ExecConfig{
AttachStdout: true,
AttachStderr: true,
Cmd: cmd,
WorkingDir: workingdir,
Env: env,
}
cresp, err := e.cli.ContainerExecCreate(e.ctx, containerID, execConfig)
if err != nil {
Expand Down
10 changes: 6 additions & 4 deletions environment/environment.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package environment
import (
"fmt"
"io/ioutil"
"net"
"os"
"path/filepath"
"reflect"
Expand All @@ -34,6 +35,7 @@ import (

const (
workspaceDir = "workspace"
GRPCEnvName = "GRPC_RECEIVER"
)

type Environment struct {
Expand All @@ -59,7 +61,7 @@ type EnvironmentInstance interface {
GetContext() string
}

func NewEnvironment(name string, source string, context string, relTemplatesDir string, container environmenttypes.Container) (env Environment, err error) {
func NewEnvironment(name string, source string, context string, relTemplatesDir string, grpcQAReceiver net.Addr, container environmenttypes.Container) (env Environment, err error) {
tempPath, err := ioutil.TempDir(common.TempPath, "environment-"+name+"-*")
if err != nil {
logrus.Errorf("Unable to create temp dir : %s", err)
Expand All @@ -84,7 +86,7 @@ func NewEnvironment(name string, source string, context string, relTemplatesDir
if len(envvarpair) > 0 && envVariableName == container.Image && len(envvarpair) > 1 {
_, err := strconv.Atoi(envvarpair[1])
if err != nil {
env.Env, err = NewLocal(name, source, envvarpair[1], tempPath)
env.Env, err = NewLocal(name, source, envvarpair[1], tempPath, grpcQAReceiver)
if err != nil {
logrus.Errorf("Unable to create local environment : %s", err)
}
Expand All @@ -99,14 +101,14 @@ func NewEnvironment(name string, source string, context string, relTemplatesDir
}
}
if env.Env == nil {
env.Env, err = NewPeerContainer(name, source, context, tempPath, container)
env.Env, err = NewPeerContainer(name, source, context, tempPath, grpcQAReceiver, container)
if err != nil {
logrus.Errorf("Unable to create peer container environment : %s", err)
}
return env, err
}
}
env.Env, err = NewLocal(name, source, context, tempPath)
env.Env, err = NewLocal(name, source, context, tempPath, grpcQAReceiver)
if err != nil {
logrus.Errorf("Unable to create peer container environment : %s", err)
}
Expand Down
16 changes: 12 additions & 4 deletions environment/local.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"errors"
"fmt"
"io/ioutil"
"net"
"os"
"os/exec"
"path/filepath"
Expand All @@ -39,13 +40,16 @@ type Local struct {

WorkspaceSource string
WorkspaceContext string

GRPCQAReceiver net.Addr
}

func NewLocal(name, source, context, tempPath string) (ei EnvironmentInstance, err error) {
func NewLocal(name, source, context, tempPath string, grpcQAReceiver net.Addr) (ei EnvironmentInstance, err error) {
local := &Local{
Name: name,
Source: source,
Context: context,
Name: name,
Source: source,
Context: context,
GRPCQAReceiver: grpcQAReceiver,
}
local.TempPath = tempPath
local.WorkspaceContext, err = ioutil.TempDir(local.TempPath, types.AppNameShort)
Expand Down Expand Up @@ -87,6 +91,10 @@ func (e *Local) Exec(cmd environmenttypes.Command) (string, string, int, error)
execcmd.Dir = e.WorkspaceContext
execcmd.Stdout = &outb
execcmd.Stderr = &errb
execcmd.Env = os.Environ()
if e.GRPCQAReceiver != nil {
execcmd.Env = append(execcmd.Env, GRPCEnvName+"="+e.GRPCQAReceiver.String())
}
err := execcmd.Run()
if err != nil {
var ee *exec.ExitError
Expand Down
23 changes: 17 additions & 6 deletions environment/peercontainer.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package environment
import (
"fmt"
"io/ioutil"
"net"
"path/filepath"
"strings"

Expand All @@ -27,6 +28,7 @@ import (
"github.com/konveyor/move2kube/types"
environmenttypes "github.com/konveyor/move2kube/types/environment"
"github.com/sirupsen/logrus"
"github.com/spf13/cast"
)

const (
Expand All @@ -41,17 +43,20 @@ type PeerContainer struct {
WorkspaceSource string
WorkspaceContext string

GRPCQAReceiver net.Addr

ImageName string
ImageWithData string
CID string // A started instance of ImageWithData
}

func NewPeerContainer(name, source, context, tempPath string, c environmenttypes.Container) (ei EnvironmentInstance, err error) {
func NewPeerContainer(name, source, context, tempPath string, grpcQAReceiver net.Addr, c environmenttypes.Container) (ei EnvironmentInstance, err error) {
peerContainer := &PeerContainer{
Name: name,
Source: source,
TempPath: tempPath,
ImageName: c.Image,
Name: name,
Source: source,
TempPath: tempPath,
ImageName: c.Image,
GRPCQAReceiver: grpcQAReceiver,
}
peerContainer.TempPath = tempPath
if c.WorkingDir != "" {
Expand Down Expand Up @@ -109,7 +114,13 @@ func (e *PeerContainer) Reset() error {

func (e *PeerContainer) Exec(cmd environmenttypes.Command) (string, string, int, error) {
cengine := container.GetContainerEngine()
return cengine.RunCmdInContainer(e.CID, cmd, e.WorkspaceContext)
envs := []string{}
if e.GRPCQAReceiver != nil {
hostname := getIP()
port := cast.ToString(e.GRPCQAReceiver.(*net.TCPAddr).Port)
envs = append(envs, GRPCEnvName+"="+hostname+":"+port)
}
return cengine.RunCmdInContainer(e.CID, cmd, e.WorkspaceContext, envs)
}

func (e *PeerContainer) Destroy() error {
Expand Down
33 changes: 33 additions & 0 deletions environment/utils.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/*
Copyright IBM Corporation 2021
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 environment

import (
"net"

"github.com/sirupsen/logrus"
)

func getIP() string {
conn, err := net.Dial("udp", "8.8.8.8:80")
if err != nil {
logrus.Errorf("Unable to get IP address : %s", err)
}
defer conn.Close()
localAddr := conn.LocalAddr().(*net.UDPAddr)
return localAddr.IP.String()
}
17 changes: 5 additions & 12 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,10 @@ go 1.16

require (
code.cloudfoundry.org/bytefmt v0.0.0-20210608160410-67692ebc98de // indirect
code.cloudfoundry.org/cli v7.1.0+incompatible // indirect
code.cloudfoundry.org/cli v7.1.0+incompatible
github.com/AlecAivazis/survey/v2 v2.2.12
github.com/Masterminds/semver/v3 v3.1.1
github.com/PuerkitoBio/purell v1.1.1 // indirect
github.com/cloudfoundry/bosh-cli v6.4.1+incompatible // indirect
github.com/cloudfoundry/bosh-cli v6.4.1+incompatible
github.com/cloudfoundry/bosh-utils v0.0.263 // indirect
github.com/containerd/containerd v1.5.1 // indirect
github.com/cppforlife/go-patch v0.2.0 // indirect
Expand All @@ -19,14 +18,11 @@ require (
github.com/go-git/go-git/v5 v5.4.2
github.com/google/go-cmp v0.5.6
github.com/gorilla/mux v1.8.0
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/mattn/go-shellwords v1.0.12 // indirect
github.com/mikefarah/yq/v4 v4.9.6
github.com/mitchellh/mapstructure v1.4.1
github.com/moby/buildkit v0.8.3 // indirect
github.com/moby/buildkit v0.8.3
github.com/moby/sys/mount v0.2.0 // indirect
github.com/onsi/ginkgo v1.16.4 // indirect
github.com/onsi/gomega v1.13.0 // indirect
github.com/openshift/api v0.0.0-20210621070332-ea13be50ba2d
github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2
github.com/pkg/errors v0.9.1
Expand All @@ -36,20 +32,18 @@ require (
github.com/spf13/viper v1.8.0
github.com/tektoncd/pipeline v0.25.0
github.com/tektoncd/triggers v0.14.2
github.com/theupdateframework/notary v0.7.0 // indirect
github.com/whilp/git-urls v1.0.0
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e
golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78 // indirect
google.golang.org/grpc v1.38.0 // indirect
google.golang.org/grpc v1.38.0
google.golang.org/protobuf v1.26.0
gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
k8s.io/api v0.21.2
k8s.io/apimachinery v0.21.2
k8s.io/client-go v11.0.1-0.20190805182717-6502b5e7b1b5+incompatible
k8s.io/kubernetes v1.21.2
knative.dev/serving v0.23.1
vbom.ml/util/sortorder v1.0.2 // indirect
)

replace (
Expand Down Expand Up @@ -82,5 +76,4 @@ replace (
k8s.io/metrics => k8s.io/metrics v0.21.2
k8s.io/mount-utils => k8s.io/mount-utils v0.21.2
k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.19.4
vbom.ml/util/sortorder => github.com/fvbommel/sortorder v1.0.2
)
2 changes: 1 addition & 1 deletion internal/transformer/classes/analysers/cnbcontainerizer.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ func (t *CNBContainerizer) Init(tc transformertypes.Transformer, env environment
return err
}

t.CNBEnv, err = environment.NewEnvironment(tc.Name, t.Env.GetWorkspaceSource(), "", "", environmenttypes.Container{
t.CNBEnv, err = environment.NewEnvironment(tc.Name, t.Env.GetWorkspaceSource(), "", "", nil, environmenttypes.Container{
Image: t.CNBConfig.BuilderImageName,
WorkingDir: filepath.Join(string(filepath.Separator), "tmp"),
})
Expand Down
13 changes: 12 additions & 1 deletion internal/transformer/classes/external/simpleexecutable.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,13 @@ package external

import (
"encoding/json"
"net"
"path/filepath"
"strings"

"github.com/konveyor/move2kube/environment"
"github.com/konveyor/move2kube/internal/common"
"github.com/konveyor/move2kube/qaengine"
environmenttypes "github.com/konveyor/move2kube/types/environment"
plantypes "github.com/konveyor/move2kube/types/plan"
transformertypes "github.com/konveyor/move2kube/types/transformer"
Expand All @@ -46,6 +48,7 @@ type TransformConfig struct {
}

type ExecutableYamlConfig struct {
EnableQA bool `yaml:"enableQA"`
BaseDirectoryDetectCMD environmenttypes.Command `yaml:"baseDetectCMD"`
DirectoryDetectCMD environmenttypes.Command `yaml:"directoryDetectCMD"`
TransformCMD environmenttypes.Command `yaml:"transformCMD"`
Expand All @@ -60,7 +63,15 @@ func (t *SimpleExecutable) Init(tc transformertypes.Transformer, env environment
logrus.Errorf("unable to load config for Transformer %+v into %T : %s", t.TConfig.Spec.Config, t.ExecConfig, err)
return err
}
t.Env, err = environment.NewEnvironment(env.Name, env.Source, env.Context, tc.Spec.TemplatesDir, t.ExecConfig.Container)
var qaRPCReceiverAddr net.Addr = nil
if t.ExecConfig.EnableQA {
qaRPCReceiverAddr, err = qaengine.StartGRPCReceiverAddress()
if err != nil {
logrus.Errorf("Unable to start QA RPC Receiver engine : %s", err)
logrus.Infof("Starting transformer that requires QA without QA.")
}
}
t.Env, err = environment.NewEnvironment(env.Name, env.Source, env.Context, tc.Spec.TemplatesDir, qaRPCReceiverAddr, t.ExecConfig.Container)
if err != nil {
logrus.Errorf("Unable to create Exec environment : %s", err)
return err
Expand Down
2 changes: 1 addition & 1 deletion internal/transformer/transformer.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ func InitTransformers(transformerToInit map[string]string, sourcePath string, wa
logrus.Errorf("Unable to find Transformer class %s in %+v", tc.Spec.Class, transformerTypes)
} else {
t := reflect.New(c).Interface().(Transformer)
env, err := environment.NewEnvironment(tc.Name, sourcePath, filepath.Dir(tc.Spec.FilePath), tc.Spec.TemplatesDir, environmenttypes.Container{})
env, err := environment.NewEnvironment(tc.Name, sourcePath, filepath.Dir(tc.Spec.FilePath), tc.Spec.TemplatesDir, nil, environmenttypes.Container{})
if err != nil {
logrus.Errorf("Unable to create environment : %s", err)
return err
Expand Down
18 changes: 16 additions & 2 deletions qaengine/engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package qaengine

import (
"fmt"
"net"
"path/filepath"

"github.com/konveyor/move2kube/internal/common"
Expand All @@ -33,8 +34,9 @@ type Engine interface {
}

var (
engines []Engine
writeStores []qatypes.Store
engines []Engine
writeStores []qatypes.Store
grpcReceiver net.Addr
)

// StartEngine starts the QA Engines
Expand All @@ -50,6 +52,18 @@ func StartEngine(qaskip bool, qaport int, qadisablecli bool) {
AddEngine(e)
}

func StartGRPCReceiverAddress() (net.Addr, error) {
if grpcReceiver == nil {
var err error
grpcReceiver, err = StartGRPCReceiver()
if err != nil {
logrus.Errorf("Unable to start GRPC Receiver : %s", err)
return nil, err
}
}
return grpcReceiver, nil
}

// AddEngine appends an engine to the engines slice
func AddEngine(e Engine) {
if err := e.StartEngine(); err != nil {
Expand Down
Loading

0 comments on commit 4bd50c6

Please sign in to comment.