This repository has been archived by the owner on Jun 15, 2021. It is now read-only.
/
main.go
72 lines (60 loc) · 2.01 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
Copyright 2018 Expedia Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package main
import (
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ec2"
corev1 "k8s.io/api/core/v1"
)
type awsNodeProvider struct {
ec2Client *ec2.EC2
}
// NodeProvider is the symbol resolved by the plugin package (https://golang.org/pkg/plugin/) when loading nodeReaper
// plugins. It provides a concrete implementation of an aws plugin.
var NodeProvider awsNodeProvider
// Type returns the Node Provider Type
// The string returned must match the prefix of the node's spec.providerID. The prefix is the text before colon, in other words with regex (?:(?!:).)*
// Example: for the node spec below, it has to match aws.
// ---
// spec:
// externalID: i-0cd1c351f3c0d11a1
// providerID: aws:///us-west-2a/i-0cd1c351f3c0d11a1
// unschedulable: true
func (anp *awsNodeProvider) Type() string {
return "aws"
}
// Reap Reaps a node
func (anp *awsNodeProvider) Reap(node corev1.Node) error {
anp.ec2Client = newEc2Client()
return anp.terminateInstance(node.Spec.ExternalID)
}
func (anp *awsNodeProvider) terminateInstance(id string) error {
dryRun := false
instanceID := id
_, err := anp.ec2Client.TerminateInstances(
&ec2.TerminateInstancesInput{
DryRun: &dryRun,
InstanceIds: []*string{&instanceID},
},
)
if err != nil {
return err
}
return nil
}
func newEc2Client() *ec2.EC2 {
sess := session.Must(session.NewSessionWithOptions(session.Options{
SharedConfigState: session.SharedConfigEnable,
}))
return ec2.New(sess)
}