From 6f1b6b532f8f4a0ecd8a8332f5ec54a5e4d0af7c Mon Sep 17 00:00:00 2001 From: Markus Rudy Date: Fri, 8 Dec 2023 18:38:00 +0100 Subject: [PATCH] upgrade-agent: allow more than one KubernetesComponent --- upgrade-agent/internal/server/server.go | 25 ++++-- upgrade-agent/internal/server/server_test.go | 55 ++++++++++++- upgrade-agent/upgradeproto/BUILD.bazel | 2 + upgrade-agent/upgradeproto/upgrade.pb.go | 83 ++++++++++++-------- upgrade-agent/upgradeproto/upgrade.proto | 4 + 5 files changed, 126 insertions(+), 43 deletions(-) diff --git a/upgrade-agent/internal/server/server.go b/upgrade-agent/internal/server/server.go index f85c18bed..d8d02ad00 100644 --- a/upgrade-agent/internal/server/server.go +++ b/upgrade-agent/internal/server/server.go @@ -132,13 +132,24 @@ func prepareUpdate(ctx context.Context, installer osInstaller, updateRequest *up return err } - // download & install the kubeadm binary - return installer.Install(ctx, &components.Component{ - Url: updateRequest.KubeadmUrl, - Hash: updateRequest.KubeadmHash, - InstallPath: constants.KubeadmPath, - Extract: false, - }) + var cs components.Components + if len(updateRequest.KubeadmUrl) > 0 { + cs = append(cs, &components.Component{ + Url: updateRequest.KubeadmUrl, + Hash: updateRequest.KubeadmHash, + InstallPath: constants.KubeadmPath, + Extract: false, + }) + } + cs = append(cs, updateRequest.KubernetesComponents...) + + // Download & install the Kubernetes components. + for _, c := range cs { + if err := installer.Install(ctx, c); err != nil { + return fmt.Errorf("installing Kubernetes component %q: %w", c.Url, err) + } + } + return nil } // verifyVersion verifies the provided Kubernetes version. diff --git a/upgrade-agent/internal/server/server_test.go b/upgrade-agent/internal/server/server_test.go index f441900cb..a418575a2 100644 --- a/upgrade-agent/internal/server/server_test.go +++ b/upgrade-agent/internal/server/server_test.go @@ -56,9 +56,38 @@ func TestVersionVerifier(t *testing.T) { } func TestPrepareUpdate(t *testing.T) { - validUpdateRequest := &upgradeproto.ExecuteUpdateRequest{ + invalidUpgradeRequest := &upgradeproto.ExecuteUpdateRequest{ + WantedKubernetesVersion: "1337", + } + slimUpdateRequest := &upgradeproto.ExecuteUpdateRequest{ WantedKubernetesVersion: "v1.1.1", } + oldStyleUpdateRequest := &upgradeproto.ExecuteUpdateRequest{ + WantedKubernetesVersion: "v1.1.1", + KubeadmUrl: "http://example.com/kubeadm", + KubeadmHash: "sha256:foo", + } + newStyleUpdateRequest := &upgradeproto.ExecuteUpdateRequest{ + WantedKubernetesVersion: "v1.1.1", + KubernetesComponents: []*components.Component{ + { + Url: "http://example.com/kubeadm", + Hash: "sha256:foo", + InstallPath: "/tmp/kubeadm", + }, + }, + } + combinedStyleUpdateRequest := &upgradeproto.ExecuteUpdateRequest{ + WantedKubernetesVersion: "v1.1.1", + KubeadmUrl: "http://example.com/kubeadm", + KubeadmHash: "sha256:foo", + KubernetesComponents: []*components.Component{ + { + Url: "data:application/octet-stream,foo", + InstallPath: "/tmp/foo", + }, + }, + } testCases := map[string]struct { installer osInstaller updateRequest *upgradeproto.ExecuteUpdateRequest @@ -66,16 +95,34 @@ func TestPrepareUpdate(t *testing.T) { }{ "works": { installer: stubOsInstaller{}, - updateRequest: validUpdateRequest, + updateRequest: slimUpdateRequest, }, "invalid version string": { installer: stubOsInstaller{}, - updateRequest: &upgradeproto.ExecuteUpdateRequest{WantedKubernetesVersion: "1337"}, + updateRequest: invalidUpgradeRequest, wantErr: true, }, "install error": { installer: stubOsInstaller{InstallErr: fmt.Errorf("install error")}, - updateRequest: validUpdateRequest, + updateRequest: oldStyleUpdateRequest, + wantErr: true, + }, + "new style works": { + installer: stubOsInstaller{}, + updateRequest: newStyleUpdateRequest, + }, + "new style install error": { + installer: stubOsInstaller{InstallErr: fmt.Errorf("install error")}, + updateRequest: newStyleUpdateRequest, + wantErr: true, + }, + "combined style works": { + installer: stubOsInstaller{}, + updateRequest: combinedStyleUpdateRequest, + }, + "combined style install error": { + installer: stubOsInstaller{InstallErr: fmt.Errorf("install error")}, + updateRequest: combinedStyleUpdateRequest, wantErr: true, }, } diff --git a/upgrade-agent/upgradeproto/BUILD.bazel b/upgrade-agent/upgradeproto/BUILD.bazel index 2a7ee6b4e..d105ca14e 100644 --- a/upgrade-agent/upgradeproto/BUILD.bazel +++ b/upgrade-agent/upgradeproto/BUILD.bazel @@ -7,6 +7,7 @@ proto_library( name = "upgradeproto_proto", srcs = ["upgrade.proto"], visibility = ["//visibility:public"], + deps = ["//internal/versions/components:components_proto"], ) go_proto_library( @@ -16,6 +17,7 @@ go_proto_library( importpath = "github.com/edgelesssys/constellation/v2/upgrade-agent/upgradeproto", proto = ":upgradeproto_proto", visibility = ["//visibility:public"], + deps = ["//internal/versions/components"], ) go_library( diff --git a/upgrade-agent/upgradeproto/upgrade.pb.go b/upgrade-agent/upgradeproto/upgrade.pb.go index 67ac66908..ca7ba233e 100644 --- a/upgrade-agent/upgradeproto/upgrade.pb.go +++ b/upgrade-agent/upgradeproto/upgrade.pb.go @@ -8,6 +8,7 @@ package upgradeproto import ( context "context" + components "github.com/edgelesssys/constellation/v2/internal/versions/components" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -29,9 +30,10 @@ type ExecuteUpdateRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - KubeadmUrl string `protobuf:"bytes,1,opt,name=kubeadm_url,json=kubeadmUrl,proto3" json:"kubeadm_url,omitempty"` - KubeadmHash string `protobuf:"bytes,2,opt,name=kubeadm_hash,json=kubeadmHash,proto3" json:"kubeadm_hash,omitempty"` - WantedKubernetesVersion string `protobuf:"bytes,3,opt,name=wanted_kubernetes_version,json=wantedKubernetesVersion,proto3" json:"wanted_kubernetes_version,omitempty"` + KubeadmUrl string `protobuf:"bytes,1,opt,name=kubeadm_url,json=kubeadmUrl,proto3" json:"kubeadm_url,omitempty"` + KubeadmHash string `protobuf:"bytes,2,opt,name=kubeadm_hash,json=kubeadmHash,proto3" json:"kubeadm_hash,omitempty"` + WantedKubernetesVersion string `protobuf:"bytes,3,opt,name=wanted_kubernetes_version,json=wantedKubernetesVersion,proto3" json:"wanted_kubernetes_version,omitempty"` + KubernetesComponents []*components.Component `protobuf:"bytes,4,rep,name=kubernetes_components,json=kubernetesComponents,proto3" json:"kubernetes_components,omitempty"` } func (x *ExecuteUpdateRequest) Reset() { @@ -87,6 +89,13 @@ func (x *ExecuteUpdateRequest) GetWantedKubernetesVersion() string { return "" } +func (x *ExecuteUpdateRequest) GetKubernetesComponents() []*components.Component { + if x != nil { + return x.KubernetesComponents + } + return nil +} + type ExecuteUpdateResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -131,28 +140,36 @@ var file_upgrade_agent_upgradeproto_upgrade_proto_rawDesc = []byte{ 0x0a, 0x28, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x75, 0x70, 0x67, 0x72, - 0x61, 0x64, 0x65, 0x22, 0x96, 0x01, 0x0a, 0x14, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, - 0x6b, 0x75, 0x62, 0x65, 0x61, 0x64, 0x6d, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x64, 0x6d, 0x55, 0x72, 0x6c, 0x12, 0x21, 0x0a, - 0x0c, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x64, 0x6d, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x64, 0x6d, 0x48, 0x61, 0x73, 0x68, - 0x12, 0x3a, 0x0a, 0x19, 0x77, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x72, - 0x6e, 0x65, 0x74, 0x65, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x17, 0x77, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x4b, 0x75, 0x62, 0x65, 0x72, - 0x6e, 0x65, 0x74, 0x65, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x17, 0x0a, 0x15, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x58, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, - 0x4e, 0x0a, 0x0d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x12, 0x1d, 0x2e, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, - 0x44, 0x5a, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x64, - 0x67, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x73, 0x79, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, - 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x32, 0x2f, 0x75, 0x70, 0x67, 0x72, 0x61, - 0x64, 0x65, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x64, 0x65, 0x1a, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0xe2, 0x01, 0x0a, 0x14, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6b, + 0x75, 0x62, 0x65, 0x61, 0x64, 0x6d, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x64, 0x6d, 0x55, 0x72, 0x6c, 0x12, 0x21, 0x0a, 0x0c, + 0x6b, 0x75, 0x62, 0x65, 0x61, 0x64, 0x6d, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x6b, 0x75, 0x62, 0x65, 0x61, 0x64, 0x6d, 0x48, 0x61, 0x73, 0x68, 0x12, + 0x3a, 0x0a, 0x19, 0x77, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, + 0x65, 0x74, 0x65, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x17, 0x77, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, + 0x65, 0x74, 0x65, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x15, 0x6b, + 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x52, 0x14, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x32, 0x58, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x4e, 0x0a, 0x0d, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x75, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x75, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x44, 0x5a, 0x42, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x64, 0x67, 0x65, 0x6c, 0x65, 0x73, + 0x73, 0x73, 0x79, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2f, 0x76, 0x32, 0x2f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x2d, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -171,15 +188,17 @@ var file_upgrade_agent_upgradeproto_upgrade_proto_msgTypes = make([]protoimpl.Me var file_upgrade_agent_upgradeproto_upgrade_proto_goTypes = []interface{}{ (*ExecuteUpdateRequest)(nil), // 0: upgrade.ExecuteUpdateRequest (*ExecuteUpdateResponse)(nil), // 1: upgrade.ExecuteUpdateResponse + (*components.Component)(nil), // 2: components.Component } var file_upgrade_agent_upgradeproto_upgrade_proto_depIdxs = []int32{ - 0, // 0: upgrade.Update.ExecuteUpdate:input_type -> upgrade.ExecuteUpdateRequest - 1, // 1: upgrade.Update.ExecuteUpdate:output_type -> upgrade.ExecuteUpdateResponse - 1, // [1:2] is the sub-list for method output_type - 0, // [0:1] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name + 2, // 0: upgrade.ExecuteUpdateRequest.kubernetes_components:type_name -> components.Component + 0, // 1: upgrade.Update.ExecuteUpdate:input_type -> upgrade.ExecuteUpdateRequest + 1, // 2: upgrade.Update.ExecuteUpdate:output_type -> upgrade.ExecuteUpdateResponse + 2, // [2:3] is the sub-list for method output_type + 1, // [1:2] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name } func init() { file_upgrade_agent_upgradeproto_upgrade_proto_init() } diff --git a/upgrade-agent/upgradeproto/upgrade.proto b/upgrade-agent/upgradeproto/upgrade.proto index 3236effdd..cc15aaf7a 100644 --- a/upgrade-agent/upgradeproto/upgrade.proto +++ b/upgrade-agent/upgradeproto/upgrade.proto @@ -2,6 +2,8 @@ syntax = "proto3"; package upgrade; +import "internal/versions/components/components.proto"; + option go_package = "github.com/edgelesssys/constellation/v2/upgrade-agent/upgradeproto"; service Update { @@ -12,6 +14,8 @@ message ExecuteUpdateRequest { string kubeadm_url = 1; string kubeadm_hash = 2; string wanted_kubernetes_version = 3; + + repeated components.Component kubernetes_components = 4; } message ExecuteUpdateResponse {}