From d4bf72cf447a263282af1252d5ed0278cfce9b5c Mon Sep 17 00:00:00 2001 From: jianli-97 Date: Fri, 21 Jul 2023 15:18:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6json=E8=BD=ACtf=E6=A0=BC=E5=BC=8F=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/json/main.tf.json | 25 ++++++++ data/templates/openstack/main.tf.template | 56 ++++++++++++++++++ pkg/infra/assets/assets.go | 15 ----- pkg/infra/assets/cluster/cluster.go | 8 +-- pkg/infra/assets/cluster/tfvars.go | 58 ++++++++++++++++++- pkg/infra/infradeployer.go | 28 --------- pkg/infra/initconfig.go | 25 -------- pkg/infra/openstack.go | 29 ---------- .../openstack/tfvars.go} | 41 ++++++++----- 9 files changed, 168 insertions(+), 117 deletions(-) create mode 100644 data/json/main.tf.json create mode 100644 data/templates/openstack/main.tf.template delete mode 100755 pkg/infra/infradeployer.go delete mode 100755 pkg/infra/initconfig.go delete mode 100755 pkg/infra/openstack.go rename pkg/infra/{factory.go => tfvars/openstack/tfvars.go} (42%) mode change 100755 => 100644 diff --git a/data/json/main.tf.json b/data/json/main.tf.json new file mode 100644 index 0000000..927d0b7 --- /dev/null +++ b/data/json/main.tf.json @@ -0,0 +1,25 @@ +{ + "openstack": { + "user_name": "XXXXXXXXXX", + "password": "XXXXXXXXXX", + "tenant_name": "XXXXXXXXXX", + "auth_url": "XXXXXXXXXX", + "region": "XXXXXXXXXX" + }, + "flavor": { + "name": "XXXXXXXXXX", + "ram": "XXXXXXXXXX", + "vcpus": "XXXXXXXXXX", + "disk": "XXXXXXXXXX", + "is_public": "true" + }, + "instance": { + "count": "XXXXXXXXXX", + "name": "XXXXXXXXXX", + "image_name": "XXXXXXXXXX", + "key_pair": "XXXXXXXXXX" + }, + "floatip": { + "pool": "XXXXXXXXXX" + } +} \ No newline at end of file diff --git a/data/templates/openstack/main.tf.template b/data/templates/openstack/main.tf.template new file mode 100644 index 0000000..20583d2 --- /dev/null +++ b/data/templates/openstack/main.tf.template @@ -0,0 +1,56 @@ +terraform { + required_version = ">= 0.14.0" + required_providers { + openstack = { + source = "XXXXXXXXXX" + } + } +} + +provider "openstack" { + user_name = "{{.Openstack.User_name}}" + password = "{{.Openstack.Password}}" + tenant_name = "{{.Openstack.Tenant_name}}" + auth_url = "{{.Openstack.Auth_url}}" + region = "{{.Openstack.Region}}" +} + +resource "openstack_compute_flavor_v2" "flavor" { + name = "{{.Flavor.Name}}" + ram = "{{.Flavor.Ram}}" + vcpus = "{{.Flavor.Vcpus}}" + disk = "{{.Flavor.Disk}}" + is_public = "{{.Flavor.Is_public}}" +} + +resource "openstack_compute_instance_v2" "instance" { + count = "{{.Instance.Count}}" + name = "{{.Instance.Name}}" + image_name = "{{.Instance.Image_name}}" + flavor_name = openstack_compute_flavor_v2.flavor.name + key_pair = "{{.Instance.Key_pair}}" + security_groups = ["XXXXXXXXXX"] + user_data = "${file("XXXXXXXXXX")}" + + network { + name = "XXXXXXXXXX" + } +} + +resource "openstack_networking_floatingip_v2" "floatip" { + count = length(openstack_compute_instance_v2.instance) + pool = "{{.Floatip.Pool}}" +} + +resource "openstack_compute_floatingip_associate_v2" "floatip" { + count = length(openstack_compute_instance_v2.instance) + instance_id = openstack_compute_instance_v2.instance.*.id[count.index] + floating_ip = openstack_networking_floatingip_v2.floatip.*.address[count.index] +} + +output "instance_info" { + value = { + floating_ip_addresses = openstack_networking_floatingip_v2.floatip.*.address + instance_status = openstack_compute_instance_v2.instance.*.power_state + } +} diff --git a/pkg/infra/assets/assets.go b/pkg/infra/assets/assets.go index 75fdc8d..81fa8cd 100755 --- a/pkg/infra/assets/assets.go +++ b/pkg/infra/assets/assets.go @@ -16,21 +16,6 @@ limitations under the License. package assets -// path : contents -type Assets map[string][]byte - -func (a Assets) ToDir(dirname string) error { - return nil -} - -func (a *Assets) Merge(b Assets) *Assets { - return a -} - -type AssetsGenerator interface { - GenerateAssets() Assets -} - type File struct { Filename string Data []byte diff --git a/pkg/infra/assets/cluster/cluster.go b/pkg/infra/assets/cluster/cluster.go index 2fe19e5..5b38e6a 100644 --- a/pkg/infra/assets/cluster/cluster.go +++ b/pkg/infra/assets/cluster/cluster.go @@ -111,11 +111,11 @@ func (c *Cluster) Destroy() error { logrus.Infof("start to destroy %s in %s", c.Name, c.Platform) - // TODO: Destroy的tfvarsFiles的获取 + // Question: Destroy的tfvarsFiles的获取 - // terraformVariables := &TerraformVariables{} - // tfvarsFiles := make([]*assets.File, 0, len(terraformVariables.Files())+len(c.Platform)+len(c.Name)) - // tfvarsFiles = append(tfvarsFiles, terraformVariables.Files()...) + terraformVariables := &TerraformVariables{} + tfvarsFiles := make([]*assets.File, 0, len(terraformVariables.Files())+len(c.Platform)+len(c.Name)) + tfvarsFiles = append(tfvarsFiles, terraformVariables.Files()...) err := c.destroyStage(dir, terraformDir, tfvarsFiles) if err != nil { diff --git a/pkg/infra/assets/cluster/tfvars.go b/pkg/infra/assets/cluster/tfvars.go index 6d5729f..a2f1b17 100644 --- a/pkg/infra/assets/cluster/tfvars.go +++ b/pkg/infra/assets/cluster/tfvars.go @@ -16,7 +16,16 @@ limitations under the License. package cluster -import "gitee.com/openeuler/nestos-kubernetes-deployer/pkg/infra/assets" +import ( + "encoding/json" + "html/template" + "os" + "path/filepath" + + "gitee.com/openeuler/nestos-kubernetes-deployer/pkg/infra/assets" + "gitee.com/openeuler/nestos-kubernetes-deployer/pkg/infra/tfvars/openstack" + "github.com/pkg/errors" +) type TerraformVariables struct { FileList []*assets.File @@ -25,3 +34,50 @@ type TerraformVariables struct { func (t *TerraformVariables) Files() []*assets.File { return t.FileList } + +func Generate() error { + // 从文件中读取 jsonData + jsonData, err := os.ReadFile("data/json/openstack/main.tf.json") + if err != nil { + return errors.Wrap(err, "error reading json data") + } + + // 解析 JSON 数据 + var terraformData openstack.TerraformData + err = json.Unmarshal(jsonData, &terraformData) + if err != nil { + return errors.Wrap(err, "error parsing json data") + } + + // 从文件中读取 terraformConfig + terraformConfig, err := os.ReadFile("data/templates/openstack/main.tf.template") + if err != nil { + return errors.Wrap(err, "error reading terraform config template") + } + + // 使用模板填充数据 + tmpl, err := template.New("terraform").Parse(string(terraformConfig)) + if err != nil { + return errors.Wrap(err, "error creating terraform config template") + } + + // 创建一个新的文件用于写入填充后的数据 + tfDir := filepath.Join("/root", "terraform") + if err := os.MkdirAll(tfDir, os.ModePerm); err != nil { + return errors.Wrap(err, "could not create the terraform directory") + } + + outputFile, err := os.Create(filepath.Join(tfDir, "main.tf")) + if err != nil { + return errors.Wrap(err, "error creating terraform config") + } + defer outputFile.Close() + + // 将填充后的数据写入文件 + err = tmpl.Execute(outputFile, terraformData) + if err != nil { + return errors.Wrap(err, "error executing terraform config") + } + + return nil +} diff --git a/pkg/infra/infradeployer.go b/pkg/infra/infradeployer.go deleted file mode 100755 index dc28150..0000000 --- a/pkg/infra/infradeployer.go +++ /dev/null @@ -1,28 +0,0 @@ -/* -Copyright 2023 KylinSoft Co., Ltd. - -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 infra - -type InfraSpec struct { - diskSize string - memorySize string - image string - clusterCIDR string - initFileContent string -} - -type InfraDeployer interface { -} diff --git a/pkg/infra/initconfig.go b/pkg/infra/initconfig.go deleted file mode 100755 index 288c3b3..0000000 --- a/pkg/infra/initconfig.go +++ /dev/null @@ -1,25 +0,0 @@ -/* -Copyright 2023 KylinSoft Co., Ltd. - -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 infra - -type InitConfig struct { - OsType string -} - -type BootConfigAssembler interface { - Assemble(assets Assets) InitConfig -} diff --git a/pkg/infra/openstack.go b/pkg/infra/openstack.go deleted file mode 100755 index 76d4232..0000000 --- a/pkg/infra/openstack.go +++ /dev/null @@ -1,29 +0,0 @@ -/* -Copyright 2023 KylinSoft Co., Ltd. - -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 infra - -type OpenstackDeployer struct { -} - -func (t OpenstackDeployer) Create() error { - return nil -} - -func (t OpenstackDeployer) Destroy() error { - - return nil -} diff --git a/pkg/infra/factory.go b/pkg/infra/tfvars/openstack/tfvars.go old mode 100755 new mode 100644 similarity index 42% rename from pkg/infra/factory.go rename to pkg/infra/tfvars/openstack/tfvars.go index 3db63de..693bee2 --- a/pkg/infra/factory.go +++ b/pkg/infra/tfvars/openstack/tfvars.go @@ -14,20 +14,31 @@ See the License for the specific language governing permissions and limitations under the License. */ -package infra +package openstack -import "gitee.com/openeuler/nestos-kubernetes-deployer/pkg/bootconfig" - -func GetInfraDeployer(driverType string) InfraDeployer { - if driverType == "openstack" { - return OpenstackDeployer{} - } - return nil -} - -func GetBootConfigAssembler(osType string) BootConfigAssembler { - if osType == "NestOS" { - return bootconfig.IgnitionAssembler{} - } - return nil +// 定义 JSON 数据的结构 +type TerraformData struct { + Openstack struct { + User_name string `json:"user_name"` + Password string `json:"password"` + Tenant_name string `json:"tenant_name"` + Auth_url string `json:"auth_url"` + Region string `json:"region"` + } `json:"openstack"` + Flavor struct { + Name string `json:"name"` + Ram string `json:"ram"` + Vcpus string `json:"vcpus"` + Disk string `json:"disk"` + Is_public string `json:"is_public"` + } `json:"flavor"` + Instance struct { + Count string `json:"count"` + Name string `json:"name"` + Image_name string `json:"image_name"` + Key_pair string `json:"key_pair"` + } `json:"instance"` + Floatip struct { + Pool string `json:"pool"` + } `json:"floatip"` } -- Gitee