// NewAutoScalingGroup creates an AutoScalingGroup from the AWS API's autoscaling.Group func NewAutoScalingGroup(region string, asg *autoscaling.Group) *AutoScalingGroup { a := AutoScalingGroup{ Resource: Resource{ region: reapable.Region(region), id: reapable.ID(*asg.AutoScalingGroupName), Name: *asg.AutoScalingGroupName, Tags: make(map[string]string), }, Group: *asg, } for _, instance := range asg.Instances { a.Instances = append(a.Instances, reapable.ID(*instance.InstanceId)) } for _, tag := range asg.Tags { a.Resource.Tags[*tag.Key] = *tag.Value } if a.Tagged("aws:cloudformation:stack-name") { a.Dependency = true a.IsInCloudformation = true } if a.Tagged(reaperTag) { // restore previously tagged state a.reaperState = state.NewStateWithTag(a.Tag(reaperTag)) } else { // initial state a.reaperState = state.NewState() } return &a }
// NewCloudformation creates a new Cloudformation from the AWS API's cloudformation.Stack func NewCloudformation(region string, stack *cloudformation.Stack) *Cloudformation { a := Cloudformation{ Resource: Resource{ region: reapable.Region(region), id: reapable.ID(*stack.StackId), Name: *stack.StackName, Tags: make(map[string]string), reaperState: state.NewStateWithUntil(time.Now().Add(config.Notifications.FirstStateDuration.Duration)), }, Stack: *stack, } // because getting resources is rate limited... go func() { a.Lock() for resource := range cloudformationResources(a.Region().String(), a.ID().String()) { a.Resources = append(a.Resources, *resource) } a.Unlock() }() for _, tag := range stack.Tags { a.Resource.Tags[*tag.Key] = *tag.Value } if a.Tagged(reaperTag) { // restore previously tagged state a.reaperState = state.NewStateWithTag(a.Resource.Tag(reaperTag)) } else { // initial state a.reaperState = state.NewState() } return &a }
// NewSecurityGroup creates an SecurityGroup from the AWS API's ec2.SecurityGroup func NewSecurityGroup(region string, sg *ec2.SecurityGroup) *SecurityGroup { s := SecurityGroup{ Resource: Resource{ id: reapable.ID(*sg.GroupId), region: reapable.Region(region), Name: *sg.GroupName, Tags: make(map[string]string), }, SecurityGroup: *sg, } for _, tag := range sg.Tags { s.Resource.Tags[*tag.Key] = *tag.Value } if s.Tagged("aws:cloudformation:stack-name") { s.Dependency = true s.IsInCloudformation = true } if s.Tagged(reaperTag) { // restore previously tagged state s.reaperState = state.NewStateWithTag(s.Resource.Tag(reaperTag)) } else { // initial state s.reaperState = state.NewState() } return &s }
// NewInstance creates an Instance from the AWS API's ec2.Instance func NewInstance(region string, instance *ec2.Instance) *Instance { a := Instance{ Resource: Resource{ id: reapable.ID(*instance.InstanceId), region: reapable.Region(region), // passed in cause not possible to extract out of api Tags: make(map[string]string), }, SecurityGroups: make(map[reapable.ID]string), Instance: *instance, } for _, sg := range instance.SecurityGroups { if sg != nil { a.SecurityGroups[reapable.ID(*sg.GroupId)] = *sg.GroupName } } for _, tag := range instance.Tags { a.Resource.Tags[*tag.Key] = *tag.Value } if a.Tagged("aws:cloudformation:stack-name") { a.Dependency = true a.IsInCloudformation = true } if a.Tagged("aws:autoscaling:groupName") { a.Dependency = true } if a.Tagged("aws:autoscaling:groupName") { a.AutoScaled = true } a.Name = a.Tag("Name") if a.Tagged(reaperTag) { // restore previously tagged state a.reaperState = state.NewStateWithTag(a.Tag(reaperTag)) } else { // initial state a.reaperState = state.NewState() } return &a }