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 }