github.com/wuhuizuo/gomplate@v3.5.0+incompatible/tests/integration/test_ec2_utils.go (about)

     1  //+build integration
     2  
     3  package integration
     4  
     5  import (
     6  	"bytes"
     7  	"crypto/rand"
     8  	"crypto/rsa"
     9  	"crypto/x509"
    10  	"crypto/x509/pkix"
    11  	"encoding/pem"
    12  	"log"
    13  	"math/big"
    14  	"net/http"
    15  
    16  	"github.com/fullsailor/pkcs7"
    17  )
    18  
    19  const instanceDocument = `{
    20      "devpayProductCodes" : null,
    21      "availabilityZone" : "xx-test-1b",
    22      "privateIp" : "10.1.2.3",
    23      "version" : "2010-08-31",
    24      "instanceId" : "i-00000000000000000",
    25      "billingProducts" : null,
    26      "instanceType" : "t2.micro",
    27      "accountId" : "1",
    28      "imageId" : "ami-00000000",
    29      "pendingTime" : "2000-00-01T0:00:00Z",
    30      "architecture" : "x86_64",
    31      "kernelId" : null,
    32      "ramdiskId" : null,
    33      "region" : "xx-test-1"
    34  }`
    35  
    36  func instanceDocumentHandler(w http.ResponseWriter, r *http.Request) {
    37  	w.Header().Set("Content-Type", "application/json")
    38  	_, err := w.Write([]byte(instanceDocument))
    39  	if err != nil {
    40  		w.WriteHeader(500)
    41  	}
    42  }
    43  
    44  func certificateGenerate() (priv *rsa.PrivateKey, derBytes []byte, err error) {
    45  	priv, err = rsa.GenerateKey(rand.Reader, 2048)
    46  	if err != nil {
    47  		log.Fatalf("failed to generate private key: %s", err)
    48  	}
    49  
    50  	serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
    51  	serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)
    52  	if err != nil {
    53  		log.Fatalf("failed to generate serial number: %s", err)
    54  	}
    55  
    56  	template := x509.Certificate{
    57  		SerialNumber: serialNumber,
    58  		Subject: pkix.Name{
    59  			Organization: []string{"Test"},
    60  		},
    61  	}
    62  
    63  	derBytes, err = x509.CreateCertificate(rand.Reader, &template, &template, &priv.PublicKey, priv)
    64  	if err != nil {
    65  		log.Fatalf("Failed to create certificate: %s", err)
    66  	}
    67  
    68  	return priv, derBytes, err
    69  }
    70  
    71  func pkcsHandler(priv *rsa.PrivateKey, derBytes []byte) func(http.ResponseWriter, *http.Request) {
    72  	return func(w http.ResponseWriter, r *http.Request) {
    73  		cert, err := x509.ParseCertificate(derBytes)
    74  		if err != nil {
    75  			log.Fatalf("Cannot decode certificate: %s", err)
    76  		}
    77  
    78  		// Initialize a SignedData struct with content to be signed
    79  		signedData, err := pkcs7.NewSignedData([]byte(instanceDocument))
    80  		if err != nil {
    81  			log.Fatalf("Cannot initialize signed data: %s", err)
    82  		}
    83  
    84  		// Add the signing cert and private key
    85  		if err = signedData.AddSigner(cert, priv, pkcs7.SignerInfoConfig{}); err != nil {
    86  			log.Fatalf("Cannot add signer: %s", err)
    87  		}
    88  
    89  		// Finish() to obtain the signature bytes
    90  		detachedSignature, err := signedData.Finish()
    91  		if err != nil {
    92  			log.Fatalf("Cannot finish signing data: %s", err)
    93  		}
    94  
    95  		encoded := pem.EncodeToMemory(&pem.Block{Type: "PKCS7", Bytes: detachedSignature})
    96  
    97  		encoded = bytes.TrimPrefix(encoded, []byte("-----BEGIN PKCS7-----\n"))
    98  		encoded = bytes.TrimSuffix(encoded, []byte("\n-----END PKCS7-----\n"))
    99  
   100  		w.Header().Set("Content-Type", "text/plain")
   101  		_, err = w.Write(encoded)
   102  		if err != nil {
   103  			w.WriteHeader(500)
   104  		}
   105  	}
   106  }
   107  
   108  func stsHandler(w http.ResponseWriter, r *http.Request) {
   109  	w.Header().Set("Content-Type", "text/xml")
   110  	_, err := w.Write([]byte(`<GetCallerIdentityResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
   111    <GetCallerIdentityResult>
   112     <Arn>arn:aws:iam::1:user/Test</Arn>
   113      <UserId>AKIAI44QH8DHBEXAMPLE</UserId>
   114      <Account>1</Account>
   115    </GetCallerIdentityResult>
   116    <ResponseMetadata>
   117      <RequestId>01234567-89ab-cdef-0123-456789abcdef</RequestId>
   118    </ResponseMetadata>
   119  </GetCallerIdentityResponse>`))
   120  	if err != nil {
   121  		w.WriteHeader(500)
   122  	}
   123  }
   124  
   125  func ec2Handler(w http.ResponseWriter, r *http.Request) {
   126  	w.Header().Set("Content-Type", "text/xml")
   127  	_, err := w.Write([]byte(`<DescribeInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
   128      <requestId>8f7724cf-496f-496e-8fe3-example</requestId>
   129      <reservationSet>
   130          <item>
   131              <reservationId>r-1234567890abcdef0</reservationId>
   132              <ownerId>123456789012</ownerId>
   133              <groupSet/>
   134              <instancesSet>
   135                  <item>
   136                      <instanceId>i-00000000000000000</instanceId>
   137                      <imageId>ami-00000000</imageId>
   138                      <instanceState>
   139                          <code>16</code>
   140                          <name>running</name>
   141                      </instanceState>
   142                      <privateDnsName>ip-192-168-1-88.eu-west-1.compute.internal</privateDnsName>
   143                      <dnsName>ec2-54-194-252-215.eu-west-1.compute.amazonaws.com</dnsName>
   144                      <reason/>
   145                      <keyName>my_keypair</keyName>
   146                      <amiLaunchIndex>0</amiLaunchIndex>
   147                      <productCodes/>
   148                      <instanceType>t2.micro</instanceType>
   149                      <launchTime>2015-12-22T10:44:05.000Z</launchTime>
   150                      <placement>
   151                          <availabilityZone>eu-west-1c</availabilityZone>
   152                          <groupName/>
   153                          <tenancy>default</tenancy>
   154                      </placement>
   155                      <monitoring>
   156                          <state>disabled</state>
   157                      </monitoring>
   158                      <subnetId>subnet-56f5f633</subnetId>
   159                      <vpcId>vpc-11112222</vpcId>
   160                      <privateIpAddress>192.168.1.88</privateIpAddress>
   161                      <ipAddress>54.194.252.215</ipAddress>
   162                      <sourceDestCheck>true</sourceDestCheck>
   163                      <groupSet>
   164                          <item>
   165                              <groupId>sg-e4076980</groupId>
   166                              <groupName>SecurityGroup1</groupName>
   167                          </item>
   168                      </groupSet>
   169                      <architecture>x86_64</architecture>
   170                      <rootDeviceType>ebs</rootDeviceType>
   171                      <rootDeviceName>/dev/xvda</rootDeviceName>
   172                      <blockDeviceMapping>
   173                          <item>
   174                              <deviceName>/dev/xvda</deviceName>
   175                              <ebs>
   176                                  <volumeId>vol-1234567890abcdef0</volumeId>
   177                                  <status>attached</status>
   178                                  <attachTime>2015-12-22T10:44:09.000Z</attachTime>
   179                                  <deleteOnTermination>true</deleteOnTermination>
   180                              </ebs>
   181                          </item>
   182                      </blockDeviceMapping>
   183                      <virtualizationType>hvm</virtualizationType>
   184                      <clientToken>xMcwG14507example</clientToken>
   185                      <tagSet>
   186                          <item>
   187                              <key>Name</key>
   188                              <value>Server_1</value>
   189                          </item>
   190                      </tagSet>
   191                      <hypervisor>xen</hypervisor>
   192                      <networkInterfaceSet>
   193                          <item>
   194                              <networkInterfaceId>eni-551ba033</networkInterfaceId>
   195                              <subnetId>subnet-56f5f633</subnetId>
   196                              <vpcId>vpc-11112222</vpcId>
   197                              <description>Primary network interface</description>
   198                              <ownerId>123456789012</ownerId>
   199                              <status>in-use</status>
   200                              <macAddress>02:dd:2c:5e:01:69</macAddress>
   201                              <privateIpAddress>192.168.1.88</privateIpAddress>
   202                              <privateDnsName>ip-192-168-1-88.eu-west-1.compute.internal</privateDnsName>
   203                              <sourceDestCheck>true</sourceDestCheck>
   204                              <groupSet>
   205                                  <item>
   206                                      <groupId>sg-e4076980</groupId>
   207                                      <groupName>SecurityGroup1</groupName>
   208                                  </item>
   209                              </groupSet>
   210                              <attachment>
   211                                  <attachmentId>eni-attach-39697adc</attachmentId>
   212                                  <deviceIndex>0</deviceIndex>
   213                                  <status>attached</status>
   214                                  <attachTime>2015-12-22T10:44:05.000Z</attachTime>
   215                                  <deleteOnTermination>true</deleteOnTermination>
   216                              </attachment>
   217                              <association>
   218                                  <publicIp>54.194.252.215</publicIp>
   219                                  <publicDnsName>ec2-54-194-252-215.eu-west-1.compute.amazonaws.com</publicDnsName>
   220                                  <ipOwnerId>amazon</ipOwnerId>
   221                              </association>
   222                              <privateIpAddressesSet>
   223                                  <item>
   224                                      <privateIpAddress>192.168.1.88</privateIpAddress>
   225                                      <privateDnsName>ip-192-168-1-88.eu-west-1.compute.internal</privateDnsName>
   226                                      <primary>true</primary>
   227                                      <association>
   228                                      <publicIp>54.194.252.215</publicIp>
   229                                      <publicDnsName>ec2-54-194-252-215.eu-west-1.compute.amazonaws.com</publicDnsName>
   230                                      <ipOwnerId>amazon</ipOwnerId>
   231                                      </association>
   232                                  </item>
   233                              </privateIpAddressesSet>
   234                              <ipv6AddressesSet>
   235                                 <item>
   236                                     <ipv6Address>2001:db8:1234:1a2b::123</ipv6Address>
   237                                 </item>
   238                             </ipv6AddressesSet>
   239                          </item>
   240                      </networkInterfaceSet>
   241                      <ebsOptimized>false</ebsOptimized>
   242                  </item>
   243              </instancesSet>
   244          </item>
   245      </reservationSet>
   246  </DescribeInstancesResponse>`))
   247  	if err != nil {
   248  		w.WriteHeader(500)
   249  	}
   250  }