From 5f920fe9bee2f410f182add878b9e40b1086e29f Mon Sep 17 00:00:00 2001 From: Kostiantyn Kalynovskyi Date: Thu, 30 Apr 2020 00:35:33 -0500 Subject: [PATCH] Skip variables substitution in clusterctl integration This commit overrides default components interface behavior by allowing to inject SkipVariables parameter, see L#37 at components_client.go. To do this, we pass new Repository Client interface which is built on top of the clusterctl implementation with one simple injection of SkipVariables Please see related issue for more details Relates-To: #201 Closes: #201 Change-Id: If068caa8308e39c9ee23d07f189bad26be04d5cf --- go.mod | 2 +- go.sum | 32 +++---- pkg/clusterctl/client/client.go | 9 +- pkg/clusterctl/client/factory.go | 24 +++-- pkg/clusterctl/client/factory_test.go | 96 ++++++++++++++++--- pkg/clusterctl/cmd/command.go | 20 ++-- .../implementations/components_client.go | 41 ++++++++ .../implementations/repository_client.go | 43 +++++++++ .../implementations/repository_client_test.go | 84 ++++++++++++++++ .../testdata/functions/4/dnsmasq.conf | 1 + .../testdata/functions/4/kustomization.yaml | 12 +++ .../testdata/functions/4/resources.yaml | 17 ++++ 12 files changed, 327 insertions(+), 54 deletions(-) create mode 100644 pkg/clusterctl/implementations/components_client.go create mode 100644 pkg/clusterctl/implementations/repository_client.go create mode 100644 pkg/clusterctl/implementations/repository_client_test.go create mode 100644 pkg/clusterctl/implementations/testdata/functions/4/dnsmasq.conf create mode 100644 pkg/clusterctl/implementations/testdata/functions/4/kustomization.yaml create mode 100644 pkg/clusterctl/implementations/testdata/functions/4/resources.yaml diff --git a/go.mod b/go.mod index f8ba2d17b..8ed1280e4 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( k8s.io/kubectl v0.17.3 opendev.org/airship/go-redfish v0.0.0-20200318103738-db034d1d753a opendev.org/airship/go-redfish/client v0.0.0-20200318103738-db034d1d753a - sigs.k8s.io/cluster-api v0.3.3 + sigs.k8s.io/cluster-api v0.3.5 sigs.k8s.io/kustomize/api v0.3.1 sigs.k8s.io/yaml v1.2.0 ) diff --git a/go.sum b/go.sum index 3a7cafc36..087b10202 100644 --- a/go.sum +++ b/go.sum @@ -238,14 +238,12 @@ github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJA github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09VjbTYC/QWlUZdZ1qS1zGjy7LH2Wt07I= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -278,7 +276,6 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= @@ -288,7 +285,6 @@ github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+u github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -301,7 +297,6 @@ github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk= github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= @@ -325,7 +320,6 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/golang-lru v0.0.0-20180201235237-0fb14efe8c47/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= @@ -350,7 +344,6 @@ github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22 github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -445,14 +438,12 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= @@ -469,7 +460,6 @@ github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -599,6 +589,7 @@ golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -633,6 +624,7 @@ golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190328230028-74de082e2cca/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -644,7 +636,6 @@ golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3ob golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -671,6 +662,7 @@ golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -686,7 +678,6 @@ golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -709,6 +700,7 @@ golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= @@ -729,19 +721,18 @@ gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmK google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873 h1:nfPFGzJkUDX6uBmpN/pSw7MbOAWegH5QDQuoXFHedLg= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1 h1:q4XQuHFC6I28BKZpo6IYyb3mNO+l7lSOxRuYTCiDfXk= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -797,7 +788,6 @@ k8s.io/apimachinery v0.17.2/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZ k8s.io/apimachinery v0.17.3 h1:f+uZV6rm4/tHE7xXgLyToprg6xWairaClGVkm2t8omg= k8s.io/apimachinery v0.17.3/go.mod h1:gxLnyZcGNdZTCLnq3fgzyg2A5BVCHTNDFrw8AmuJ+0g= k8s.io/apiserver v0.17.2/go.mod h1:lBmw/TtQdtxvrTk0e2cgtOxHizXI+d0mmGQURIHQZlo= -k8s.io/apiserver v0.17.3 h1:faZbSuFtJ4dx09vctKZGHms/7bp3qFtbqb10Swswqfs= k8s.io/apiserver v0.17.3/go.mod h1:iJtsPpu1ZpEnHaNawpSV0nYTGBhhX2dUlnn7/QS7QiY= k8s.io/cli-runtime v0.17.3 h1:0ZlDdJgJBKsu77trRUynNiWsRuAvAVPBNaQfnt/1qtc= k8s.io/cli-runtime v0.17.3/go.mod h1:X7idckYphH4SZflgNpOOViSxetiMj6xI0viMAjM81TA= @@ -818,13 +808,13 @@ k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c h1:/KUFqjjqAcY4Us6luF5RDNZ16KJtb49HfR3ZHB9qYXM= +k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= k8s.io/kubectl v0.17.3 h1:9HHYj07kuFkM+sMJMOyQX29CKWq4lvKAG1UIPxNPMQ4= k8s.io/kubectl v0.17.3/go.mod h1:NUn4IBY7f7yCMwSop2HCXlw/MVYP4HJBiUmOR3n9w28= k8s.io/metrics v0.17.3/go.mod h1:HEJGy1fhHOjHggW9rMDBJBD3YuGroH3Y1pnIRw9FFaI= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20191114184206-e782cd3c129f h1:GiPwtSzdP43eI1hpPCbROQCCIgCuiMMNF8YUVLF3vJo= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200229041039-0a110f9eb7ab h1:I3f2hcBrepGRXI1z4sukzAb8w1R4eqbsHrAsx06LGYM= k8s.io/utils v0.0.0-20200229041039-0a110f9eb7ab/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= @@ -840,8 +830,8 @@ opendev.org/airship/go-redfish v0.0.0-20200318103738-db034d1d753a h1:4ggAMTwpfu/ opendev.org/airship/go-redfish v0.0.0-20200318103738-db034d1d753a/go.mod h1:FEjYcb3bYBWGpQIqtvVM0NrT5eyjlCOCj5JNf4lI+6s= opendev.org/airship/go-redfish/client v0.0.0-20200318103738-db034d1d753a h1:S1dmsP5Cc6OQjAd6OgIKMcNPBiGjh5TDbijVjNE/VGU= opendev.org/airship/go-redfish/client v0.0.0-20200318103738-db034d1d753a/go.mod h1:s0hwuUpBsRXOrhN0NR+fNVivXGyWgHKpqtyq7qYjpew= -sigs.k8s.io/cluster-api v0.3.3 h1:pNuvC6cm67SbxOaPriK8ZfLl1RSjmu/KX2GJiNQH3dU= -sigs.k8s.io/cluster-api v0.3.3/go.mod h1:lgztyeCWCve8YB4DN6QeLR0blNYBvFX9+ATHrxs+zKU= +sigs.k8s.io/cluster-api v0.3.5 h1:XPCuwrGL73x82a6spCHwkHHeGiQF+L4zntaoDg2qMzo= +sigs.k8s.io/cluster-api v0.3.5/go.mod h1:IoP66q4g92I/2f/9hltbE/FWG3RakIwRdYpY+6mqvtE= sigs.k8s.io/controller-runtime v0.5.2 h1:pyXbUfoTo+HA3jeIfr0vgi+1WtmNh0CwlcnQGLXwsSw= sigs.k8s.io/controller-runtime v0.5.2/go.mod h1:JZUwSMVbxDupo0lTJSSFP5pimEyxGynROImSsqIOx1A= sigs.k8s.io/kind v0.7.1-0.20200303021537-981bd80d3802/go.mod h1:HIZ3PWUezpklcjkqpFbnYOqaqsAE1JeCTEwkgvPLXjk= @@ -851,7 +841,7 @@ sigs.k8s.io/kustomize/api v0.3.1 h1:oqMIXvS6tFEUVuKIRUKDa05eC4Hh+cb9JYg8Zhp2d24= sigs.k8s.io/kustomize/api v0.3.1/go.mod h1:A+ATnlHqzictQfQC1q3KB/T6MSr0UWQsrrLxMWkge2E= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= -sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/pkg/clusterctl/client/client.go b/pkg/clusterctl/client/client.go index de7b9196a..f5bd925c1 100644 --- a/pkg/clusterctl/client/client.go +++ b/pkg/clusterctl/client/client.go @@ -33,7 +33,7 @@ var _ Interface = &Client{} // Interface is abstraction to Clusterctl type Interface interface { - Init(kubeconfigPath string) error + Init(kubeconfigPath, kubeconfigContext string) error } // Client Implements interface to Clusterctl @@ -66,9 +66,12 @@ func NewClient(root string, debug bool, options *airshipv1.Clusterctl) (Interfac } // Init implements interface to Clusterctl -func (c *Client) Init(kubeconfigPath string) error { +func (c *Client) Init(kubeconfigPath, kubeconfigContext string) error { log.Print("Starting cluster-api initiation") - c.initOptions.Kubeconfig = kubeconfigPath + c.initOptions.Kubeconfig = clusterctlclient.Kubeconfig{ + Path: kubeconfigPath, + Context: kubeconfigContext, + } _, err := c.clusterctlClient.Init(c.initOptions) return err } diff --git a/pkg/clusterctl/client/factory.go b/pkg/clusterctl/client/factory.go index f79837704..093aee54b 100644 --- a/pkg/clusterctl/client/factory.go +++ b/pkg/clusterctl/client/factory.go @@ -34,9 +34,11 @@ type RepositoryFactory struct { // ClusterClientFactory returns cluster factory function for clusterctl client func (f RepositoryFactory) ClusterClientFactory() client.ClusterClientFactory { - return func(kubeconfig string) (cluster.Client, error) { + return func(kubeconfig client.Kubeconfig) (cluster.Client, error) { o := cluster.InjectRepositoryFactory(f.repoFactoryClusterClient()) - return cluster.New(kubeconfig, f.ConfigClient, o), nil + return cluster.New(cluster.Kubeconfig{ + Path: kubeconfig.Path, + Context: kubeconfig.Context}, f.ConfigClient, o), nil } } @@ -77,13 +79,21 @@ func (f RepositoryFactory) repoFactory(provider config.Provider) (repository.Cli // inject repository into repository client o := repository.InjectRepository(repo) log.Printf("Creating arishipctl repository implementation interface for provider %s of type %s\n", - provider.Name(), - provider.Type()) - return repository.New(provider, f.ConfigClient, o) + name, + repoType) + + repoClient, err := repository.New(provider, f.ConfigClient, o) + if err != nil { + return nil, err + } + return &implementations.RepositoryClient{ + Client: repoClient, + ProviderType: string(repoType), + ProviderName: name}, nil } log.Printf("Creating clusterctl repository implementation interface for provider %s of type %s\n", - provider.Name(), - provider.Type()) + name, + repoType) // if repository is clusterctl pass, simply use default clusterctl repository interface return repository.New(provider, f.ConfigClient) } diff --git a/pkg/clusterctl/client/factory_test.go b/pkg/clusterctl/client/factory_test.go index 0fb532655..b4792280b 100644 --- a/pkg/clusterctl/client/factory_test.go +++ b/pkg/clusterctl/client/factory_test.go @@ -22,7 +22,9 @@ import ( "github.com/stretchr/testify/require" v1 "k8s.io/api/core/v1" clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3" + clusterctlclient "sigs.k8s.io/cluster-api/cmd/clusterctl/client" clusterctlconfig "sigs.k8s.io/cluster-api/cmd/clusterctl/client/config" + "sigs.k8s.io/cluster-api/cmd/clusterctl/client/repository" "sigs.k8s.io/yaml" airshipv1 "opendev.org/airship/airshipctl/pkg/clusterctl/api/v1alpha1" @@ -77,14 +79,15 @@ func testNewConfig(t *testing.T, o *airshipv1.Clusterctl) clusterctlconfig.Clien func TestFactory(t *testing.T) { o := testOptions(t, testConfigFactory) configClient := testNewConfig(t, o) - factory := RepositoryFactory{ root: testDataDir, Options: o, ConfigClient: configClient, } repoFactory := factory.ClientRepositoryFactory() + require.NotNil(t, repoFactory) pclient := configClient.Providers() + require.NotNil(t, pclient) tests := []struct { name string expectedVersions []string @@ -136,7 +139,9 @@ func TestFactory(t *testing.T) { components := repo.Components() require.NotNil(t, components) // namespaces are left blank, since namespace is provided in the document set - component, err := components.Get(useVersion, "", "") + component, err := components.Get(repository.ComponentsOptions{ + Version: useVersion, + }) require.NoError(t, err) require.NotNil(t, component) @@ -157,14 +162,15 @@ func TestFactory(t *testing.T) { func TestClientRepositoryFactory(t *testing.T) { o := testOptions(t, testConfigFactory) configClient := testNewConfig(t, o) - factory := RepositoryFactory{ root: testDataDir, Options: o, ConfigClient: configClient, } clusterclientFactory := factory.ClusterClientFactory() - clusterClient, err := clusterclientFactory("testdata/kubeconfig.yaml") + clusterClient, err := clusterclientFactory(clusterctlclient.Kubeconfig{ + Path: "testdata/kubeconfig.yaml", + Context: ""}) assert.NoError(t, err) assert.NotNil(t, clusterClient) } @@ -178,14 +184,13 @@ func TestRepoFactoryFunction(t *testing.T) { Options: o, ConfigClient: configClient, } - pclient := configClient.Providers() + require.NotNil(t, pclient) provider, err := pclient.Get("custom-airship-infra", "InfrastructureProvider") require.NoError(t, err) repoClient, err := factory.repoFactory(provider) require.NoError(t, err) require.NotNil(t, repoClient) - versions, err := repoClient.GetVersions() expectedVersions := []string{"v0.3.1", "v0.3.2"} sort.Strings(versions) @@ -197,22 +202,87 @@ func TestRepoFactoryFunction(t *testing.T) { func TestClusterctlRepoFactoryFunction(t *testing.T) { o := testOptions(t, testConfigFactory) configClient := testNewConfig(t, o) - factory := RepositoryFactory{ root: testDataDir, Options: o, ConfigClient: configClient, } - pclient := configClient.Providers() provider, err := pclient.Get("aws", "InfrastructureProvider") require.NoError(t, err) repoClient, err := factory.repoFactory(provider) require.NoError(t, err) require.NotNil(t, repoClient) - // try to read directory list defined by repoClient.URL() and fail - _, err = repoClient.GetVersions() - assert.Error(t, err) - // Verify clusterctl failed during reading file, note: os.IsNotExist doesn't work here - assert.Contains(t, err.Error(), "no such file or directory") +} + +// Test error cases +func TestRepositoryFactoryErrors(t *testing.T) { + // set one default provider clusterctl is properly initialized + defProv := &airshipv1.Provider{ + Name: "aws", + Type: "InfrastructureProvider", + Versions: map[string]string{ + "v0.3.3": testConfig + "/functions/capi/v0.3.3", + }, + } + o := &airshipv1.Clusterctl{ + Providers: []*airshipv1.Provider{defProv}, + } + configClient := testNewConfig(t, o) + require.NotNil(t, configClient) + factory := RepositoryFactory{ + root: testDataDir, + Options: o, + ConfigClient: configClient, + } + rf := factory.ClientRepositoryFactory() + require.NotNil(t, rf) + pclient := configClient.Providers() + require.NotNil(t, pclient) + // save provider so then we can run tests against it, while modifying original airship clustetrctl conf + provider, err := pclient.Get("aws", "InfrastructureProvider") + require.NoError(t, err) + require.NotNil(t, provider) + tests := []struct { + name string + airProvs []*airshipv1.Provider + }{ + { + name: "providers are nil", + airProvs: nil, + }, + { + name: "versions are nil", + airProvs: []*airshipv1.Provider{ + { + Name: "aws", + Type: "InfrastructureProvider", + Versions: nil, + }, + }, + }, + { + name: "versions can't be parsed", + airProvs: []*airshipv1.Provider{ + { + Name: "aws", + Type: "InfrastructureProvider", + Versions: map[string]string{ + "can't parse version": "wrong path", + }, + }, + }, + }, + } + for _, tt := range tests { + airProvs := tt.airProvs + t.Run(tt.name, func(t *testing.T) { + // set airship providers so it does not correspond to clusterctl provider + o.Providers = airProvs + crc, err := factory.repoFactory(provider) + // expect error since we have mismatch of airship providers vs clusterctl providers + require.Nil(t, crc) + assert.Error(t, err) + }) + } } diff --git a/pkg/clusterctl/cmd/command.go b/pkg/clusterctl/cmd/command.go index f6b0ec202..5d843f291 100644 --- a/pkg/clusterctl/cmd/command.go +++ b/pkg/clusterctl/cmd/command.go @@ -26,10 +26,11 @@ import ( // Command adds a layer to clusterctl interface with airshipctl context type Command struct { - kubeconfigPath string - documentRoot string - client client.Interface - options *airshipv1.Clusterctl + kubeconfigPath string + kubeconfigContext string + documentRoot string + client client.Interface + options *airshipv1.Clusterctl } // NewCommand returns instance of Command @@ -52,16 +53,17 @@ func NewCommand(rs *environment.AirshipCTLSettings) (*Command, error) { } kubeConfigPath := rs.Config.KubeConfigPath() return &Command{ - kubeconfigPath: kubeConfigPath, - documentRoot: root, - client: client, - options: options, + kubeconfigPath: kubeConfigPath, + documentRoot: root, + client: client, + options: options, + kubeconfigContext: rs.Config.CurrentContext, }, nil } // Init runs clusterctl init func (c *Command) Init() error { - return c.client.Init(c.kubeconfigPath) + return c.client.Init(c.kubeconfigPath, c.kubeconfigContext) } func clusterctlOptions(bundle document.Bundle) (*airshipv1.Clusterctl, error) { diff --git a/pkg/clusterctl/implementations/components_client.go b/pkg/clusterctl/implementations/components_client.go new file mode 100644 index 000000000..14126b2da --- /dev/null +++ b/pkg/clusterctl/implementations/components_client.go @@ -0,0 +1,41 @@ +/* + 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 + + https://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 implementations + +import ( + "sigs.k8s.io/cluster-api/cmd/clusterctl/client/repository" + + "opendev.org/airship/airshipctl/pkg/log" +) + +var _ repository.ComponentsClient = &ComponentsClient{} + +// ComponentsClient override Get() method to return same components, +// but in our implementation we skip variable substitution. +type ComponentsClient struct { + client repository.ComponentsClient + providerType string + providerName string +} + +// Get returns the components from a repository but without variable substitution +func (cc *ComponentsClient) Get(options repository.ComponentsOptions) (repository.Components, error) { + // This removes variable substitution in components.yaml + // TODO we may consider making this configurable + options.SkipVariables = true + log.Debugf("Getting airshipctl provider components, setting skipping variable substitution.\n"+ + "Provider type: %s, name: %s\n", cc.providerType, cc.providerName) + return cc.client.Get(options) +} diff --git a/pkg/clusterctl/implementations/repository_client.go b/pkg/clusterctl/implementations/repository_client.go new file mode 100644 index 000000000..8c88a5962 --- /dev/null +++ b/pkg/clusterctl/implementations/repository_client.go @@ -0,0 +1,43 @@ +/* + 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 + + https://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 implementations + +import ( + "sigs.k8s.io/cluster-api/cmd/clusterctl/client/config" + "sigs.k8s.io/cluster-api/cmd/clusterctl/client/repository" + + "opendev.org/airship/airshipctl/pkg/log" +) + +var _ config.Provider = &RepositoryClient{} + +// RepositoryClient override Components() method to return same components client, +// but in our implementation we skip variable substitution. +type RepositoryClient struct { + repository.Client + ProviderType string + ProviderName string +} + +// Components provide access to YAML file for creating provider components. +func (rc *RepositoryClient) Components() repository.ComponentsClient { + log.Debugf("Setting up airshipctl provider Components client\n"+ + "Provider type: %s, name: %s\n", rc.ProviderType, rc.ProviderName) + return &ComponentsClient{ + client: rc.Client.Components(), + providerName: rc.ProviderName, + providerType: rc.ProviderType, + } +} diff --git a/pkg/clusterctl/implementations/repository_client_test.go b/pkg/clusterctl/implementations/repository_client_test.go new file mode 100644 index 000000000..4a6305a5c --- /dev/null +++ b/pkg/clusterctl/implementations/repository_client_test.go @@ -0,0 +1,84 @@ +/* + 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 + + https://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 implementations + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + clusterctlv1 "sigs.k8s.io/cluster-api/cmd/clusterctl/api/v1alpha3" + clusterctlconfig "sigs.k8s.io/cluster-api/cmd/clusterctl/client/config" + "sigs.k8s.io/cluster-api/cmd/clusterctl/client/repository" + + airshipv1 "opendev.org/airship/airshipctl/pkg/clusterctl/api/v1alpha1" +) + +func TestRepositoryClient(t *testing.T) { + providerName := "metal3" + providerType := "InfrastructureProvider" + // this version contains a variable that is suppose to be substituted by clusterctl + // and we will test if the variable is found and not substituted + versions := map[string]string{ + "v0.2.3": "functions/4", + } + options := &airshipv1.Clusterctl{ + Providers: []*airshipv1.Provider{ + { + Name: providerName, + Type: providerType, + URL: "/dummy/path/v0.3.2/components.yaml", + Versions: versions, + }, + }, + } + // create instance of airship reader interface implementation for clusterctl and inject it + reader, err := NewAirshipReader(options) + require.NoError(t, err) + require.NotNil(t, reader) + optionReader := clusterctlconfig.InjectReader(reader) + require.NotNil(t, optionReader) + configClient, err := clusterctlconfig.New("", optionReader) + require.NoError(t, err) + require.NotNil(t, configClient) + // get the provider from configuration client, in which we injected our reader + provider, err := configClient.Providers().Get(providerName, clusterctlv1.ProviderType(providerType)) + require.NoError(t, err) + require.NotNil(t, provider) + // Create instance of airship repository interface implementation for clusterctl + repo, err := NewRepository("testdata", versions) + require.NoError(t, err) + require.NotNil(t, repo) + // Inject the repository in repository client + optionsRepo := repository.InjectRepository(repo) + repoClient, err := repository.New(provider, configClient, optionsRepo) + require.NoError(t, err) + require.NotNil(t, repoClient) + // create airship implementation of clusterctl repository client + airRepoClient := RepositoryClient{ + Client: repoClient, + } + // get the components of the repository with empty options, all defaults should work + c, err := airRepoClient.Components().Get(repository.ComponentsOptions{}) + require.NoError(t, err) + // No errors must be returned since there is are no variables that need to be substituted + assert.NotNil(t, c) + // Make sure that target namespace is the same as defined by repository implementation bundle + assert.Equal(t, "newnamespace", c.TargetNamespace()) + // Make sure that variables for substitution are actually found + require.Len(t, c.Variables(), 1) + // make sure that variable name is correct + assert.Equal(t, "PROVISIONING_IP", c.Variables()[0]) +} diff --git a/pkg/clusterctl/implementations/testdata/functions/4/dnsmasq.conf b/pkg/clusterctl/implementations/testdata/functions/4/dnsmasq.conf new file mode 100644 index 000000000..455931b41 --- /dev/null +++ b/pkg/clusterctl/implementations/testdata/functions/4/dnsmasq.conf @@ -0,0 +1 @@ +dhcp-boot=tag:ipxe,http://${PROVISIONING_IP}:80/dualboot.ipxe diff --git a/pkg/clusterctl/implementations/testdata/functions/4/kustomization.yaml b/pkg/clusterctl/implementations/testdata/functions/4/kustomization.yaml new file mode 100644 index 000000000..983f1851a --- /dev/null +++ b/pkg/clusterctl/implementations/testdata/functions/4/kustomization.yaml @@ -0,0 +1,12 @@ +resources: + - resources.yaml + +generatorOptions: + disableNameSuffixHash: true + +## this contains a variable that matches a regexp for clusterctl variable subsitution +## check the regexp here https://github.com/kubernetes-sigs/cluster-api/blob/v0.3.5/cmd/clusterctl/client/repository/components.go#L55 +configMapGenerator: +- name: ironic-config-files + files: + - dnsmasq.conf diff --git a/pkg/clusterctl/implementations/testdata/functions/4/resources.yaml b/pkg/clusterctl/implementations/testdata/functions/4/resources.yaml new file mode 100644 index 000000000..360417576 --- /dev/null +++ b/pkg/clusterctl/implementations/testdata/functions/4/resources.yaml @@ -0,0 +1,17 @@ +## contains a namespace that should be idenitifed by components interface, +--- +apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 +kind: Metadata +metadata: + name: repository-metadata +releaseSeries: +- major: 0 + minor: 3 + contract: v1alpha3 +- major: 0 + minor: 2 + contract: v1alpha2 +--- +kind: Namespace +metadata: + name: newnamespace