Use interface for kclient (#5065)

* Use interface for kclient

* Fix + add mocks

* Add mockgen script

* remove unused param + add unit test

* fix rebase
This commit is contained in:
Philippe Martin
2021-09-27 09:51:12 +02:00
committed by GitHub
parent 107dff9127
commit 99484663b7
33 changed files with 1898 additions and 309 deletions

View File

@@ -1,7 +1,6 @@
package application
import (
"github.com/openshift/odo/pkg/kclient"
"github.com/pkg/errors"
"k8s.io/klog"
@@ -54,7 +53,7 @@ func List(client *occlient.Client) ([]string, error) {
}
// Exists checks whether the given app exist or not in the list of applications
func Exists(app string, client *occlient.Client, kClient *kclient.Client) (bool, error) {
func Exists(app string, client *occlient.Client) (bool, error) {
appList, err := List(client)

View File

@@ -299,7 +299,7 @@ func ComponentExists(client *occlient.Client, componentType string, componentVer
// ListOperatorServices fetches a list of Operators from the cluster and
// returns only those Operators which are successfully installed on the cluster
func ListOperatorServices(client *kclient.Client) (*olm.ClusterServiceVersionList, error) {
func ListOperatorServices(client kclient.ClientInterface) (*olm.ClusterServiceVersionList, error) {
var csvList olm.ClusterServiceVersionList
// first check for CSV support

View File

@@ -8,10 +8,14 @@ import (
"reflect"
"testing"
"github.com/golang/mock/gomock"
imagev1 "github.com/openshift/api/image/v1"
"github.com/openshift/odo/pkg/kclient"
"github.com/openshift/odo/pkg/occlient"
"github.com/openshift/odo/pkg/preference"
"github.com/openshift/odo/pkg/testingutil"
olm "github.com/operator-framework/api/pkg/operators/v1alpha1"
"github.com/pkg/errors"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
@@ -395,3 +399,106 @@ func TestConvertURL(t *testing.T) {
})
}
}
func TestListOperatorServices(t *testing.T) {
tests := []struct {
name string
isCSVsupported bool
isCSVsupportedErr error
list *olm.ClusterServiceVersionList
listErr error
expectedList *olm.ClusterServiceVersionList
expectedErr bool
}{
{
name: "error getting supported csv",
isCSVsupported: false,
isCSVsupportedErr: errors.New("an error"),
expectedList: &olm.ClusterServiceVersionList{},
expectedErr: true,
},
{
name: "non supported csv",
isCSVsupported: false,
isCSVsupportedErr: nil,
expectedList: &olm.ClusterServiceVersionList{},
expectedErr: false,
},
{
name: "error getting list",
isCSVsupported: true,
isCSVsupportedErr: nil,
list: nil,
listErr: errors.New("an error"),
expectedList: &olm.ClusterServiceVersionList{},
expectedErr: true,
},
{
name: "supported csv, empty list",
isCSVsupported: true,
isCSVsupportedErr: nil,
list: &olm.ClusterServiceVersionList{},
expectedList: &olm.ClusterServiceVersionList{},
expectedErr: false,
},
{
name: "supported csv, return succeeded only",
isCSVsupported: true,
isCSVsupportedErr: nil,
list: &olm.ClusterServiceVersionList{
TypeMeta: metav1.TypeMeta{
Kind: "a kind",
APIVersion: "a version",
},
Items: []olm.ClusterServiceVersion{
{
Status: olm.ClusterServiceVersionStatus{
Phase: "Succeeded",
},
},
{
Status: olm.ClusterServiceVersionStatus{
Phase: "",
},
},
{
Status: olm.ClusterServiceVersionStatus{
Phase: "other phase",
},
},
},
},
expectedList: &olm.ClusterServiceVersionList{
TypeMeta: metav1.TypeMeta{
Kind: "a kind",
APIVersion: "a version",
},
Items: []olm.ClusterServiceVersion{
{
Status: olm.ClusterServiceVersionStatus{
Phase: "Succeeded",
},
},
},
},
expectedErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ctrl := gomock.NewController(t)
kc := kclient.NewMockClientInterface(ctrl)
kc.EXPECT().IsCSVSupported().Return(tt.isCSVsupported, tt.isCSVsupportedErr).AnyTimes()
kc.EXPECT().ListClusterServiceVersions().Return(tt.list, tt.listErr).AnyTimes()
got, gotErr := ListOperatorServices(kc)
if gotErr != nil != tt.expectedErr {
t.Errorf("Got error %v, expected error %v\n", gotErr, tt.expectedErr)
}
if !reflect.DeepEqual(got, tt.expectedList) {
t.Errorf("Got %v, expected %v\n", got, tt.expectedList)
}
})
}
}

View File

@@ -1099,7 +1099,7 @@ func ListIfPathGiven(client *occlient.Client, paths []string) ([]Component, erro
return components, err
}
func ListDevfileComponentsInPath(client *kclient.Client, paths []string) ([]Component, error) {
func ListDevfileComponentsInPath(client kclient.ClientInterface, paths []string) ([]Component, error) {
var components []Component
var err error
for _, path := range paths {
@@ -1136,7 +1136,7 @@ func ListDevfileComponentsInPath(client *kclient.Client, paths []string) ([]Comp
// since the config file maybe belong to a component of a different project
if client != nil {
client.Namespace = data.GetNamespace()
client.SetNamespace(data.GetNamespace())
deployment, err := client.GetOneDeployment(comp.Name, comp.Spec.App)
if err != nil {
comp.Status.State = StateTypeNotPushed

View File

@@ -19,14 +19,14 @@ import (
// DefaultPortForwarder implements the SPDY based port forwarder
type DefaultPortForwarder struct {
client *occlient.Client
kClient *kclient.Client
kClient kclient.ClientInterface
k8sgenclioptions.IOStreams
componentName string
appName string
projectName string
}
func NewDefaultPortForwarder(componentName, appName string, projectName string, client *occlient.Client, kClient *kclient.Client, streams k8sgenclioptions.IOStreams) *DefaultPortForwarder {
func NewDefaultPortForwarder(componentName, appName string, projectName string, client *occlient.Client, kClient kclient.ClientInterface, streams k8sgenclioptions.IOStreams) *DefaultPortForwarder {
return &DefaultPortForwarder{
client: client,
kClient: kClient,
@@ -47,7 +47,7 @@ func (f *DefaultPortForwarder) ForwardPorts(portPair string, stopChan, readyChan
var err error
if f.kClient != nil && isDevfile {
conf, err = f.kClient.KubeConfig.ClientConfig()
conf, err = f.kClient.GetConfig().ClientConfig()
if err != nil {
return err
}

View File

@@ -404,7 +404,7 @@ func (a Adapter) Test(testCmd string, show bool) (err error) {
// DoesComponentExist returns true if a component with the specified name exists, false otherwise
func (a Adapter) DoesComponentExist(cmpName string, appName string) (bool, error) {
return utils.ComponentExists(*a.Client.GetKubeClient(), cmpName, appName)
return utils.ComponentExists(a.Client.GetKubeClient(), cmpName, appName)
}
func (a *Adapter) createOrUpdateComponent(componentExists bool, ei envinfo.EnvSpecificInfo) (err error) {
@@ -416,7 +416,7 @@ func (a *Adapter) createOrUpdateComponent(componentExists bool, ei envinfo.EnvSp
})
// handle the ephemeral storage
err = storage.HandleEphemeralStorage(*a.Client.GetKubeClient(), storageClient, a.ComponentName)
err = storage.HandleEphemeralStorage(a.Client.GetKubeClient(), storageClient, a.ComponentName)
if err != nil {
return err
}
@@ -723,7 +723,7 @@ func (a Adapter) Log(follow bool, command devfilev1.Command) (io.ReadCloser, err
// Exec executes a command in the component
func (a Adapter) Exec(command []string) error {
exists, err := utils.ComponentExists(*a.Client.GetKubeClient(), a.ComponentName, a.AppName)
exists, err := utils.ComponentExists(a.Client.GetKubeClient(), a.ComponentName, a.AppName)
if err != nil {
return err
}

View File

@@ -112,7 +112,7 @@ func GenerateVolumeNameFromPVC(pvc string) (volumeName string, err error) {
}
// HandleEphemeralStorage creates or deletes the ephemeral volume based on the preference setting
func HandleEphemeralStorage(client kclient.Client, storageClient storage.Client, componentName string) error {
func HandleEphemeralStorage(client kclient.ClientInterface, storageClient storage.Client, componentName string) error {
pref, err := preference.New()
if err != nil {
return err

View File

@@ -1,11 +1,12 @@
package utils
import (
"strconv"
devfileParser "github.com/devfile/library/pkg/devfile/parser"
adaptersCommon "github.com/openshift/odo/pkg/devfile/adapters/common"
"github.com/openshift/odo/pkg/kclient"
"github.com/openshift/odo/pkg/util"
"strconv"
"github.com/openshift/odo/pkg/storage"
corev1 "k8s.io/api/core/v1"
@@ -43,7 +44,7 @@ func GetOdoContainerVolumes(sourcePVCName string) []corev1.Volume {
}
// ComponentExists checks whether a deployment by the given name exists in the given app
func ComponentExists(client kclient.Client, name string, app string) (bool, error) {
func ComponentExists(client kclient.ClientInterface, name string, app string) (bool, error) {
deployment, err := client.GetOneDeployment(name, app)
if _, ok := err.(*kclient.DeploymentNotFoundError); ok {
klog.V(2).Infof("Deployment %s not found for belonging to the %s app ", name, app)

View File

@@ -85,7 +85,7 @@ func TestComponentExists(t *testing.T) {
})
// Verify that a component with the specified name exists
componentExists, err := ComponentExists(*fkclient, tt.getComponentName, tt.appName)
componentExists, err := ComponentExists(fkclient, tt.getComponentName, tt.appName)
if !tt.wantErr && err != nil {
t.Errorf("unexpected error: %v", err)
} else if !tt.wantErr && componentExists != tt.want {

128
pkg/kclient/interface.go Normal file
View File

@@ -0,0 +1,128 @@
package kclient
import (
"io"
"github.com/go-openapi/spec"
"github.com/openshift/odo/pkg/log"
"github.com/openshift/odo/pkg/unions"
olm "github.com/operator-framework/api/pkg/operators/v1alpha1"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/client-go/discovery"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
)
type ClientInterface interface {
// deployment.go
GetDeploymentByName(name string) (*appsv1.Deployment, error)
GetOneDeployment(componentName, appName string) (*appsv1.Deployment, error)
GetOneDeploymentFromSelector(selector string) (*appsv1.Deployment, error)
GetDeploymentFromSelector(selector string) ([]appsv1.Deployment, error)
ListDeployments(selector string) (*appsv1.DeploymentList, error)
WaitForPodDeletion(name string) error
WaitForDeploymentRollout(deploymentName string) (*appsv1.Deployment, error)
CreateDeployment(deploy appsv1.Deployment) (*appsv1.Deployment, error)
UpdateDeployment(deploy appsv1.Deployment) (*appsv1.Deployment, error)
ApplyDeployment(deploy appsv1.Deployment) (*appsv1.Deployment, error)
DeleteDeployment(labels map[string]string) error
CreateDynamicResource(exampleCustomResource map[string]interface{}, ownerReferences []metav1.OwnerReference, group, version, resource string) error
ListDynamicResource(group, version, resource string) (*unstructured.UnstructuredList, error)
GetDynamicResource(group, version, resource, name string) (*unstructured.Unstructured, error)
UpdateDynamicResource(group, version, resource, name string, u *unstructured.Unstructured) error
DeleteDynamicResource(name, group, version, resource string) error
LinkSecret(secretName, componentName, applicationName string) error
UnlinkSecret(secretName, componentName, applicationName string) error
GetDeploymentLabelValues(label string, selector string) ([]string, error)
GetDeploymentConfigsFromSelector(selector string) ([]appsv1.Deployment, error)
GetDeploymentAPIVersion() (metav1.GroupVersionResource, error)
IsDeploymentExtensionsV1Beta1() (bool, error)
// events.go
CollectEvents(selector string, events map[string]corev1.Event, spinner *log.Status, quit <-chan int)
// ingress.go
GetOneIngressFromSelector(selector string) (*unions.KubernetesIngress, error)
CreateIngress(ingress unions.KubernetesIngress) (*unions.KubernetesIngress, error)
DeleteIngress(name string) error
ListIngresses(labelSelector string) (*unions.KubernetesIngressList, error)
GetIngress(name string) (*unions.KubernetesIngress, error)
// kclient.go
GetClient() kubernetes.Interface
GetConfig() clientcmd.ClientConfig
GetClientConfig() *rest.Config
GetDynamicClient() dynamic.Interface
Delete(labels map[string]string, wait bool) error
WaitForComponentDeletion(selector string) error
GeneratePortForwardReq(podName string) *rest.Request
SetDiscoveryInterface(client discovery.DiscoveryInterface)
IsResourceSupported(apiGroup, apiVersion, resourceName string) (bool, error)
IsSSASupported() bool
// namespace.go
GetCurrentNamespace() string
SetNamespace(ns string)
GetNamespaces() ([]string, error)
GetNamespace(name string) (*corev1.Namespace, error)
CreateNamespace(name string) (*corev1.Namespace, error)
DeleteNamespace(name string, wait bool) error
SetCurrentNamespace(namespace string) error
WaitForServiceAccountInNamespace(namespace, serviceAccountName string) error
// operators.go
IsServiceBindingSupported() (bool, error)
IsCSVSupported() (bool, error)
ListClusterServiceVersions() (*olm.ClusterServiceVersionList, error)
GetClusterServiceVersion(name string) (olm.ClusterServiceVersion, error)
GetCustomResourcesFromCSV(csv *olm.ClusterServiceVersion) *[]olm.CRDDescription
CheckCustomResourceInCSV(customResource string, csv *olm.ClusterServiceVersion) (bool, *olm.CRDDescription)
SearchClusterServiceVersionList(name string) (*olm.ClusterServiceVersionList, error)
GetCustomResource(customResource string) (*olm.CRDDescription, error)
GetCSVWithCR(name string) (*olm.ClusterServiceVersion, error)
GetResourceSpecDefinition(group, version, kind string) (*spec.Schema, error)
// pods.go
WaitAndGetPodWithEvents(selector string, desiredPhase corev1.PodPhase, waitMessage string) (*corev1.Pod, error)
ExecCMDInContainer(containerName, podName string, cmd []string, stdout io.Writer, stderr io.Writer, stdin io.Reader, tty bool) error
ExtractProjectToComponent(containerName, podName string, targetPath string, stdin io.Reader) error
GetOnePod(componentName, appName string) (*corev1.Pod, error)
GetPodUsingComponentName(componentName string) (*corev1.Pod, error)
GetOnePodFromSelector(selector string) (*corev1.Pod, error)
GetPodLogs(podName, containerName string, followLog bool) (io.ReadCloser, error)
// secrets.go
CreateTLSSecret(tlsCertificate []byte, tlsPrivKey []byte, objectMeta metav1.ObjectMeta) (*corev1.Secret, error)
GetSecret(name, namespace string) (*corev1.Secret, error)
UpdateSecret(secret *corev1.Secret, namespace string) (*corev1.Secret, error)
DeleteSecret(secretName, namespace string) error
CreateSecret(objectMeta metav1.ObjectMeta, data map[string]string, ownerReference metav1.OwnerReference) error
CreateSecrets(componentName string, commonObjectMeta metav1.ObjectMeta, svc *corev1.Service, ownerReference metav1.OwnerReference) error
ListSecrets(labelSelector string) ([]corev1.Secret, error)
WaitAndGetSecret(name string, namespace string) (*corev1.Secret, error)
// service.go
GetService(name string) (*corev1.Service, error)
CreateService(svc corev1.Service) (*corev1.Service, error)
UpdateService(svc corev1.Service) (*corev1.Service, error)
ListServices(selector string) ([]corev1.Service, error)
DeleteService(serviceName string) error
GetOneService(componentName, appName string) (*corev1.Service, error)
GetOneServiceFromSelector(selector string) (*corev1.Service, error)
// volumes.go
CreatePVC(pvc corev1.PersistentVolumeClaim) (*corev1.PersistentVolumeClaim, error)
DeletePVC(pvcName string) error
ListPVCs(selector string) ([]corev1.PersistentVolumeClaim, error)
ListPVCNames(selector string) ([]string, error)
GetPVCFromName(pvcName string) (*corev1.PersistentVolumeClaim, error)
UpdatePVCLabels(pvc *corev1.PersistentVolumeClaim, labels map[string]string) error
GetAndUpdateStorageOwnerReference(pvc *corev1.PersistentVolumeClaim, ownerReference ...metav1.OwnerReference) error
UpdateStorageOwnerReference(pvc *corev1.PersistentVolumeClaim, ownerReference ...metav1.OwnerReference) error
}

View File

@@ -67,6 +67,22 @@ func New() (*Client, error) {
return NewForConfig(nil)
}
func (c *Client) GetClient() kubernetes.Interface {
return c.KubeClient
}
func (c *Client) GetConfig() clientcmd.ClientConfig {
return c.KubeConfig
}
func (c *Client) GetClientConfig() *rest.Config {
return c.KubeClientConfig
}
func (c *Client) GetDynamicClient() dynamic.Interface {
return c.DynamicClient
}
// NewForConfig creates a new client with the provided configuration or initializes the configuration if none is provided
func NewForConfig(config clientcmd.ClientConfig) (client *Client, err error) {
if config == nil {

1308
pkg/kclient/mock_Client.go Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -158,6 +158,10 @@ func (c *Client) GetCurrentNamespace() string {
return c.Namespace
}
func (c *Client) SetNamespace(ns string) {
c.Namespace = ns
}
// WaitForServiceAccountInNamespace waits for the given service account to be ready
func (c *Client) WaitForServiceAccountInNamespace(namespace, serviceAccountName string) error {
if namespace == "" || serviceAccountName == "" {

View File

@@ -1,124 +1,51 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: localConfigProvider.go
// Source: pkg/localConfigProvider/localConfigProvider.go
// Package localConfigProvider is a generated GoMock package.
package localConfigProvider
import (
gomock "github.com/golang/mock/gomock"
reflect "reflect"
gomock "github.com/golang/mock/gomock"
)
// MockLocalConfigProvider is a mock of LocalConfigProvider interface
// MockLocalConfigProvider is a mock of LocalConfigProvider interface.
type MockLocalConfigProvider struct {
ctrl *gomock.Controller
recorder *MockLocalConfigProviderMockRecorder
}
// MockLocalConfigProviderMockRecorder is the mock recorder for MockLocalConfigProvider
// MockLocalConfigProviderMockRecorder is the mock recorder for MockLocalConfigProvider.
type MockLocalConfigProviderMockRecorder struct {
mock *MockLocalConfigProvider
}
// NewMockLocalConfigProvider creates a new mock instance
// NewMockLocalConfigProvider creates a new mock instance.
func NewMockLocalConfigProvider(ctrl *gomock.Controller) *MockLocalConfigProvider {
mock := &MockLocalConfigProvider{ctrl: ctrl}
mock.recorder = &MockLocalConfigProviderMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockLocalConfigProvider) EXPECT() *MockLocalConfigProviderMockRecorder {
return m.recorder
}
// GetApplication mocks base method
func (m *MockLocalConfigProvider) GetApplication() string {
// CompleteStorage mocks base method.
func (m *MockLocalConfigProvider) CompleteStorage(storage *LocalStorage) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetApplication")
ret0, _ := ret[0].(string)
return ret0
m.ctrl.Call(m, "CompleteStorage", storage)
}
// GetApplication indicates an expected call of GetApplication
func (mr *MockLocalConfigProviderMockRecorder) GetApplication() *gomock.Call {
// CompleteStorage indicates an expected call of CompleteStorage.
func (mr *MockLocalConfigProviderMockRecorder) CompleteStorage(storage interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetApplication", reflect.TypeOf((*MockLocalConfigProvider)(nil).GetApplication))
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CompleteStorage", reflect.TypeOf((*MockLocalConfigProvider)(nil).CompleteStorage), storage)
}
// GetName mocks base method
func (m *MockLocalConfigProvider) GetName() string {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetName")
ret0, _ := ret[0].(string)
return ret0
}
// GetName indicates an expected call of GetName
func (mr *MockLocalConfigProviderMockRecorder) GetName() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetName", reflect.TypeOf((*MockLocalConfigProvider)(nil).GetName))
}
// GetNamespace mocks base method
func (m *MockLocalConfigProvider) GetNamespace() string {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetNamespace")
ret0, _ := ret[0].(string)
return ret0
}
// GetNamespace indicates an expected call of GetNamespace
func (mr *MockLocalConfigProviderMockRecorder) GetNamespace() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNamespace", reflect.TypeOf((*MockLocalConfigProvider)(nil).GetNamespace))
}
// GetDebugPort mocks base method
func (m *MockLocalConfigProvider) GetDebugPort() int {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetDebugPort")
ret0, _ := ret[0].(int)
return ret0
}
// GetDebugPort indicates an expected call of GetDebugPort
func (mr *MockLocalConfigProviderMockRecorder) GetDebugPort() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDebugPort", reflect.TypeOf((*MockLocalConfigProvider)(nil).GetDebugPort))
}
// GetContainers mocks base method
func (m *MockLocalConfigProvider) GetContainers() ([]LocalContainer, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetContainers")
ret0, _ := ret[0].([]LocalContainer)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetContainers indicates an expected call of GetContainers
func (mr *MockLocalConfigProviderMockRecorder) GetContainers() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetContainers", reflect.TypeOf((*MockLocalConfigProvider)(nil).GetContainers))
}
// GetURL mocks base method
func (m *MockLocalConfigProvider) GetURL(name string) (*LocalURL, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetURL", name)
ret0, _ := ret[0].(*LocalURL)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetURL indicates an expected call of GetURL
func (mr *MockLocalConfigProviderMockRecorder) GetURL(name interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetURL", reflect.TypeOf((*MockLocalConfigProvider)(nil).GetURL), name)
}
// CompleteURL mocks base method
// CompleteURL mocks base method.
func (m *MockLocalConfigProvider) CompleteURL(url *LocalURL) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "CompleteURL", url)
@@ -126,27 +53,27 @@ func (m *MockLocalConfigProvider) CompleteURL(url *LocalURL) error {
return ret0
}
// CompleteURL indicates an expected call of CompleteURL
// CompleteURL indicates an expected call of CompleteURL.
func (mr *MockLocalConfigProviderMockRecorder) CompleteURL(url interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CompleteURL", reflect.TypeOf((*MockLocalConfigProvider)(nil).CompleteURL), url)
}
// ValidateURL mocks base method
func (m *MockLocalConfigProvider) ValidateURL(url LocalURL) error {
// CreateStorage mocks base method.
func (m *MockLocalConfigProvider) CreateStorage(storage LocalStorage) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ValidateURL", url)
ret := m.ctrl.Call(m, "CreateStorage", storage)
ret0, _ := ret[0].(error)
return ret0
}
// ValidateURL indicates an expected call of ValidateURL
func (mr *MockLocalConfigProviderMockRecorder) ValidateURL(url interface{}) *gomock.Call {
// CreateStorage indicates an expected call of CreateStorage.
func (mr *MockLocalConfigProviderMockRecorder) CreateStorage(storage interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidateURL", reflect.TypeOf((*MockLocalConfigProvider)(nil).ValidateURL), url)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateStorage", reflect.TypeOf((*MockLocalConfigProvider)(nil).CreateStorage), storage)
}
// CreateURL mocks base method
// CreateURL mocks base method.
func (m *MockLocalConfigProvider) CreateURL(url LocalURL) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "CreateURL", url)
@@ -154,13 +81,27 @@ func (m *MockLocalConfigProvider) CreateURL(url LocalURL) error {
return ret0
}
// CreateURL indicates an expected call of CreateURL
// CreateURL indicates an expected call of CreateURL.
func (mr *MockLocalConfigProviderMockRecorder) CreateURL(url interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateURL", reflect.TypeOf((*MockLocalConfigProvider)(nil).CreateURL), url)
}
// DeleteURL mocks base method
// DeleteStorage mocks base method.
func (m *MockLocalConfigProvider) DeleteStorage(name string) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "DeleteStorage", name)
ret0, _ := ret[0].(error)
return ret0
}
// DeleteStorage indicates an expected call of DeleteStorage.
func (mr *MockLocalConfigProviderMockRecorder) DeleteStorage(name interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteStorage", reflect.TypeOf((*MockLocalConfigProvider)(nil).DeleteStorage), name)
}
// DeleteURL mocks base method.
func (m *MockLocalConfigProvider) DeleteURL(name string) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "DeleteURL", name)
@@ -168,28 +109,41 @@ func (m *MockLocalConfigProvider) DeleteURL(name string) error {
return ret0
}
// DeleteURL indicates an expected call of DeleteURL
// DeleteURL indicates an expected call of DeleteURL.
func (mr *MockLocalConfigProviderMockRecorder) DeleteURL(name interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteURL", reflect.TypeOf((*MockLocalConfigProvider)(nil).DeleteURL), name)
}
// GetContainerPorts mocks base method
func (m *MockLocalConfigProvider) GetContainerPorts(container string) ([]string, error) {
// Exists mocks base method.
func (m *MockLocalConfigProvider) Exists() bool {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetContainerPorts", container)
ret0, _ := ret[0].([]string)
ret1, _ := ret[1].(error)
return ret0, ret1
ret := m.ctrl.Call(m, "Exists")
ret0, _ := ret[0].(bool)
return ret0
}
// GetContainerPorts indicates an expected call of GetContainerPorts
func (mr *MockLocalConfigProviderMockRecorder) GetContainerPorts(container interface{}) *gomock.Call {
// Exists indicates an expected call of Exists.
func (mr *MockLocalConfigProviderMockRecorder) Exists() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetContainerPorts", reflect.TypeOf((*MockLocalConfigProvider)(nil).GetContainerPorts), container)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Exists", reflect.TypeOf((*MockLocalConfigProvider)(nil).Exists))
}
// GetComponentPorts mocks base method
// GetApplication mocks base method.
func (m *MockLocalConfigProvider) GetApplication() string {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetApplication")
ret0, _ := ret[0].(string)
return ret0
}
// GetApplication indicates an expected call of GetApplication.
func (mr *MockLocalConfigProviderMockRecorder) GetApplication() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetApplication", reflect.TypeOf((*MockLocalConfigProvider)(nil).GetApplication))
}
// GetComponentPorts mocks base method.
func (m *MockLocalConfigProvider) GetComponentPorts() ([]string, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetComponentPorts")
@@ -198,28 +152,85 @@ func (m *MockLocalConfigProvider) GetComponentPorts() ([]string, error) {
return ret0, ret1
}
// GetComponentPorts indicates an expected call of GetComponentPorts
// GetComponentPorts indicates an expected call of GetComponentPorts.
func (mr *MockLocalConfigProviderMockRecorder) GetComponentPorts() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetComponentPorts", reflect.TypeOf((*MockLocalConfigProvider)(nil).GetComponentPorts))
}
// ListURLs mocks base method
func (m *MockLocalConfigProvider) ListURLs() ([]LocalURL, error) {
// GetContainerPorts mocks base method.
func (m *MockLocalConfigProvider) GetContainerPorts(container string) ([]string, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ListURLs")
ret0, _ := ret[0].([]LocalURL)
ret := m.ctrl.Call(m, "GetContainerPorts", container)
ret0, _ := ret[0].([]string)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// ListURLs indicates an expected call of ListURLs
func (mr *MockLocalConfigProviderMockRecorder) ListURLs() *gomock.Call {
// GetContainerPorts indicates an expected call of GetContainerPorts.
func (mr *MockLocalConfigProviderMockRecorder) GetContainerPorts(container interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListURLs", reflect.TypeOf((*MockLocalConfigProvider)(nil).ListURLs))
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetContainerPorts", reflect.TypeOf((*MockLocalConfigProvider)(nil).GetContainerPorts), container)
}
// GetStorage mocks base method
// GetContainers mocks base method.
func (m *MockLocalConfigProvider) GetContainers() ([]LocalContainer, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetContainers")
ret0, _ := ret[0].([]LocalContainer)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetContainers indicates an expected call of GetContainers.
func (mr *MockLocalConfigProviderMockRecorder) GetContainers() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetContainers", reflect.TypeOf((*MockLocalConfigProvider)(nil).GetContainers))
}
// GetDebugPort mocks base method.
func (m *MockLocalConfigProvider) GetDebugPort() int {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetDebugPort")
ret0, _ := ret[0].(int)
return ret0
}
// GetDebugPort indicates an expected call of GetDebugPort.
func (mr *MockLocalConfigProviderMockRecorder) GetDebugPort() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetDebugPort", reflect.TypeOf((*MockLocalConfigProvider)(nil).GetDebugPort))
}
// GetName mocks base method.
func (m *MockLocalConfigProvider) GetName() string {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetName")
ret0, _ := ret[0].(string)
return ret0
}
// GetName indicates an expected call of GetName.
func (mr *MockLocalConfigProviderMockRecorder) GetName() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetName", reflect.TypeOf((*MockLocalConfigProvider)(nil).GetName))
}
// GetNamespace mocks base method.
func (m *MockLocalConfigProvider) GetNamespace() string {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetNamespace")
ret0, _ := ret[0].(string)
return ret0
}
// GetNamespace indicates an expected call of GetNamespace.
func (mr *MockLocalConfigProviderMockRecorder) GetNamespace() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetNamespace", reflect.TypeOf((*MockLocalConfigProvider)(nil).GetNamespace))
}
// GetStorage mocks base method.
func (m *MockLocalConfigProvider) GetStorage(name string) (*LocalStorage, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetStorage", name)
@@ -228,82 +239,13 @@ func (m *MockLocalConfigProvider) GetStorage(name string) (*LocalStorage, error)
return ret0, ret1
}
// GetStorage indicates an expected call of GetStorage
// GetStorage indicates an expected call of GetStorage.
func (mr *MockLocalConfigProviderMockRecorder) GetStorage(name interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStorage", reflect.TypeOf((*MockLocalConfigProvider)(nil).GetStorage), name)
}
// CompleteStorage mocks base method
func (m *MockLocalConfigProvider) CompleteStorage(storage *LocalStorage) {
m.ctrl.T.Helper()
m.ctrl.Call(m, "CompleteStorage", storage)
}
// CompleteStorage indicates an expected call of CompleteStorage
func (mr *MockLocalConfigProviderMockRecorder) CompleteStorage(storage interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CompleteStorage", reflect.TypeOf((*MockLocalConfigProvider)(nil).CompleteStorage), storage)
}
// ValidateStorage mocks base method
func (m *MockLocalConfigProvider) ValidateStorage(storage LocalStorage) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ValidateStorage", storage)
ret0, _ := ret[0].(error)
return ret0
}
// ValidateStorage indicates an expected call of ValidateStorage
func (mr *MockLocalConfigProviderMockRecorder) ValidateStorage(storage interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidateStorage", reflect.TypeOf((*MockLocalConfigProvider)(nil).ValidateStorage), storage)
}
// CreateStorage mocks base method
func (m *MockLocalConfigProvider) CreateStorage(storage LocalStorage) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "CreateStorage", storage)
ret0, _ := ret[0].(error)
return ret0
}
// CreateStorage indicates an expected call of CreateStorage
func (mr *MockLocalConfigProviderMockRecorder) CreateStorage(storage interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateStorage", reflect.TypeOf((*MockLocalConfigProvider)(nil).CreateStorage), storage)
}
// DeleteStorage mocks base method
func (m *MockLocalConfigProvider) DeleteStorage(name string) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "DeleteStorage", name)
ret0, _ := ret[0].(error)
return ret0
}
// DeleteStorage indicates an expected call of DeleteStorage
func (mr *MockLocalConfigProviderMockRecorder) DeleteStorage(name interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteStorage", reflect.TypeOf((*MockLocalConfigProvider)(nil).DeleteStorage), name)
}
// ListStorage mocks base method
func (m *MockLocalConfigProvider) ListStorage() ([]LocalStorage, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ListStorage")
ret0, _ := ret[0].([]LocalStorage)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// ListStorage indicates an expected call of ListStorage
func (mr *MockLocalConfigProviderMockRecorder) ListStorage() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListStorage", reflect.TypeOf((*MockLocalConfigProvider)(nil).ListStorage))
}
// GetStorageMountPath mocks base method
// GetStorageMountPath mocks base method.
func (m *MockLocalConfigProvider) GetStorageMountPath(storageName string) (string, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetStorageMountPath", storageName)
@@ -312,22 +254,81 @@ func (m *MockLocalConfigProvider) GetStorageMountPath(storageName string) (strin
return ret0, ret1
}
// GetStorageMountPath indicates an expected call of GetStorageMountPath
// GetStorageMountPath indicates an expected call of GetStorageMountPath.
func (mr *MockLocalConfigProviderMockRecorder) GetStorageMountPath(storageName interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStorageMountPath", reflect.TypeOf((*MockLocalConfigProvider)(nil).GetStorageMountPath), storageName)
}
// Exists mocks base method
func (m *MockLocalConfigProvider) Exists() bool {
// GetURL mocks base method.
func (m *MockLocalConfigProvider) GetURL(name string) (*LocalURL, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Exists")
ret0, _ := ret[0].(bool)
ret := m.ctrl.Call(m, "GetURL", name)
ret0, _ := ret[0].(*LocalURL)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetURL indicates an expected call of GetURL.
func (mr *MockLocalConfigProviderMockRecorder) GetURL(name interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetURL", reflect.TypeOf((*MockLocalConfigProvider)(nil).GetURL), name)
}
// ListStorage mocks base method.
func (m *MockLocalConfigProvider) ListStorage() ([]LocalStorage, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ListStorage")
ret0, _ := ret[0].([]LocalStorage)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// ListStorage indicates an expected call of ListStorage.
func (mr *MockLocalConfigProviderMockRecorder) ListStorage() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListStorage", reflect.TypeOf((*MockLocalConfigProvider)(nil).ListStorage))
}
// ListURLs mocks base method.
func (m *MockLocalConfigProvider) ListURLs() ([]LocalURL, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ListURLs")
ret0, _ := ret[0].([]LocalURL)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// ListURLs indicates an expected call of ListURLs.
func (mr *MockLocalConfigProviderMockRecorder) ListURLs() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListURLs", reflect.TypeOf((*MockLocalConfigProvider)(nil).ListURLs))
}
// ValidateStorage mocks base method.
func (m *MockLocalConfigProvider) ValidateStorage(storage LocalStorage) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ValidateStorage", storage)
ret0, _ := ret[0].(error)
return ret0
}
// Exists indicates an expected call of Exists
func (mr *MockLocalConfigProviderMockRecorder) Exists() *gomock.Call {
// ValidateStorage indicates an expected call of ValidateStorage.
func (mr *MockLocalConfigProviderMockRecorder) ValidateStorage(storage interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Exists", reflect.TypeOf((*MockLocalConfigProvider)(nil).Exists))
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidateStorage", reflect.TypeOf((*MockLocalConfigProvider)(nil).ValidateStorage), storage)
}
// ValidateURL mocks base method.
func (m *MockLocalConfigProvider) ValidateURL(url LocalURL) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ValidateURL", url)
ret0, _ := ret[0].(error)
return ret0
}
// ValidateURL indicates an expected call of ValidateURL.
func (mr *MockLocalConfigProviderMockRecorder) ValidateURL(url interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidateURL", reflect.TypeOf((*MockLocalConfigProvider)(nil).ValidateURL), url)
}

View File

@@ -53,7 +53,7 @@ func AddApplicationFlag(cmd *cobra.Command) {
}
// printAppInfo will print things which will be deleted
func printAppInfo(client *occlient.Client, kClient *kclient.Client, appName string, projectName string) error {
func printAppInfo(client *occlient.Client, kClient kclient.ClientInterface, appName string, projectName string) error {
var selector string
if appName != "" {
selector = applabels.GetSelector(appName)

View File

@@ -64,7 +64,7 @@ func (o *DeleteOptions) Validate() (err error) {
return fmt.Errorf("given output format %s is not supported", o.OutputFlag)
}
exist, err := application.Exists(o.appName, o.Client, o.KClient)
exist, err := application.Exists(o.appName, o.Client)
if !exist {
return fmt.Errorf("%s app does not exists", o.appName)
}

View File

@@ -69,7 +69,7 @@ func (o *DescribeOptions) Validate() (err error) {
return fmt.Errorf("There's no active application in project: %v", o.Project)
}
exist, err := application.Exists(o.appName, o.Client, o.KClient)
exist, err := application.Exists(o.appName, o.Client)
if !exist {
return fmt.Errorf("%s app does not exists", o.appName)
}

View File

@@ -94,7 +94,7 @@ func (do *DeleteOptions) Complete(name string, cmd *cobra.Command, args []string
return err
}
// The namespace was retrieved from the --project flag (or from the kube client if not set) and stored in kclient when initializing the context
do.namespace = do.KClient.Namespace
do.namespace = do.KClient.GetCurrentNamespace()
return nil
}

View File

@@ -85,7 +85,7 @@ func (po *PushOptions) devfilePushInner() (err error) {
var platformContext interface{}
kc := kubernetes.KubernetesContext{
Namespace: po.KClient.Namespace,
Namespace: po.KClient.GetCurrentNamespace(),
}
platformContext = kc
@@ -138,7 +138,7 @@ func (lo LogOptions) DevfileComponentLog() error {
var platformContext interface{}
kc := kubernetes.KubernetesContext{
Namespace: lo.KClient.Namespace,
Namespace: lo.KClient.GetCurrentNamespace(),
}
platformContext = kc
@@ -207,7 +207,7 @@ func (to *TestOptions) RunTestCommand() error {
var platformContext interface{}
kc := kubernetes.KubernetesContext{
Namespace: to.KClient.Namespace,
Namespace: to.KClient.GetCurrentNamespace(),
}
platformContext = kc

View File

@@ -3,12 +3,13 @@ package component
import (
"fmt"
"path/filepath"
appCmd "github.com/openshift/odo/pkg/odo/cli/application"
projectCmd "github.com/openshift/odo/pkg/odo/cli/project"
"github.com/openshift/odo/pkg/odo/genericclioptions"
odoutil "github.com/openshift/odo/pkg/odo/util"
"github.com/openshift/odo/pkg/odo/util/completion"
"path/filepath"
"github.com/spf13/cobra"
ktemplates "k8s.io/kubectl/pkg/util/templates"
@@ -64,8 +65,9 @@ Please provide a command to execute, odo exec -- <command to be execute>`)
if err != nil {
return err
}
// The namespace was retrieved from the --project flag (or from the kube client if not set) and stored in kclient when initializing the context
eo.namespace = eo.componentOptions.KClient.Namespace
eo.namespace = eo.componentOptions.KClient.GetCurrentNamespace()
return nil
}

View File

@@ -108,7 +108,7 @@ func (lo *ListOptions) Validate() (err error) {
}
if util.CheckPathExists(lo.devfilePath) {
if lo.Application == "" && lo.KClient.Namespace == "" {
if lo.Application == "" && lo.KClient.GetCurrentNamespace() == "" {
return odoutil.ThrowContextError()
}
return nil

View File

@@ -90,7 +90,7 @@ func (so *StatusOptions) Complete(name string, cmd *cobra.Command, args []string
var platformContext interface{}
// The namespace was retrieved from the --project flag (or from the kube client if not set) and stored in kclient when initializing the context
so.namespace = so.KClient.Namespace
so.namespace = so.KClient.GetCurrentNamespace()
platformContext = kubernetes.KubernetesContext{
Namespace: so.namespace,
}
@@ -137,7 +137,7 @@ func (so *StatusOptions) Run(cmd *cobra.Command) (err error) {
// Fallback to k8s if occlient throws an error
oclient = nil
} else {
oclient.Namespace = so.KClient.Namespace
oclient.Namespace = so.KClient.GetCurrentNamespace()
}
url.StartURLHttpRequestStatusWatchForK8S(oclient, so.KClient, &so.localConfig, loggingClient)

View File

@@ -97,7 +97,7 @@ func (wo *WatchOptions) Complete(name string, cmd *cobra.Command, args []string)
var platformContext interface{}
// The namespace was retrieved from the --project flag (or from the kube client if not set) and stored in kclient when initializing the context
wo.namespace = wo.KClient.Namespace
wo.namespace = wo.KClient.GetCurrentNamespace()
platformContext = kubernetes.KubernetesContext{
Namespace: wo.namespace,
}

View File

@@ -81,7 +81,7 @@ func (o *ServiceListOptions) listOperatorServices() (err error) {
if len(failedListingCR) > 0 {
fmt.Printf("Failed to fetch services for operator(s): %q\n\n", strings.Join(failedListingCR, ", "))
}
return fmt.Errorf("no operator backed services found in namespace: %s", o.KClient.Namespace)
return fmt.Errorf("no operator backed services found in namespace: %s", o.KClient.GetCurrentNamespace())
}
if log.IsJSON() {

View File

@@ -45,7 +45,7 @@ type internalCxt struct {
cmp string
OutputFlag string
LocalConfigInfo *config.LocalConfigInfo
KClient *kclient.Client
KClient kclient.ClientInterface
EnvSpecificInfo *envinfo.EnvSpecificInfo
LocalConfigProvider localConfigProvider.LocalConfigProvider
}

View File

@@ -5,7 +5,7 @@ import (
"github.com/openshift/odo/pkg/occlient"
)
func NewFakeContext(project, application, component string, client *occlient.Client, kclient *kclient.Client) *Context {
func NewFakeContext(project, application, component string, client *occlient.Client, kclient kclient.ClientInterface) *Context {
return &Context{
internalCxt{
Client: client,

View File

@@ -53,7 +53,7 @@ func (o *internalCxt) resolveProject(localConfiguration localConfigProvider.Loca
o.Client.Namespace = namespace
o.Project = namespace
if o.KClient != nil {
o.KClient.Namespace = namespace
o.KClient.SetNamespace(namespace)
}
}
@@ -64,7 +64,7 @@ func (o *internalCxt) resolveNamespace(configProvider localConfigProvider.LocalC
projectFlag := FlagValueIfSet(command, ProjectFlagName)
if len(projectFlag) > 0 {
// if namespace flag was set, check that the specified namespace exists and use it
_, err := o.KClient.KubeClient.CoreV1().Namespaces().Get(context.TODO(), projectFlag, metav1.GetOptions{})
_, err := o.KClient.GetClient().CoreV1().Namespaces().Get(context.TODO(), projectFlag, metav1.GetOptions{})
// do not error out when its odo delete -a, so that we let users delete the local config on missing namespace
if command.HasParent() && command.Parent().Name() != "project" && !(command.Name() == "delete" && command.Flags().Changed("all")) {
util.LogErrorAndExit(err, "")
@@ -73,7 +73,7 @@ func (o *internalCxt) resolveNamespace(configProvider localConfigProvider.LocalC
} else {
namespace = configProvider.GetNamespace()
if namespace == "" {
namespace = o.KClient.Namespace
namespace = o.KClient.GetCurrentNamespace()
if len(namespace) <= 0 {
errFormat := "Could not get current namespace. Please create or set a namespace\n"
checkProjectCreateOrDeleteOnlyOnInvalidNamespace(command, errFormat)
@@ -81,7 +81,7 @@ func (o *internalCxt) resolveNamespace(configProvider localConfigProvider.LocalC
}
// check that the specified namespace exists
_, err := o.KClient.KubeClient.CoreV1().Namespaces().Get(context.TODO(), namespace, metav1.GetOptions{})
_, err := o.KClient.GetClient().CoreV1().Namespaces().Get(context.TODO(), namespace, metav1.GetOptions{})
if err != nil {
errFormat := fmt.Sprintf("You don't have permission to create or set namespace '%s' or the namespace doesn't exist. Please create or set a different namespace\n\t", namespace)
// errFormat := fmt.Sprint(e1, "%s project create|set <project_name>")
@@ -90,7 +90,7 @@ func (o *internalCxt) resolveNamespace(configProvider localConfigProvider.LocalC
}
o.Client.Namespace = namespace
o.Client.GetKubeClient().Namespace = namespace
o.KClient.Namespace = namespace
o.KClient.SetNamespace(namespace)
o.Project = namespace
}

View File

@@ -27,7 +27,7 @@ import (
// PushLinks updates Link(s) from Kubernetes Inlined component in a devfile by creating new ones or removing old ones
// returns true if the component needs to be restarted (when a link has been created or deleted)
// if service binding operator is not present, it will call pushLinksWithoutOperator to create the links without it.
func PushLinks(client *kclient.Client, k8sComponents []devfile.Component, labels map[string]string, deployment *v1.Deployment, context string) (bool, error) {
func PushLinks(client kclient.ClientInterface, k8sComponents []devfile.Component, labels map[string]string, deployment *v1.Deployment, context string) (bool, error) {
serviceBindingSupport, err := client.IsServiceBindingSupported()
if err != nil {
return false, err
@@ -42,7 +42,7 @@ func PushLinks(client *kclient.Client, k8sComponents []devfile.Component, labels
// pushLinksWithOperator creates links or deletes links (if service binding operator is installed) between components and services
// returns true if the component needs to be restarted (a secret was generated and added to the deployment)
func pushLinksWithOperator(client *kclient.Client, k8sComponents []devfile.Component, labels map[string]string, deployment *v1.Deployment, context string) (bool, error) {
func pushLinksWithOperator(client kclient.ClientInterface, k8sComponents []devfile.Component, labels map[string]string, deployment *v1.Deployment, context string) (bool, error) {
ownerReference := generator.GetOwnerReference(deployment)
deployed, err := ListDeployedServices(client, labels)
@@ -126,7 +126,7 @@ func pushLinksWithOperator(client *kclient.Client, k8sComponents []devfile.Compo
// pushLinksWithoutOperator creates links or deletes links (if service binding operator is not installed) between components and services
// returns true if the component needs to be restarted (a secret was generated and added to the deployment)
func pushLinksWithoutOperator(client *kclient.Client, k8sComponents []devfile.Component, labels map[string]string, deployment *v1.Deployment, context string) (bool, error) {
func pushLinksWithoutOperator(client kclient.ClientInterface, k8sComponents []devfile.Component, labels map[string]string, deployment *v1.Deployment, context string) (bool, error) {
// check csv support before proceeding
csvSupport, err := IsCSVSupported()
@@ -190,7 +190,7 @@ func pushLinksWithoutOperator(client *kclient.Client, k8sComponents []devfile.Co
// recreate parts of the service binding request for deletion
var newServiceBinding servicebinding.ServiceBinding
newServiceBinding.Name = linkName
newServiceBinding.Namespace = client.Namespace
newServiceBinding.Namespace = client.GetCurrentNamespace()
newServiceBinding.Spec.Application = servicebinding.Application{
Ref: servicebinding.Ref{
Name: deployment.Name,
@@ -220,7 +220,7 @@ func pushLinksWithoutOperator(client *kclient.Client, k8sComponents []devfile.Co
// since the library currently doesn't delete the secret after unbinding
// delete the secret manually
err = client.DeleteSecret(secretName, client.Namespace)
err = client.DeleteSecret(secretName, client.GetCurrentNamespace())
if err != nil {
return false, err
}
@@ -266,8 +266,9 @@ func pushLinksWithoutOperator(client *kclient.Client, k8sComponents []devfile.Co
// set the labels and namespace
serviceBinding.SetLabels(labels)
serviceBinding.Namespace = client.Namespace
serviceBinding.Spec.Services[0].Namespace = &client.Namespace
serviceBinding.Namespace = client.GetCurrentNamespace()
ns := client.GetCurrentNamespace()
serviceBinding.Spec.Services[0].Namespace = &ns
_, err = json.MarshalIndent(serviceBinding, " ", " ")
if err != nil {
@@ -295,7 +296,7 @@ func pushLinksWithoutOperator(client *kclient.Client, k8sComponents []devfile.Co
}
// get the generated secret and update it with the labels and owner reference
secret, err := client.GetSecret(serviceBinding.Status.Secret, client.Namespace)
secret, err := client.GetSecret(serviceBinding.Status.Secret, client.GetCurrentNamespace())
if err != nil {
return false, err
}
@@ -312,7 +313,7 @@ func pushLinksWithoutOperator(client *kclient.Client, k8sComponents []devfile.Co
secret.Labels[ServiceLabel] = fmt.Sprintf("%v-%v", serviceBinding.Spec.Services[0].Kind, serviceBinding.Spec.Services[0].Name)
}
secret.SetOwnerReferences([]metav1.OwnerReference{ownerReferences})
_, err = client.UpdateSecret(secret, client.Namespace)
_, err = client.UpdateSecret(secret, client.GetCurrentNamespace())
if err != nil {
return false, err
}
@@ -331,8 +332,8 @@ func pushLinksWithoutOperator(client *kclient.Client, k8sComponents []devfile.Co
}
// getPipeline gets the pipeline to process service binding requests
func getPipeline(client *kclient.Client) (pipeline.Pipeline, error) {
mgr, err := ctrl.NewManager(client.KubeClientConfig, ctrl.Options{
func getPipeline(client kclient.ClientInterface) (pipeline.Pipeline, error) {
mgr, err := ctrl.NewManager(client.GetClientConfig(), ctrl.Options{
Scheme: runtime.NewScheme(),
// disable the health probes to prevent binding to them
HealthProbeBindAddress: "0",
@@ -342,5 +343,5 @@ func getPipeline(client *kclient.Client) (pipeline.Pipeline, error) {
if err != nil {
return nil, err
}
return OdoDefaultBuilder.WithContextProvider(context.Provider(client.DynamicClient, context.ResourceLookup(mgr.GetRESTMapper()))).Build(), nil
return OdoDefaultBuilder.WithContextProvider(context.Provider(client.GetDynamicClient(), context.ResourceLookup(mgr.GetRESTMapper()))).Build(), nil
}

View File

@@ -48,7 +48,7 @@ const filePrefix = "odo-service-"
// GetCSV checks if the CR provided by the user in the YAML file exists in the namesapce
// It returns a CR (string representation) and CSV (Operator) upon successfully
// able to find them, an error otherwise.
func GetCSV(client *kclient.Client, crd map[string]interface{}) (string, olm.ClusterServiceVersion, error) {
func GetCSV(client kclient.ClientInterface, crd map[string]interface{}) (string, olm.ClusterServiceVersion, error) {
cr := crd["kind"].(string)
csvs, err := client.ListClusterServiceVersions()
if err != nil {
@@ -78,7 +78,7 @@ func doesCRExist(kind string, csvs *olm.ClusterServiceVersionList) (olm.ClusterS
// DeleteOperatorService deletes an Operator backed service
// TODO: make it unlink the service from component as a part of
// https://github.com/openshift/odo/issues/3563
func DeleteOperatorService(client *kclient.Client, serviceName string) error {
func DeleteOperatorService(client kclient.ClientInterface, serviceName string) error {
kind, name, err := SplitServiceKindName(serviceName)
if err != nil {
return errors.Wrapf(err, "Refer %q to see list of running services", serviceName)
@@ -114,7 +114,7 @@ func DeleteOperatorService(client *kclient.Client, serviceName string) error {
// ListOperatorServices lists all operator backed services.
// It returns list of services, slice of services that it failed (if any) to list and error (if any)
func ListOperatorServices(client *kclient.Client) ([]unstructured.Unstructured, []string, error) {
func ListOperatorServices(client kclient.ClientInterface) ([]unstructured.Unstructured, []string, error) {
klog.V(4).Info("Getting list of services")
// First let's get the list of all the operators in the namespace
@@ -260,7 +260,7 @@ func getAlmExample(almExamples []map[string]interface{}, crd, operator string) (
// GetCRInstances fetches and returns instances of the CR provided in the
// "customResource" field. It also returns error (if any)
func GetCRInstances(client *kclient.Client, customResource *olm.CRDDescription) (*unstructured.UnstructuredList, error) {
func GetCRInstances(client kclient.ClientInterface, customResource *olm.CRDDescription) (*unstructured.UnstructuredList, error) {
klog.V(4).Infof("Getting instances of: %s\n", customResource.Name)
group, version, resource, err := GetGVRFromCR(customResource)
@@ -293,7 +293,7 @@ func IsOperatorServiceNameValid(name string) (string, string, error) {
// '<service-kind>/<service-name>'. For example: EtcdCluster/example.
// It doesn't bother about application since
// https://github.com/openshift/odo/issues/2801 is blocked
func OperatorSvcExists(client *kclient.Client, serviceName string) (bool, error) {
func OperatorSvcExists(client kclient.ClientInterface, serviceName string) (bool, error) {
kind, name, err := SplitServiceKindName(serviceName)
if err != nil {
return false, errors.Wrapf(err, "Refer %q to see list of running services", serviceName)
@@ -692,7 +692,7 @@ func (d *DynamicCRD) AddComponentLabelsToCRD(labels map[string]string) {
}
// PushServices updates service(s) from Kubernetes Inlined component in a devfile by creating new ones or removing old ones
func PushServices(client *kclient.Client, k8sComponents []devfile.Component, labels map[string]string, context string) error {
func PushServices(client kclient.ClientInterface, k8sComponents []devfile.Component, labels map[string]string, context string) error {
// check csv support before proceeding
csvSupported, err := IsCSVSupported()
@@ -788,7 +788,7 @@ type DeployedInfo struct {
isLinkResource bool
}
func ListDeployedServices(client *kclient.Client, labels map[string]string) (map[string]DeployedInfo, error) {
func ListDeployedServices(client kclient.ClientInterface, labels map[string]string) (map[string]DeployedInfo, error) {
deployed := map[string]DeployedInfo{}
deployedServices, _, err := ListOperatorServices(client)
@@ -814,7 +814,7 @@ func ListDeployedServices(client *kclient.Client, labels map[string]string) (map
// UpdateServicesWithOwnerReferences adds an owner reference to an inlined Kubernetes resource (except service binding objects)
// if not already present in the list of owner references
func UpdateServicesWithOwnerReferences(client *kclient.Client, k8sComponents []devfile.Component, ownerReference metav1.OwnerReference, context string) error {
func UpdateServicesWithOwnerReferences(client kclient.ClientInterface, k8sComponents []devfile.Component, ownerReference metav1.OwnerReference, context string) error {
csvSupport, err := client.IsCSVSupported()
if err != nil {
return err
@@ -910,7 +910,7 @@ func isLinkResource(kind string) bool {
// createOperatorService creates the given operator on the cluster
// it returns the CR,Kind and errors
func createOperatorService(client *kclient.Client, d *DynamicCRD, labels map[string]string, ownerReferences []metav1.OwnerReference) (string, string, error) {
func createOperatorService(client kclient.ClientInterface, d *DynamicCRD, labels map[string]string, ownerReferences []metav1.OwnerReference) (string, string, error) {
cr, csv, err := GetCSV(client, d.OriginalCRD)
if err != nil {
return "", "", err

View File

@@ -1,38 +1,39 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: storage.go
// Source: pkg/storage/storage.go
// Package storage is a generated GoMock package.
package storage
import (
gomock "github.com/golang/mock/gomock"
reflect "reflect"
gomock "github.com/golang/mock/gomock"
)
// MockClient is a mock of Client interface
// MockClient is a mock of Client interface.
type MockClient struct {
ctrl *gomock.Controller
recorder *MockClientMockRecorder
}
// MockClientMockRecorder is the mock recorder for MockClient
// MockClientMockRecorder is the mock recorder for MockClient.
type MockClientMockRecorder struct {
mock *MockClient
}
// NewMockClient creates a new mock instance
// NewMockClient creates a new mock instance.
func NewMockClient(ctrl *gomock.Controller) *MockClient {
mock := &MockClient{ctrl: ctrl}
mock.recorder = &MockClientMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockClient) EXPECT() *MockClientMockRecorder {
return m.recorder
}
// Create mocks base method
// Create mocks base method.
func (m *MockClient) Create(arg0 Storage) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Create", arg0)
@@ -40,13 +41,13 @@ func (m *MockClient) Create(arg0 Storage) error {
return ret0
}
// Create indicates an expected call of Create
// Create indicates an expected call of Create.
func (mr *MockClientMockRecorder) Create(arg0 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*MockClient)(nil).Create), arg0)
}
// Delete mocks base method
// Delete mocks base method.
func (m *MockClient) Delete(arg0 string) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Delete", arg0)
@@ -54,28 +55,13 @@ func (m *MockClient) Delete(arg0 string) error {
return ret0
}
// Delete indicates an expected call of Delete
// Delete indicates an expected call of Delete.
func (mr *MockClientMockRecorder) Delete(arg0 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockClient)(nil).Delete), arg0)
}
// ListFromCluster mocks base method
func (m *MockClient) ListFromCluster() (StorageList, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ListFromCluster")
ret0, _ := ret[0].(StorageList)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// ListFromCluster indicates an expected call of ListFromCluster
func (mr *MockClientMockRecorder) ListFromCluster() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListFromCluster", reflect.TypeOf((*MockClient)(nil).ListFromCluster))
}
// List mocks base method
// List mocks base method.
func (m *MockClient) List() (StorageList, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "List")
@@ -84,8 +70,23 @@ func (m *MockClient) List() (StorageList, error) {
return ret0, ret1
}
// List indicates an expected call of List
// List indicates an expected call of List.
func (mr *MockClientMockRecorder) List() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockClient)(nil).List))
}
// ListFromCluster mocks base method.
func (m *MockClient) ListFromCluster() (StorageList, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ListFromCluster")
ret0, _ := ret[0].(StorageList)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// ListFromCluster indicates an expected call of ListFromCluster.
func (mr *MockClientMockRecorder) ListFromCluster() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListFromCluster", reflect.TypeOf((*MockClient)(nil).ListFromCluster))
}

View File

@@ -1,39 +1,40 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: url.go
// Source: pkg/url/url.go
// Package url is a generated GoMock package.
package url
import (
reflect "reflect"
gomock "github.com/golang/mock/gomock"
localConfigProvider "github.com/openshift/odo/pkg/localConfigProvider"
reflect "reflect"
)
// MockClient is a mock of Client interface
// MockClient is a mock of Client interface.
type MockClient struct {
ctrl *gomock.Controller
recorder *MockClientMockRecorder
}
// MockClientMockRecorder is the mock recorder for MockClient
// MockClientMockRecorder is the mock recorder for MockClient.
type MockClientMockRecorder struct {
mock *MockClient
}
// NewMockClient creates a new mock instance
// NewMockClient creates a new mock instance.
func NewMockClient(ctrl *gomock.Controller) *MockClient {
mock := &MockClient{ctrl: ctrl}
mock.recorder = &MockClientMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockClient) EXPECT() *MockClientMockRecorder {
return m.recorder
}
// Create mocks base method
// Create mocks base method.
func (m *MockClient) Create(url URL) (string, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Create", url)
@@ -42,13 +43,13 @@ func (m *MockClient) Create(url URL) (string, error) {
return ret0, ret1
}
// Create indicates an expected call of Create
// Create indicates an expected call of Create.
func (mr *MockClientMockRecorder) Create(url interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*MockClient)(nil).Create), url)
}
// Delete mocks base method
// Delete mocks base method.
func (m *MockClient) Delete(arg0 string, arg1 localConfigProvider.URLKind) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Delete", arg0, arg1)
@@ -56,28 +57,13 @@ func (m *MockClient) Delete(arg0 string, arg1 localConfigProvider.URLKind) error
return ret0
}
// Delete indicates an expected call of Delete
// Delete indicates an expected call of Delete.
func (mr *MockClientMockRecorder) Delete(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockClient)(nil).Delete), arg0, arg1)
}
// ListFromCluster mocks base method
func (m *MockClient) ListFromCluster() (URLList, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ListFromCluster")
ret0, _ := ret[0].(URLList)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// ListFromCluster indicates an expected call of ListFromCluster
func (mr *MockClientMockRecorder) ListFromCluster() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListFromCluster", reflect.TypeOf((*MockClient)(nil).ListFromCluster))
}
// List mocks base method
// List mocks base method.
func (m *MockClient) List() (URLList, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "List")
@@ -86,8 +72,23 @@ func (m *MockClient) List() (URLList, error) {
return ret0, ret1
}
// List indicates an expected call of List
// List indicates an expected call of List.
func (mr *MockClientMockRecorder) List() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockClient)(nil).List))
}
// ListFromCluster mocks base method.
func (m *MockClient) ListFromCluster() (URLList, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ListFromCluster")
ret0, _ := ret[0].(URLList)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// ListFromCluster indicates an expected call of ListFromCluster.
func (mr *MockClientMockRecorder) ListFromCluster() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListFromCluster", reflect.TypeOf((*MockClient)(nil).ListFromCluster))
}

View File

@@ -23,7 +23,7 @@ const (
)
// StartURLHttpRequestStatusWatchForK8S begins testing URLs for responses, outputting the result to console
func StartURLHttpRequestStatusWatchForK8S(occlient *occlient.Client, client *kclient.Client, localConfigProvider *localConfigProvider.LocalConfigProvider, loggingClient machineoutput.MachineEventLoggingClient) {
func StartURLHttpRequestStatusWatchForK8S(occlient *occlient.Client, client kclient.ClientInterface, localConfigProvider *localConfigProvider.LocalConfigProvider, loggingClient machineoutput.MachineEventLoggingClient) {
// This is a non-blocking function so that other status watchers may start as needed
go func() {
@@ -63,7 +63,7 @@ func startURLTester(urlsToTest [][]statusURL, loggingClient machineoutput.Machin
}
}
func getURLsForKubernetes(oclient *occlient.Client, client *kclient.Client, localConfig localConfigProvider.LocalConfigProvider, ignoreUnpushed bool) ([]statusURL, error) {
func getURLsForKubernetes(oclient *occlient.Client, client kclient.ClientInterface, localConfig localConfigProvider.LocalConfigProvider, ignoreUnpushed bool) ([]statusURL, error) {
componentName := localConfig.GetName()
routesSupported := false

20
scripts/mockgen.sh Executable file
View File

@@ -0,0 +1,20 @@
#!/usr/bin/env bash
# Use this script to regererate generated mock files
# after changing signatures of interfaces in these packages
mockgen -source=pkg/kclient/interface.go \
-package kclient \
-destination pkg/kclient/mock_Client.go
mockgen -source=pkg/localConfigProvider/localConfigProvider.go \
-package localConfigProvider \
-destination pkg/localConfigProvider/mock_localConfigProvider.go
mockgen -source=pkg/storage/storage.go \
-package storage \
-destination pkg/storage/mock_Client.go
mockgen -source=pkg/url/url.go \
-package url \
-destination pkg/url/mock_Client.go