diff --git a/builder/tencentcloud/cvm/client.go b/builder/tencentcloud/cvm/client.go index f738cf2..5eb73c6 100644 --- a/builder/tencentcloud/cvm/client.go +++ b/builder/tencentcloud/cvm/client.go @@ -34,7 +34,7 @@ func (me *TencentCloudClient) UseVpcClient(cpf *profile.ClientProfile) *vpc.Clie } me.vpcConn, _ = vpc.NewClient(me.Credential, me.Region, cpf) - // me.vpcConn.WithHttpTransport(&LogRoundTripper{}) + me.vpcConn.WithHttpTransport(&LogRoundTripper{}) return me.vpcConn } @@ -45,6 +45,7 @@ func (me *TencentCloudClient) UseCvmClient(cpf *profile.ClientProfile) *cvm.Clie } me.cvmConn, _ = cvm.NewClient(me.Credential, me.Region, cpf) + me.cvmConn.WithHttpTransport(&LogRoundTripper{}) return me.cvmConn } @@ -56,6 +57,7 @@ func (me *TencentCloudClient) UseStsClient() *sts.Client { cpf := me.ClientProfile me.stsConn, _ = sts.NewClient(me.Credential, me.Region, cpf) + me.stsConn.WithHttpTransport(&LogRoundTripper{}) return me.stsConn } @@ -66,6 +68,7 @@ func (me *TencentCloudClient) UseTagClient(cpf *profile.ClientProfile) *tag.Clie } me.tagConn, _ = tag.NewClient(me.Credential, me.Region, cpf) + me.tagConn.WithHttpTransport(&LogRoundTripper{}) return me.tagConn } @@ -76,6 +79,7 @@ func (me *TencentCloudClient) UseOrgClient(cpf *profile.ClientProfile) *org.Clie } me.orgConn, _ = org.NewClient(me.Credential, me.Region, cpf) + me.orgConn.WithHttpTransport(&LogRoundTripper{}) return me.orgConn } @@ -87,6 +91,7 @@ func (me *TencentCloudClient) UseCamClient() *cam.Client { cpf := me.ClientProfile me.camConn, _ = cam.NewClient(me.Credential, me.Region, cpf) + me.camConn.WithHttpTransport(&LogRoundTripper{}) return me.camConn } diff --git a/builder/tencentcloud/cvm/step_check_source_image.go b/builder/tencentcloud/cvm/step_check_source_image.go index 616c473..acbad68 100644 --- a/builder/tencentcloud/cvm/step_check_source_image.go +++ b/builder/tencentcloud/cvm/step_check_source_image.go @@ -24,12 +24,19 @@ func (s *stepCheckSourceImage) Run(ctx context.Context, state multistep.StateBag config := state.Get("config").(*Config) client := state.Get("cvm_client").(*cvm.Client) + var source_image *cvm.Image + if state.Get("source_image") != nil { + source_image = state.Get("source_image").(*cvm.Image) + } + Say(state, config.SourceImageId, "Trying to check source image") req := cvm.NewDescribeImagesRequest() req.InstanceType = &config.InstanceType if config.SourceImageId != "" { req.ImageIds = []*string{&config.SourceImageId} + } else if source_image != nil && *source_image.ImageId != "" { + req.ImageIds = []*string{source_image.ImageId} } else { imageNameRegex, err = regexp.Compile(config.SourceImageName) if err != nil { diff --git a/builder/tencentcloud/cvm/step_run_instance.go b/builder/tencentcloud/cvm/step_run_instance.go index 8220640..6ec2449 100644 --- a/builder/tencentcloud/cvm/step_run_instance.go +++ b/builder/tencentcloud/cvm/step_run_instance.go @@ -55,7 +55,7 @@ func (s *stepRunInstance) Run(ctx context.Context, state multistep.StateBag) mul return Halt(state, err, "Failed to get user_data") } - Say(state, "Trying to create a new instance", "") + Say(state, *source_image.ImageId, "Try to create a new instance based on image") // config RunInstances parameters req := cvm.NewRunInstancesRequest() diff --git a/builder/tencentcloud/cvm/transport.go b/builder/tencentcloud/cvm/transport.go new file mode 100644 index 0000000..b98ce37 --- /dev/null +++ b/builder/tencentcloud/cvm/transport.go @@ -0,0 +1,104 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +package cvm + +import ( + "bytes" + "encoding/json" + "fmt" + "io/ioutil" + "log" + "net/http" + "time" + + "github.com/hashicorp/packer-plugin-tencentcloud/version" +) + +type LogRoundTripper struct{} + +func (me *LogRoundTripper) RoundTrip(request *http.Request) (response *http.Response, errRet error) { + + var inBytes, outBytes []byte + + var start = time.Now() + + defer func() { me.log(inBytes, outBytes, errRet, start) }() + + bodyReader, errRet := request.GetBody() + if errRet != nil { + return + } + + var headName = "X-TC-Action" + var reqClientFormat = version.PluginVersion + request.Header.Set("X-TC-RequestClient", reqClientFormat.String()) + inBytes = []byte(fmt.Sprintf("%s, request: ", request.Header[headName])) + requestBody, errRet := ioutil.ReadAll(bodyReader) + if errRet != nil { + return + } + + inBytes = append(inBytes, requestBody...) + headName = "X-TC-Region" + appendMessage := []byte(fmt.Sprintf( + ", (host %+v, region:%+v)", + request.Header["Host"], + request.Header[headName], + )) + + inBytes = append(inBytes, appendMessage...) + response, errRet = http.DefaultTransport.RoundTrip(request) + if errRet != nil { + return + } + + outBytes, errRet = ioutil.ReadAll(response.Body) + if errRet != nil { + return + } + + response.Body = ioutil.NopCloser(bytes.NewBuffer(outBytes)) + return +} + +func (me *LogRoundTripper) log(in []byte, out []byte, err error, start time.Time) { + var buf bytes.Buffer + buf.WriteString("######") + tag := "[DEBUG]" + if err != nil { + tag = "[CRITICAL]" + } + + buf.WriteString(tag) + if len(in) > 0 { + buf.WriteString("tencentcloud-sdk-go: ") + buf.Write(in) + } + + if len(out) > 0 { + buf.WriteString("; response:") + err := json.Compact(&buf, out) + if err != nil { + out := bytes.Replace(out, + []byte("\n"), + []byte(""), + -1) + out = bytes.Replace(out, + []byte(" "), + []byte(""), + -1) + buf.Write(out) + } + } + + if err != nil { + buf.WriteString("; error:") + buf.WriteString(err.Error()) + } + + costFormat := fmt.Sprintf(",cost %s", time.Since(start).String()) + buf.WriteString(costFormat) + + log.Println(buf.String()) +}