Skip to content

Commit

Permalink
Use new-style client for image translation CRDs
Browse files Browse the repository at this point in the history
  • Loading branch information
Ivan Shvedunov committed Jun 7, 2018
1 parent 3829b3a commit c793f9c
Show file tree
Hide file tree
Showing 10 changed files with 168 additions and 111 deletions.
7 changes: 4 additions & 3 deletions cmd/virtlet/virtlet.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (

"github.com/golang/glog"
flag "github.com/spf13/pflag"
"k8s.io/client-go/tools/clientcmd"

"github.com/Mirantis/virtlet/pkg/api/virtlet.k8s/v1"
"github.com/Mirantis/virtlet/pkg/cni"
Expand Down Expand Up @@ -52,8 +53,8 @@ func configWithDefaults(cfg *v1.VirtletConfig) *v1.VirtletConfig {
return r
}

func runVirtlet(config *v1.VirtletConfig) {
manager := manager.NewVirtletManager(config, nil)
func runVirtlet(config *v1.VirtletConfig, clientCfg clientcmd.ClientConfig) {
manager := manager.NewVirtletManager(config, nil, clientCfg)
if err := manager.Run(); err != nil {
glog.Errorf("Error: %v", err)
os.Exit(1)
Expand Down Expand Up @@ -141,6 +142,6 @@ func main() {
default:
localConfig = configWithDefaults(localConfig)
startTapManagerProcess(localConfig)
runVirtlet(localConfig)
runVirtlet(localConfig, clientCfg)
}
}
28 changes: 0 additions & 28 deletions pkg/api/virtlet.k8s/v1/client.go

This file was deleted.

2 changes: 1 addition & 1 deletion pkg/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@ import (

virtletclient "github.com/Mirantis/virtlet/pkg/client/clientset/versioned"
flag "github.com/spf13/pflag"
meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"

virtlet_v1 "github.com/Mirantis/virtlet/pkg/api/virtlet.k8s/v1"
meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

const (
Expand Down
60 changes: 34 additions & 26 deletions pkg/imagetranslation/crd_source.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,54 +20,62 @@ import (
"context"
"fmt"

"github.com/Mirantis/virtlet/pkg/api/virtlet.k8s/v1"
"github.com/Mirantis/virtlet/pkg/utils"
"k8s.io/client-go/tools/clientcmd"

virtletclient "github.com/Mirantis/virtlet/pkg/client/clientset/versioned"
meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

type crdConfigSource struct {
namespace string
clientCfg clientcmd.ClientConfig
virtletClient virtletclient.Interface
namespace string
}

var _ ConfigSource = crdConfigSource{}
var _ ConfigSource = &crdConfigSource{}

// Configs implements ConfigSource Configs
func (cs crdConfigSource) Configs(ctx context.Context) ([]TranslationConfig, error) {
cfg, err := utils.GetK8sClientConfig("")
if err != nil {
return nil, err
func (cs *crdConfigSource) setup() error {
if cs.virtletClient != nil {
return nil
}

if cfg.Host == "" {
return nil, nil
config, err := cs.clientCfg.ClientConfig()
if err != nil {
return err
}

client, err := v1.GetCRDRestClient(cfg)
virtletClient, err := virtletclient.NewForConfig(config)
if err != nil {
return fmt.Errorf("can't create Virtlet api client: %v", err)
}
cs.virtletClient = virtletClient
return nil
}

// Configs implements ConfigSource Configs
func (cs *crdConfigSource) Configs(ctx context.Context) ([]TranslationConfig, error) {
if err := cs.setup(); err != nil {
return nil, err
}
var list v1.VirtletImageMappingList
err = client.Get().
Context(ctx).
Resource("virtletimagemappings").
Namespace(cs.namespace).
Do().Into(&list)

list, err := cs.virtletClient.VirtletV1().VirtletImageMappings(cs.namespace).List(meta_v1.ListOptions{})
if err != nil {
return nil, err
}
result := make([]TranslationConfig, len(list.Items))
for i, v := range list.Items {
result[i] = &v
}

return result, nil
var r []TranslationConfig
for n := range list.Items {
r = append(r, &list.Items[n])
}
return r, nil
}

// Description implements ConfigSource Description
func (cs crdConfigSource) Description() string {
func (cs *crdConfigSource) Description() string {
return fmt.Sprintf("Kubernetes VirtletImageMapping resources in namespace %q", cs.namespace)
}

// NewCRDSource is a factory for CRD-based config source
func NewCRDSource(namespace string) ConfigSource {
return crdConfigSource{namespace: namespace}
func NewCRDSource(namespace string, clientCfg clientcmd.ClientConfig) ConfigSource {
return &crdConfigSource{namespace: namespace, clientCfg: clientCfg}
}
102 changes: 102 additions & 0 deletions pkg/imagetranslation/crd_source_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
/*
Copyright 2018 Mirantis
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 imagetranslation

import (
"context"
"reflect"
"strings"
"testing"

"github.com/ghodss/yaml"
meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"

virtlet_v1 "github.com/Mirantis/virtlet/pkg/api/virtlet.k8s/v1"
"github.com/Mirantis/virtlet/pkg/client/clientset/versioned/fake"
)

func TestCRDConfigSource(t *testing.T) {
srcConfigs := []*virtlet_v1.VirtletImageMapping{
{
ObjectMeta: meta_v1.ObjectMeta{
Name: "mapping1",
Namespace: "foobar",
},
Spec: virtlet_v1.ImageTranslation{
Rules: []virtlet_v1.TranslationRule{
{
Name: "testimage1",
URL: "https://example.com/testimage1.qcow2",
},
},
},
},
{
ObjectMeta: meta_v1.ObjectMeta{
Name: "mapping2",
Namespace: "foobar",
},
Spec: virtlet_v1.ImageTranslation{
Rules: []virtlet_v1.TranslationRule{
{
Name: "testimage2",
URL: "https://example.com/testimage2.qcow2",
},
},
},
},
{
ObjectMeta: meta_v1.ObjectMeta{
Name: "mapping3_skipme",
Namespace: "skipthisns",
},
Spec: virtlet_v1.ImageTranslation{
Rules: []virtlet_v1.TranslationRule{
{
Name: "testimage3_skipme",
URL: "https://example.com/nosuchimage.qcow2",
},
},
},
},
}
clientset := fake.NewSimpleClientset(srcConfigs[0], srcConfigs[1], srcConfigs[2])
cs := NewCRDSource("foobar", nil)
cs.(*crdConfigSource).virtletClient = clientset

desc := cs.Description()
if !strings.Contains(desc, "foobar") {
t.Errorf("Namespace name 'foobar' not in CRD source description: %q", desc)
}

expectedConfigs := []TranslationConfig{srcConfigs[0], srcConfigs[1]}
configs, err := cs.Configs(context.Background())
if err != nil {
t.Fatalf("Configs(): %v", err)
}
if !reflect.DeepEqual(expectedConfigs, configs) {
expected, err := yaml.Marshal(expectedConfigs)
if err != nil {
t.Errorf("Error marshalling yaml: %v", err)
}
actual, err := yaml.Marshal(configs)
if err != nil {
t.Errorf("Error marshalling yaml: %v", err)
}
t.Errorf("Bad config list.\n--- expected configs ---\n%s\n--- actual configs ---\n%s", expected, actual)
}
}
7 changes: 5 additions & 2 deletions pkg/imagetranslation/translator.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import (
"time"

"github.com/golang/glog"
"k8s.io/client-go/tools/clientcmd"

"github.com/Mirantis/virtlet/pkg/api/virtlet.k8s/v1"
"github.com/Mirantis/virtlet/pkg/image"
Expand Down Expand Up @@ -202,9 +203,11 @@ func NewImageNameTranslator(allowRegexp bool) ImageNameTranslator {

// GetDefaultImageTranslator returns a default image translation that
// uses CRDs and a config directory
func GetDefaultImageTranslator(imageTranslationConfigsDir string, allowRegexp bool) image.Translator {
func GetDefaultImageTranslator(imageTranslationConfigsDir string, allowRegexp bool, clientCfg clientcmd.ClientConfig) image.Translator {
var sources []ConfigSource
sources = append(sources, NewCRDSource("kube-system"))
if clientCfg != nil {
sources = append(sources, NewCRDSource("kube-system", clientCfg))
}
if imageTranslationConfigsDir != "" {
sources = append(sources, NewFileConfigSource(imageTranslationConfigsDir))
}
Expand Down
6 changes: 4 additions & 2 deletions pkg/manager/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (
"time"

"github.com/golang/glog"
"k8s.io/client-go/tools/clientcmd"

"github.com/Mirantis/virtlet/pkg/api/virtlet.k8s/v1"
"github.com/Mirantis/virtlet/pkg/image"
Expand All @@ -45,6 +46,7 @@ type VirtletManager struct {
config *v1.VirtletConfig
metadataStore metadata.Store
fdManager tapmanager.FDManager
clientCfg clientcmd.ClientConfig
virtTool *libvirttools.VirtualizationTool
imageStore image.Store
runtimeService *VirtletRuntimeService
Expand All @@ -53,7 +55,7 @@ type VirtletManager struct {
}

// NewVirtletManager creates a new VirtletManager.
func NewVirtletManager(config *v1.VirtletConfig, fdManager tapmanager.FDManager) *VirtletManager {
func NewVirtletManager(config *v1.VirtletConfig, fdManager tapmanager.FDManager, clientCfg clientcmd.ClientConfig) *VirtletManager {
return &VirtletManager{config: config, fdManager: fdManager}
}

Expand Down Expand Up @@ -90,7 +92,7 @@ func (v *VirtletManager) Run() error {
if err = v1.RegisterCustomResourceTypes(); err != nil {
return fmt.Errorf("failed to register image translation CRD: %v", err)
}
translator = imagetranslation.GetDefaultImageTranslator(*v.config.ImageTranslationConfigsDir, *v.config.EnableRegexpImageTranslation)
translator = imagetranslation.GetDefaultImageTranslator(*v.config.ImageTranslationConfigsDir, *v.config.EnableRegexpImageTranslation, v.clientCfg)
} else {
translator = imagetranslation.GetEmptyImageTranslator()
}
Expand Down
18 changes: 0 additions & 18 deletions pkg/utils/k8s_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,6 @@ import (
"strings"

"github.com/spf13/pflag"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/runtime/serializer"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
Expand Down Expand Up @@ -54,21 +51,6 @@ func GetK8sClientset(config *rest.Config) (*kubernetes.Clientset, error) {
return kubernetes.NewForConfig(config)
}

// GetK8sRestClient returns k8s ReST client that for the giver API group-version/subset
func GetK8sRestClient(cfg *rest.Config, scheme *runtime.Scheme, groupVersion *schema.GroupVersion) (*rest.RESTClient, error) {
config := *cfg
config.GroupVersion = groupVersion
config.APIPath = "/apis"
config.ContentType = runtime.ContentTypeJSON
config.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: serializer.NewCodecFactory(scheme)}

client, err := rest.RESTClientFor(&config)
if err != nil {
return nil, err
}
return client, nil
}

// wordSepNormalizeFunc change "_" to "-" in the flags.
func wordSepNormalizeFunc(f *pflag.FlagSet, name string) pflag.NormalizedName {
if strings.Contains(name, "_") {
Expand Down
Loading

0 comments on commit c793f9c

Please sign in to comment.