diff --git a/data/json/main.tf.json b/data/json/main.tf.json new file mode 100644 index 0000000000000000000000000000000000000000..927d0b7976e56eab6cb3e162343828152e47ca87 --- /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 0000000000000000000000000000000000000000..20583d2c704e91d12107235ddfc16eca6d48dd19 --- /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 75fdc8d5ef9975d24a8048d8f78f8fce083e2e3d..81fa8cd1d49efc24f6a434fcc91820b381a3265f 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 2fe19e5eebabef4144de78e83011bee21408589c..5b38e6ae003e70cf9a3eb365922f739c7e84155b 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 6d5729f14b2fe274239311daf851c839690b4e58..a2f1b17960044c8c61988319f7f092883fdaa740 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 dc281501a670283ff0bf41fe48ffe5ec7aeab22b..0000000000000000000000000000000000000000 --- 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 288c3b31ebd0c3bbb21abe7cab8dcf5d23a639c6..0000000000000000000000000000000000000000 --- 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 76d42327cb3bf3040b4f3389a1dfcbd3f02a4acd..0000000000000000000000000000000000000000 --- 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 3db63de4ff1bcf1a4debc48cd3567e6b9f8c3c31..693bee2e0d0779a7f6747b1617a8103ef06b4cee --- 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"` }