func (srv *Server) describeInstances(w http.ResponseWriter, req *http.Request, reqId string) interface{} { srv.mu.Lock() defer srv.mu.Unlock() insts := make(map[*Instance]bool) for name, vals := range req.Form { if !strings.HasPrefix(name, "InstanceId.") { continue } inst := srv.instances[vals[0]] if inst == nil { fatalf(400, "InvalidInstanceID.NotFound", "instance %q not found", vals[0]) } insts[inst] = true } f := newFilter(req.Form) var resp ec2.InstancesResp resp.RequestId = reqId for _, r := range srv.reservations { var instances []ec2.Instance var groups []ec2.SecurityGroup for _, g := range r.groups { groups = append(groups, g.ec2SecurityGroup()) } for _, inst := range r.instances { if len(insts) > 0 && !insts[inst] { continue } // make instances in state "shutting-down" to transition // to "terminated" first, so we can simulate: shutdown, // subsequent refresh of the state with Instances(), // terminated. if inst.state == ShuttingDown { inst.state = Terminated } ok, err := f.ok(inst) if ok { instance := inst.ec2instance() instance.SecurityGroups = groups instances = append(instances, instance) } else if err != nil { fatalf(400, "InvalidParameterValue", "describe instances: %v", err) } } if len(instances) > 0 { resp.Reservations = append(resp.Reservations, ec2.Reservation{ ReservationId: r.id, OwnerId: ownerId, Instances: instances, SecurityGroups: groups, }) } } return &resp }
func (srv *Server) describeInstances(w http.ResponseWriter, req *http.Request, reqId string) interface{} { srv.mu.Lock() defer srv.mu.Unlock() insts := make(map[*Instance]bool) for name, vals := range req.Form { if !strings.HasPrefix(name, "InstanceId.") { continue } inst := srv.instances[vals[0]] if inst == nil { fatalf(400, "InvalidInstanceID.NotFound", "instance %q not found", vals[0]) } insts[inst] = true } f := newFilter(req.Form) var resp ec2.InstancesResp resp.RequestId = reqId for _, r := range srv.reservations { var instances []ec2.Instance for _, inst := range r.instances { if len(insts) > 0 && !insts[inst] { continue } ok, err := f.ok(inst) if ok { instances = append(instances, inst.ec2instance()) } else if err != nil { fatalf(400, "InvalidParameterValue", "describe instances: %v", err) } } if len(instances) > 0 { var groups []ec2.SecurityGroup for _, g := range r.groups { groups = append(groups, g.ec2SecurityGroup()) } resp.Reservations = append(resp.Reservations, ec2.Reservation{ ReservationId: r.id, OwnerId: ownerId, Instances: instances, SecurityGroups: groups, }) } } return &resp }