github.phpd.cn/hashicorp/packer@v1.3.2/builder/ncloud/step_validate_template.go (about) 1 package ncloud 2 3 import ( 4 "bytes" 5 "context" 6 "errors" 7 "fmt" 8 "strings" 9 10 ncloud "github.com/NaverCloudPlatform/ncloud-sdk-go/sdk" 11 "github.com/hashicorp/packer/helper/multistep" 12 "github.com/hashicorp/packer/packer" 13 "github.com/olekukonko/tablewriter" 14 ) 15 16 //StepValidateTemplate : struct for Validation a template 17 type StepValidateTemplate struct { 18 Conn *ncloud.Conn 19 Validate func() error 20 Say func(message string) 21 Error func(e error) 22 Config *Config 23 zoneNo string 24 regionNo string 25 FeeSystemTypeCode string 26 } 27 28 // NewStepValidateTemplate : function for Validation a template 29 func NewStepValidateTemplate(conn *ncloud.Conn, ui packer.Ui, config *Config) *StepValidateTemplate { 30 var step = &StepValidateTemplate{ 31 Conn: conn, 32 Say: func(message string) { ui.Say(message) }, 33 Error: func(e error) { ui.Error(e.Error()) }, 34 Config: config, 35 } 36 37 step.Validate = step.validateTemplate 38 39 return step 40 } 41 42 // getZoneNo : get zoneNo 43 func (s *StepValidateTemplate) getZoneNo() error { 44 if s.Config.Region == "" { 45 return nil 46 } 47 48 regionList, err := s.Conn.GetRegionList() 49 if err != nil { 50 return err 51 } 52 53 var regionNo string 54 for _, region := range regionList.RegionList { 55 if strings.EqualFold(region.RegionName, s.Config.Region) { 56 regionNo = region.RegionNo 57 } 58 } 59 60 if regionNo == "" { 61 return fmt.Errorf("region %s is invalid", s.Config.Region) 62 } 63 64 s.regionNo = regionNo 65 66 // Get ZoneNo 67 ZoneList, err := s.Conn.GetZoneList(regionNo) 68 if err != nil { 69 return err 70 } 71 72 if len(ZoneList.Zone) > 0 { 73 s.zoneNo = ZoneList.Zone[0].ZoneNo 74 } 75 76 return nil 77 } 78 79 func (s *StepValidateTemplate) validateMemberServerImage() error { 80 var serverImageName = s.Config.ServerImageName 81 82 reqParams := new(ncloud.RequestServerImageList) 83 reqParams.RegionNo = s.regionNo 84 85 memberServerImageList, err := s.Conn.GetMemberServerImageList(reqParams) 86 if err != nil { 87 return err 88 } 89 90 var isExistMemberServerImageNo = false 91 for _, image := range memberServerImageList.MemberServerImageList { 92 // Check duplicate server_image_name 93 if image.MemberServerImageName == serverImageName { 94 return fmt.Errorf("server_image_name %s is exists", serverImageName) 95 } 96 97 if image.MemberServerImageNo == s.Config.MemberServerImageNo { 98 isExistMemberServerImageNo = true 99 if s.Config.ServerProductCode == "" { 100 s.Config.ServerProductCode = image.OriginalServerProductCode 101 s.Say("server_product_code for member server image '" + image.OriginalServerProductCode + "' is configured automatically") 102 } 103 s.Config.ServerImageProductCode = image.OriginalServerImageProductCode 104 } 105 } 106 107 if s.Config.MemberServerImageNo != "" && !isExistMemberServerImageNo { 108 return fmt.Errorf("member_server_image_no %s does not exist", s.Config.MemberServerImageNo) 109 } 110 111 return nil 112 } 113 114 func (s *StepValidateTemplate) validateServerImageProduct() error { 115 var serverImageProductCode = s.Config.ServerImageProductCode 116 if serverImageProductCode == "" { 117 return nil 118 } 119 120 reqParams := new(ncloud.RequestGetServerImageProductList) 121 reqParams.RegionNo = s.regionNo 122 123 serverImageProductList, err := s.Conn.GetServerImageProductList(reqParams) 124 if err != nil { 125 return err 126 } 127 128 var isExistServerImage = false 129 var buf bytes.Buffer 130 var productName string 131 table := tablewriter.NewWriter(&buf) 132 table.SetHeader([]string{"Name", "Code"}) 133 134 for _, product := range serverImageProductList.Product { 135 // Check exist server image product code 136 if product.ProductCode == serverImageProductCode { 137 isExistServerImage = true 138 productName = product.ProductName 139 break 140 } 141 142 table.Append([]string{product.ProductName, product.ProductCode}) 143 } 144 145 if !isExistServerImage { 146 reqParams.BlockStorageSize = 100 147 148 serverImageProductList, err := s.Conn.GetServerImageProductList(reqParams) 149 if err != nil { 150 return err 151 } 152 153 for _, product := range serverImageProductList.Product { 154 // Check exist server image product code 155 if product.ProductCode == serverImageProductCode { 156 isExistServerImage = true 157 productName = product.ProductName 158 break 159 } 160 161 table.Append([]string{product.ProductName, product.ProductCode}) 162 } 163 } 164 165 if !isExistServerImage { 166 table.Render() 167 s.Say(buf.String()) 168 169 return fmt.Errorf("server_image_product_code %s does not exist", serverImageProductCode) 170 } 171 172 if strings.Contains(productName, "mssql") { 173 s.FeeSystemTypeCode = "FXSUM" 174 } 175 176 return nil 177 } 178 179 func (s *StepValidateTemplate) validateServerProductCode() error { 180 var serverImageProductCode = s.Config.ServerImageProductCode 181 var productCode = s.Config.ServerProductCode 182 183 reqParams := new(ncloud.RequestGetServerProductList) 184 reqParams.ServerImageProductCode = serverImageProductCode 185 reqParams.RegionNo = s.regionNo 186 187 productList, err := s.Conn.GetServerProductList(reqParams) 188 if err != nil { 189 return err 190 } 191 192 var isExistProductCode = false 193 for _, product := range productList.Product { 194 // Check exist server image product code 195 if product.ProductCode == productCode { 196 isExistProductCode = true 197 if strings.Contains(product.ProductName, "mssql") { 198 s.FeeSystemTypeCode = "FXSUM" 199 } 200 201 if product.ProductType.Code == "VDS" { 202 return errors.New("You cannot create my server image for VDS servers") 203 } 204 205 break 206 } else if productCode == "" && product.ProductType.Code == "STAND" { 207 isExistProductCode = true 208 s.Config.ServerProductCode = product.ProductCode 209 s.Say("server_product_code '" + product.ProductCode + "' is configured automatically") 210 break 211 } 212 } 213 214 if !isExistProductCode { 215 var buf bytes.Buffer 216 table := tablewriter.NewWriter(&buf) 217 table.SetHeader([]string{"Name", "Code"}) 218 for _, product := range productList.Product { 219 table.Append([]string{product.ProductName, product.ProductCode}) 220 } 221 table.Render() 222 223 s.Say(buf.String()) 224 225 return fmt.Errorf("server_product_code %s does not exist", productCode) 226 } 227 228 return nil 229 } 230 231 // Check ImageName / Product Code / Server Image Product Code / Server Product Code... 232 func (s *StepValidateTemplate) validateTemplate() error { 233 // Get RegionNo, ZoneNo 234 if err := s.getZoneNo(); err != nil { 235 return err 236 } 237 238 // Validate member_server_image_no and member_server_image_no 239 if err := s.validateMemberServerImage(); err != nil { 240 return err 241 } 242 243 // Validate server_image_product_code 244 if err := s.validateServerImageProduct(); err != nil { 245 return err 246 } 247 248 // Validate server_product_code 249 return s.validateServerProductCode() 250 } 251 252 // Run : main function for validation a template 253 func (s *StepValidateTemplate) Run(_ context.Context, state multistep.StateBag) multistep.StepAction { 254 s.Say("Validating deployment template ...") 255 256 err := s.Validate() 257 258 state.Put("ZoneNo", s.zoneNo) 259 260 if s.FeeSystemTypeCode != "" { 261 state.Put("FeeSystemTypeCode", s.FeeSystemTypeCode) 262 } 263 264 return processStepResult(err, s.Error, state) 265 } 266 267 // Cleanup : cleanup on error 268 func (s *StepValidateTemplate) Cleanup(multistep.StateBag) { 269 }