github.com/sacloud/iaas-api-go@v1.12.0/internal/tools/gen-api-fake-data/main.go (about)

     1  // Copyright 2022-2023 The sacloud/iaas-api-go Authors
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //      http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package main
    16  
    17  import (
    18  	"context"
    19  	"log"
    20  	"os"
    21  	"path/filepath"
    22  
    23  	"github.com/sacloud/iaas-api-go"
    24  	"github.com/sacloud/iaas-api-go/helper/query"
    25  	"github.com/sacloud/iaas-api-go/internal/tools"
    26  	"github.com/sacloud/iaas-api-go/ostype"
    27  	"github.com/sacloud/iaas-api-go/search"
    28  	"github.com/sacloud/iaas-api-go/search/keys"
    29  	"github.com/sacloud/iaas-api-go/types"
    30  )
    31  
    32  func init() {
    33  	log.SetFlags(0)
    34  	log.SetPrefix("gen-api-fake-data: ")
    35  }
    36  
    37  var fakeDataDefines = []struct {
    38  	destination   string
    39  	template      string
    40  	parameterFunc func() interface{}
    41  }{
    42  	{
    43  		destination:   "fake/zz_init_archive.go",
    44  		template:      tmplArchive,
    45  		parameterFunc: collectArchives,
    46  	},
    47  	{
    48  		destination:   "fake/zz_init_cdrom.go",
    49  		template:      tmplCDROM,
    50  		parameterFunc: collectCDROMs,
    51  	},
    52  }
    53  
    54  func main() {
    55  	for _, generator := range fakeDataDefines {
    56  		param := generator.parameterFunc()
    57  		tools.WriteFileWithTemplate(&tools.TemplateConfig{
    58  			OutputPath: filepath.Join(tools.ProjectRootPath(), generator.destination),
    59  			Template:   generator.template,
    60  			Parameter:  param,
    61  		})
    62  		log.Printf("generated: %s\n", filepath.Join(tools.ProjectRootPath(), generator.destination))
    63  	}
    64  }
    65  
    66  func collectArchives() interface{} {
    67  	if os.Getenv("SAKURACLOUD_ACCESS_TOKEN") == "" ||
    68  		os.Getenv("SAKURACLOUD_ACCESS_TOKEN_SECRET") == "" {
    69  		log.Fatal("required: SAKURACLOUD_ACCESS_TOKEN and SAKURACLOUD_ACCESS_TOKEN_SECRET")
    70  	}
    71  	caller := iaas.NewClientFromEnv()
    72  	tmplParam := map[string][]*iaas.Archive{}
    73  	archiveOp := iaas.NewArchiveOp(caller)
    74  	ctx := context.Background()
    75  
    76  	for _, zone := range iaas.SakuraCloudZones {
    77  		var archives []*iaas.Archive
    78  		for _, ost := range ostype.ArchiveOSTypes {
    79  			archive, err := query.FindArchiveByOSType(ctx, archiveOp, zone, ost)
    80  			if err != nil {
    81  				log.Fatal(err)
    82  			}
    83  			archives = append(archives, archive)
    84  		}
    85  		tmplParam[zone] = archives
    86  	}
    87  	return tmplParam
    88  }
    89  
    90  const tmplArchive = `// generated by 'github.com/sacloud/iaas-api-go/internal/tools/gen-api-fake-data'; DO NOT EDIT
    91  
    92  package fake
    93  
    94  import (
    95  	"github.com/sacloud/iaas-api-go"
    96  	"github.com/sacloud/iaas-api-go/types"
    97  )
    98  
    99  var initArchives = map[string][]*iaas.Archive{
   100  {{ range $zone, $archives := . -}}
   101  	"{{$zone}}": {
   102  {{ range $archives -}}
   103  		{
   104  			ID:                   types.ID({{.ID}}),
   105  			Name:                 "{{.Name}}",
   106  			Description:          "fake",
   107  			Tags:                 types.Tags{ {{range .Tags}}"{{.}}",{{ end }} },
   108  			DisplayOrder:         {{.DisplayOrder}},
   109  			Availability:         types.EAvailability("{{.Availability}}"),
   110  			Scope:                types.EScope("{{.Scope}}"),
   111  			SizeMB:               {{.SizeMB}},
   112  			DiskPlanID:           types.ID({{.DiskPlanID}}),
   113  			DiskPlanName:         "{{.DiskPlanName}}",
   114  			DiskPlanStorageClass: "{{.DiskPlanStorageClass}}",
   115  		},
   116  {{ end -}}
   117  	},
   118  {{ end -}}
   119  }
   120  `
   121  
   122  func collectCDROMs() interface{} {
   123  	if os.Getenv("SAKURACLOUD_ACCESS_TOKEN") == "" ||
   124  		os.Getenv("SAKURACLOUD_ACCESS_TOKEN_SECRET") == "" {
   125  		log.Fatal("required: SAKURACLOUD_ACCESS_TOKEN and SAKURACLOUD_ACCESS_TOKEN_SECRET")
   126  	}
   127  	caller := iaas.NewClientFromEnv()
   128  
   129  	tmplParam := map[string][]*iaas.CDROM{}
   130  	cdromOp := iaas.NewCDROMOp(caller)
   131  	ctx := context.Background()
   132  
   133  	for _, zone := range iaas.SakuraCloudZones {
   134  		var cdroms []*iaas.CDROM
   135  
   136  		searched, err := cdromOp.Find(ctx, zone, &iaas.FindCondition{
   137  			Filter: search.Filter{
   138  				search.Key(keys.Scope): string(types.Scopes.Shared),
   139  			},
   140  		})
   141  		if err != nil {
   142  			log.Fatal(err)
   143  		}
   144  
   145  		cdroms = append(cdroms, searched.CDROMs...)
   146  		tmplParam[zone] = cdroms
   147  	}
   148  	return tmplParam
   149  }
   150  
   151  const tmplCDROM = `// generated by 'github.com/sacloud/iaas-api-go/internal/tools/gen-api-fake-data'; DO NOT EDIT
   152  
   153  package fake
   154  
   155  import (
   156  	"github.com/sacloud/iaas-api-go"
   157  	"github.com/sacloud/iaas-api-go/types"
   158  )
   159  
   160  var initCDROM = map[string][]*iaas.CDROM{
   161  {{ range $zone, $data := . -}}
   162  	"{{$zone}}": {
   163  {{ range $data -}}
   164  		{
   165  			ID:                   types.ID({{.ID}}),
   166  			Name:                 "{{.Name}}",
   167  			Description:          "fake",
   168  			Tags:                 types.Tags{ {{range .Tags}}"{{.}}",{{ end }} },
   169  			DisplayOrder:         {{.DisplayOrder}},
   170  			Availability:         types.EAvailability("{{.Availability}}"),
   171  			Scope:                types.EScope("{{.Scope}}"),
   172  			SizeMB:               {{.SizeMB}},
   173  		},
   174  {{ end -}}
   175  	},
   176  {{ end -}}
   177  }
   178  `