func TestRestRequestXMLError(t *testing.T) { var m sync.Mutex var httpReq *http.Request server := httptest.NewServer(http.HandlerFunc( func(w http.ResponseWriter, r *http.Request) { m.Lock() defer m.Unlock() httpReq = r w.Header().Set("Content-Type", "application/xml") w.WriteHeader(500) fmt.Fprintln(w, `<Error> <Code>bonus</Code> <BucketName>bingo</BucketName> <Message>the bad thing</Message> <RequestId>woo woo</RequestId> <HostId>woo woo</HostId> </Error>`) }, )) defer server.Close() client := aws.RestClient{ Context: aws.Context{ Service: "animals", Region: "us-west-2", Credentials: aws.Creds( "accessKeyID", "secretAccessKey", "securityToken", ), }, Client: http.DefaultClient, } req, err := http.NewRequest("GET", server.URL+"/yay", nil) if err != nil { t.Fatal(err) } _, err = client.Do(req) if err == nil { t.Fatal("Expected an error but none was returned") } if err, ok := err.(aws.APIError); ok { if v, want := err.Code, "bonus"; v != want { t.Errorf("Error code was %v, but expected %v", v, want) } if v, want := err.Message, "the bad thing"; v != want { t.Errorf("Error message was %v, but expected %v", v, want) } } else { t.Errorf("Unknown error returned: %#v", err) } }
func (c *AWSCluster) FindCredentials() (aws.CredentialsProvider, error) { if c.base.CredentialID == "aws_env" { return aws.EnvCreds() } cred, err := c.base.FindCredentials() if err != nil { return nil, err } return aws.Creds(cred.ID, cred.Secret, ""), nil }
func (api *httpAPI) InstallHandler(w http.ResponseWriter, req *http.Request, params httprouter.Params) { var input *jsonInput if err := httphelper.DecodeJSON(req, &input); err != nil { httphelper.Error(w, err) return } api.InstallerStackMtx.Lock() defer api.InstallerStackMtx.Unlock() if len(api.InstallerStacks) > 0 { httphelper.ObjectExistsError(w, "install already started") return } var id = random.Hex(16) var creds aws.CredentialsProvider if input.Creds.AccessKeyID != "" && input.Creds.SecretAccessKey != "" { creds = aws.Creds(input.Creds.AccessKeyID, input.Creds.SecretAccessKey, "") } else { var err error creds, err = aws.EnvCreds() if err != nil { httphelper.ValidationError(w, "", err.Error()) return } } s := &httpInstaller{ ID: id, PromptOutChan: make(chan *httpPrompt), PromptInChan: make(chan *httpPrompt), logger: log.New(), api: api, } s.Stack = &Stack{ Creds: creds, Region: input.Region, InstanceType: input.InstanceType, NumInstances: input.NumInstances, VpcCidr: input.VpcCidr, SubnetCidr: input.SubnetCidr, PromptInput: s.PromptInput, YesNoPrompt: s.YesNoPrompt, } if err := s.Stack.RunAWS(); err != nil { httphelper.Error(w, err) return } api.InstallerStacks[id] = s go s.handleEvents() httphelper.JSON(w, 200, s) }
func (c *AWSCluster) SetCreds(creds *Credential) error { if creds == nil || creds.ID == "aws_env" { c.base.CredentialID = "aws_env" awsCreds, err := aws.EnvCreds() if err != nil { return err } c.creds = awsCreds return nil } c.base.credential = creds c.base.CredentialID = creds.ID c.creds = aws.Creds(creds.ID, creds.Secret, "") return nil }
func (c *AWSCluster) SetCreds(creds *Credential) error { if creds == nil || creds.ID == "aws_env" { c.base.CredentialID = "aws_env" awsCreds, err := aws.EnvCreds() if err != nil { return err } c.creds = awsCreds } else { c.base.credential = creds c.base.CredentialID = creds.ID c.creds = aws.Creds(creds.ID, creds.Secret, "") } c.ec2 = ec2.New(c.creds, c.Region, nil) c.cf = cloudformation.New(c.creds, c.Region, nil) return nil }
func TestJSONRequestError(t *testing.T) { server := httptest.NewServer(http.HandlerFunc( func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(400) fmt.Fprintln(w, `{"__type":"Problem", "message":"What even"}`) }, )) defer server.Close() client := aws.JSONClient{ Context: aws.Context{ Service: "animals", Region: "us-west-2", Credentials: aws.Creds( "accessKeyID", "secretAccessKey", "securityToken", ), }, Client: http.DefaultClient, Endpoint: server.URL, TargetPrefix: "Animals", JSONVersion: "1.1", } req := fakeJSONRequest{Name: "Penny"} var resp fakeJSONResponse err := client.Do("PetTheDog", "POST", "/", req, &resp) if err == nil { t.Fatal("Expected an error but none was returned") } if err, ok := err.(aws.APIError); ok { if v, want := err.Type, "Problem"; v != want { t.Errorf("Error type was %v, but expected %v", v, want) } if v, want := err.Message, "What even"; v != want { t.Errorf("Error message was %v, but expected %v", v, want) } } else { t.Errorf("Unknown error returned: %#v", err) } }
func TestJSONRequest(t *testing.T) { var m sync.Mutex var httpReq *http.Request var body []byte server := httptest.NewServer(http.HandlerFunc( func(w http.ResponseWriter, r *http.Request) { m.Lock() defer m.Unlock() b, err := ioutil.ReadAll(r.Body) if err != nil { t.Fatal(err) } defer r.Body.Close() httpReq = r body = b fmt.Fprintln(w, `{"TailWagged":true}`) }, )) defer server.Close() client := aws.JSONClient{ Context: aws.Context{ Service: "animals", Region: "us-west-2", Credentials: aws.Creds( "accessKeyID", "secretAccessKey", "securityToken", ), }, Client: http.DefaultClient, Endpoint: server.URL, TargetPrefix: "Animals", JSONVersion: "1.1", } req := fakeJSONRequest{Name: "Penny"} var resp fakeJSONResponse if err := client.Do("PetTheDog", "POST", "/", req, &resp); err != nil { t.Fatal(err) } m.Lock() defer m.Unlock() if v, want := httpReq.Method, "POST"; v != want { t.Errorf("Method was %v but expected %v", v, want) } if httpReq.Header.Get("Authorization") == "" { t.Error("Authorization header is missing") } if v, want := httpReq.Header.Get("Content-Type"), "application/x-amz-json-1.1"; v != want { t.Errorf("Content-Type was %v but expected %v", v, want) } if v, want := httpReq.Header.Get("User-Agent"), "aws-go"; v != want { t.Errorf("User-Agent was %v but expected %v", v, want) } if v, want := httpReq.Header.Get("X-Amz-Target"), "Animals.PetTheDog"; v != want { t.Errorf("X-Amz-Target was %v but expected %v", v, want) } if v, want := string(body), `{"Name":"Penny"}`; v != want { t.Errorf("Body was %v but expected %v", v, want) } if v, want := resp, (fakeJSONResponse{TailWagged: true}); v != want { t.Errorf("Response was %#v but expected %#v", v, want) } }
func TestEC2Request(t *testing.T) { var m sync.Mutex var httpReq *http.Request var form url.Values server := httptest.NewServer(http.HandlerFunc( func(w http.ResponseWriter, r *http.Request) { m.Lock() defer m.Unlock() httpReq = r if err := r.ParseForm(); err != nil { t.Fatal(err) } form = r.Form fmt.Fprintln(w, `<Thing><IpAddress>woo</IpAddress></Thing>`) }, )) defer server.Close() client := aws.EC2Client{ Context: aws.Context{ Service: "animals", Region: "us-west-2", Credentials: aws.Creds( "accessKeyID", "secretAccessKey", "securityToken", ), }, Client: http.DefaultClient, Endpoint: server.URL, APIVersion: "1.1", } req := fakeEC2Request{ PresentString: aws.String("string"), PresentBoolean: aws.True(), PresentInteger: aws.Integer(1), PresentLong: aws.Long(2), PresentDouble: aws.Double(1.2), PresentFloat: aws.Float(2.3), PresentTime: time.Date(2001, 1, 1, 2, 1, 1, 0, time.FixedZone("UTC+1", 3600)), PresentSlice: []string{"one", "two"}, PresentStruct: &EmbeddedStruct{Value: aws.String("v")}, PresentStructSlice: []EmbeddedStruct{ {Value: aws.String("p")}, {Value: aws.String("q")}, }, } var resp fakeEC2Response if err := client.Do("GetIP", "POST", "/", &req, &resp); err != nil { t.Fatal(err) } m.Lock() defer m.Unlock() if v, want := httpReq.Method, "POST"; v != want { t.Errorf("Method was %v but expected %v", v, want) } if httpReq.Header.Get("Authorization") == "" { t.Error("Authorization header is missing") } if v, want := httpReq.Header.Get("Content-Type"), "application/x-www-form-urlencoded"; v != want { t.Errorf("Content-Type was %v but expected %v", v, want) } if v, want := httpReq.Header.Get("User-Agent"), "aws-go"; v != want { t.Errorf("User-Agent was %v but expected %v", v, want) } if err := httpReq.ParseForm(); err != nil { t.Fatal(err) } expectedForm := url.Values{ "Action": []string{"GetIP"}, "Version": []string{"1.1"}, "PresentString": []string{"string"}, "PresentBoolean": []string{"true"}, "PresentInteger": []string{"1"}, "PresentLong": []string{"2"}, "PresentDouble": []string{"1.2"}, "PresentFloat": []string{"2.3"}, "PresentTime": []string{"2001-01-01T01:01:01Z"}, "PresentSlice.1": []string{"one"}, "PresentSlice.2": []string{"two"}, "PresentStruct.Value": []string{"v"}, "PresentStructSlice.1.Value": []string{"p"}, "PresentStructSlice.2.Value": []string{"q"}, } if !reflect.DeepEqual(form, expectedForm) { t.Errorf("Post body was \n%s\n but expected \n%s", form.Encode(), expectedForm.Encode()) } if want := (fakeEC2Response{IPAddress: "woo"}); want != resp { t.Errorf("Response was %#v, but expected %#v", resp, want) } }
func TestEC2RequestError(t *testing.T) { var m sync.Mutex var httpReq *http.Request var form url.Values server := httptest.NewServer(http.HandlerFunc( func(w http.ResponseWriter, r *http.Request) { m.Lock() defer m.Unlock() httpReq = r if err := r.ParseForm(); err != nil { t.Fatal(err) } form = r.Form w.WriteHeader(400) fmt.Fprintln(w, `<Response> <RequestId>woo</RequestId> <Errors> <Error> <Type>Problem</Type> <Code>Uh Oh</Code> <Message>You done did it</Message> </Error> </Errors> </Response>`) }, )) defer server.Close() client := aws.EC2Client{ Context: aws.Context{ Service: "animals", Region: "us-west-2", Credentials: aws.Creds( "accessKeyID", "secretAccessKey", "securityToken", ), }, Client: http.DefaultClient, Endpoint: server.URL, APIVersion: "1.1", } req := fakeEC2Request{} var resp fakeEC2Response err := client.Do("GetIP", "POST", "/", &req, &resp) if err == nil { t.Fatal("Expected an error but none was returned") } if err, ok := err.(aws.APIError); ok { if v, want := err.Type, "Problem"; v != want { t.Errorf("Error type was %v, but expected %v", v, want) } if v, want := err.Code, "Uh Oh"; v != want { t.Errorf("Error type was %v, but expected %v", v, want) } if v, want := err.Message, "You done did it"; v != want { t.Errorf("Error message was %v, but expected %v", v, want) } } else { t.Errorf("Unknown error returned: %#v", err) } }
func TestRestRequest(t *testing.T) { var m sync.Mutex var httpReq *http.Request server := httptest.NewServer(http.HandlerFunc( func(w http.ResponseWriter, r *http.Request) { m.Lock() defer m.Unlock() httpReq = r fmt.Fprintln(w, `woo`) }, )) defer server.Close() client := aws.RestClient{ Context: aws.Context{ Service: "animals", Region: "us-west-2", Credentials: aws.Creds( "accessKeyID", "secretAccessKey", "securityToken", ), }, Client: http.DefaultClient, } req, err := http.NewRequest("GET", server.URL+"/yay", nil) if err != nil { t.Fatal(err) } resp, err := client.Do(req) if err != nil { t.Fatal(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { t.Fatal(err) } if v, want := string(body), "woo\n"; v != want { t.Errorf("Response entity was %q, but expected %q", v, want) } m.Lock() defer m.Unlock() if v, want := httpReq.Method, "GET"; v != want { t.Errorf("Method was %v but expected %v", v, want) } if httpReq.Header.Get("Authorization") == "" { t.Error("Authorization header is missing") } if v, want := httpReq.Header.Get("User-Agent"), "aws-go"; v != want { t.Errorf("User-Agent was %v but expected %v", v, want) } if v, want := httpReq.URL.String(), "/yay"; v != want { t.Errorf("URL was %v but expected %v", v, want) } }