mirror of https://github.com/kubernetes/kops.git
Move FileAssets into the NodeupAuxConfig
This commit is contained in:
parent
4bf9150ab6
commit
59c8826b17
|
|
@ -23,7 +23,6 @@ import (
|
||||||
|
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/kops/pkg/apis/kops"
|
|
||||||
"k8s.io/kops/upup/pkg/fi"
|
"k8s.io/kops/upup/pkg/fi"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -37,17 +36,6 @@ func b(v bool) *bool {
|
||||||
return fi.Bool(v)
|
return fi.Bool(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
// containsRole checks if a collection roles contains role v
|
|
||||||
func containsRole(v kops.InstanceGroupRole, list []kops.InstanceGroupRole) bool {
|
|
||||||
for _, x := range list {
|
|
||||||
if v == x {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// buildDockerEnvironmentVars just converts a series of keypairs to docker environment variables switches
|
// buildDockerEnvironmentVars just converts a series of keypairs to docker environment variables switches
|
||||||
func buildDockerEnvironmentVars(env map[string]string) []string {
|
func buildDockerEnvironmentVars(env map[string]string) []string {
|
||||||
var list []string
|
var list []string
|
||||||
|
|
|
||||||
|
|
@ -45,28 +45,12 @@ func (f *FileAssetsBuilder) Build(c *fi.ModelBuilderContext) error {
|
||||||
Mode: s("0755"),
|
Mode: s("0755"),
|
||||||
})
|
})
|
||||||
|
|
||||||
// do we have any instanceGroup file assets
|
return f.buildFileAssets(c, f.NodeupAuxConfig.FileAssets, tracker)
|
||||||
if f.InstanceGroup.Spec.FileAssets != nil {
|
|
||||||
if err := f.buildFileAssets(c, f.InstanceGroup.Spec.FileAssets, tracker); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if f.Cluster.Spec.FileAssets != nil {
|
|
||||||
if err := f.buildFileAssets(c, f.Cluster.Spec.FileAssets, tracker); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// buildFileAssets is responsible for rendering the file assets to disk
|
// buildFileAssets is responsible for rendering the file assets to disk
|
||||||
func (f *FileAssetsBuilder) buildFileAssets(c *fi.ModelBuilderContext, assets []kops.FileAssetSpec, tracker map[string]bool) error {
|
func (f *FileAssetsBuilder) buildFileAssets(c *fi.ModelBuilderContext, assets []kops.FileAssetSpec, tracker map[string]bool) error {
|
||||||
for _, asset := range assets {
|
for _, asset := range assets {
|
||||||
// @check if the file asset applies to us. If no roles applied we assume its applied to all roles
|
|
||||||
if len(asset.Roles) > 0 && !containsRole(f.NodeupConfig.InstanceGroupRole, asset.Roles) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
// @check if e have a path and if not use the default path
|
// @check if e have a path and if not use the default path
|
||||||
assetPath := asset.Path
|
assetPath := asset.Path
|
||||||
if assetPath == "" {
|
if assetPath == "" {
|
||||||
|
|
|
||||||
|
|
@ -73,6 +73,8 @@ type Config struct {
|
||||||
|
|
||||||
// AuxConfig is the configuration for the nodeup binary that might be too big to fit in userdata.
|
// AuxConfig is the configuration for the nodeup binary that might be too big to fit in userdata.
|
||||||
type AuxConfig struct {
|
type AuxConfig struct {
|
||||||
|
// FileAssets are a collection of file assets for this instance group.
|
||||||
|
FileAssets []kops.FileAssetSpec `json:",omitempty"`
|
||||||
// Hooks are for custom actions, for example on first installation.
|
// Hooks are for custom actions, for example on first installation.
|
||||||
Hooks [][]kops.HookSpec
|
Hooks [][]kops.HookSpec
|
||||||
}
|
}
|
||||||
|
|
@ -119,7 +121,8 @@ func NewConfig(cluster *kops.Cluster, instanceGroup *kops.InstanceGroup) (*Confi
|
||||||
igHooks := filterHooks(instanceGroup.Spec.Hooks, instanceGroup.Spec.Role)
|
igHooks := filterHooks(instanceGroup.Spec.Hooks, instanceGroup.Spec.Role)
|
||||||
|
|
||||||
auxConfig := AuxConfig{
|
auxConfig := AuxConfig{
|
||||||
Hooks: [][]kops.HookSpec{igHooks, clusterHooks},
|
FileAssets: append(filterFileAssets(instanceGroup.Spec.FileAssets, role), filterFileAssets(cluster.Spec.FileAssets, role)...),
|
||||||
|
Hooks: [][]kops.HookSpec{igHooks, clusterHooks},
|
||||||
}
|
}
|
||||||
|
|
||||||
if isMaster {
|
if isMaster {
|
||||||
|
|
@ -156,6 +159,18 @@ func NewConfig(cluster *kops.Cluster, instanceGroup *kops.InstanceGroup) (*Confi
|
||||||
return &config, &auxConfig
|
return &config, &auxConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func filterFileAssets(f []kops.FileAssetSpec, role kops.InstanceGroupRole) []kops.FileAssetSpec {
|
||||||
|
var fileAssets []kops.FileAssetSpec
|
||||||
|
for _, fileAsset := range f {
|
||||||
|
if len(fileAsset.Roles) > 0 && !containsRole(role, fileAsset.Roles) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
fileAsset.Roles = nil
|
||||||
|
fileAssets = append(fileAssets, fileAsset)
|
||||||
|
}
|
||||||
|
return fileAssets
|
||||||
|
}
|
||||||
|
|
||||||
func filterHooks(h []kops.HookSpec, role kops.InstanceGroupRole) []kops.HookSpec {
|
func filterHooks(h []kops.HookSpec, role kops.InstanceGroupRole) []kops.HookSpec {
|
||||||
var hooks []kops.HookSpec
|
var hooks []kops.HookSpec
|
||||||
for _, hook := range h {
|
for _, hook := range h {
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,6 @@ package model
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"compress/gzip"
|
"compress/gzip"
|
||||||
"crypto/sha1"
|
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
@ -371,14 +370,6 @@ func (b *BootstrapScript) Run(c *fi.Context) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fileAssets, err := b.getRelevantFileAssets(cs.FileAssets, b.ig.Spec.Role)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
if len(fileAssets) > 0 {
|
|
||||||
spec["fileAssets"] = fileAssets
|
|
||||||
}
|
|
||||||
|
|
||||||
content, err := yaml.Marshal(spec)
|
content, err := yaml.Marshal(spec)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("error converting cluster spec to yaml for inclusion within bootstrap script: %v", err)
|
return "", fmt.Errorf("error converting cluster spec to yaml for inclusion within bootstrap script: %v", err)
|
||||||
|
|
@ -389,14 +380,6 @@ func (b *BootstrapScript) Run(c *fi.Context) error {
|
||||||
"IGSpec": func() (string, error) {
|
"IGSpec": func() (string, error) {
|
||||||
spec := make(map[string]interface{})
|
spec := make(map[string]interface{})
|
||||||
|
|
||||||
fileAssets, err := b.getRelevantFileAssets(b.ig.Spec.FileAssets, b.ig.Spec.Role)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
if len(fileAssets) > 0 {
|
|
||||||
spec["fileAssets"] = fileAssets
|
|
||||||
}
|
|
||||||
|
|
||||||
content, err := yaml.Marshal(spec)
|
content, err := yaml.Marshal(spec)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("error converting instancegroup spec to yaml for inclusion within bootstrap script: %v", err)
|
return "", fmt.Errorf("error converting instancegroup spec to yaml for inclusion within bootstrap script: %v", err)
|
||||||
|
|
@ -433,53 +416,6 @@ func (b *BootstrapScript) Run(c *fi.Context) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// getRelevantFileAssets returns a list of file assets to be applied to the
|
|
||||||
// instance group, with the Content fingerprinted to reduce size
|
|
||||||
func (b *BootstrapScript) getRelevantFileAssets(allFileAssets []kops.FileAssetSpec, role kops.InstanceGroupRole) ([]kops.FileAssetSpec, error) {
|
|
||||||
relevantFileAssets := []kops.FileAssetSpec{}
|
|
||||||
for _, fileAsset := range allFileAssets {
|
|
||||||
if len(fileAsset.Roles) == 0 {
|
|
||||||
relevantFileAssets = append(relevantFileAssets, fileAsset)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
for _, fileAssetRole := range fileAsset.Roles {
|
|
||||||
if role == fileAssetRole {
|
|
||||||
relevantFileAssets = append(relevantFileAssets, fileAsset)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fileAssets := []kops.FileAssetSpec{}
|
|
||||||
if len(relevantFileAssets) > 0 {
|
|
||||||
for _, fileAsset := range relevantFileAssets {
|
|
||||||
if fileAsset.Content != "" {
|
|
||||||
contentFingerprint, err := b.computeFingerprint(fileAsset.Content)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
fileAsset.Content = contentFingerprint + " (fingerprint)"
|
|
||||||
}
|
|
||||||
|
|
||||||
fileAsset.Roles = nil
|
|
||||||
fileAssets = append(fileAssets, fileAsset)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return fileAssets, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// computeFingerprint takes a string and returns a base64 encoded fingerprint
|
|
||||||
func (b *BootstrapScript) computeFingerprint(content string) (string, error) {
|
|
||||||
hasher := sha1.New()
|
|
||||||
|
|
||||||
if _, err := hasher.Write([]byte(content)); err != nil {
|
|
||||||
return "", fmt.Errorf("error computing fingerprint hash: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return base64.StdEncoding.EncodeToString(hasher.Sum(nil)), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (b *BootstrapScript) createProxyEnv(ps *kops.EgressProxySpec) string {
|
func (b *BootstrapScript) createProxyEnv(ps *kops.EgressProxySpec) string {
|
||||||
var buffer bytes.Buffer
|
var buffer bytes.Buffer
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue