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  }