in iot-onboarding-service/src/cloudrack-lambda-core/iot/iot.go [73:135]
func (cfg Config) DeleteDevice(device Device) error {
policyName := device.Name + "Policy"
//1-Detach policy from certificate
policyAttachementInput := awsiot.DetachPolicyInput{
PolicyName: aws.String(policyName),
Target: aws.String(device.CertificateArn),
}
_, err1 := cfg.Client.DetachPolicy(&policyAttachementInput)
if err1 != nil {
//non blocking error since if it can't detach. delete policy will fail
log.Printf("[IOT][DELETE] Error during DetachPolicy : %+v", err1)
}
//2-Detach thing from certificate
attachmentInput := awsiot.DetachThingPrincipalInput{
Principal: aws.String(device.CertificateArn),
ThingName: aws.String(device.Name),
}
_, err2 := cfg.Client.DetachThingPrincipal(&attachmentInput)
if err2 != nil {
//non blocking error since if it can't detach. delete policy will fail
log.Printf("[IOT][DELETE] Error during DetachThingPrincipal: %+v", err2)
}
//3-Delete Policy
policyInput := awsiot.DeletePolicyInput{
PolicyName: aws.String(policyName),
}
_, err3 := cfg.Client.DeletePolicy(&policyInput)
if isErrorForDelete(err3) {
log.Printf("[IOT][DELETE] Error during DeletePolicy:%+v", err3)
return err3
}
//4-Delete Certificate
//To delete cretificate we must first deactivate it
certifDeactivateInput := awsiot.UpdateCertificateInput{
CertificateId: aws.String(device.CertificateId),
NewStatus: aws.String("INACTIVE"),
}
_, err41 := cfg.Client.UpdateCertificate(&certifDeactivateInput)
if err41 != nil {
//non blocking error since if it can't deactivate. delete certificate will fail
log.Printf("[IOT][DELETE] Error during Deactivating certificate: %+v", err41)
}
credsInput := awsiot.DeleteCertificateInput{
CertificateId: aws.String(device.CertificateId),
ForceDelete: aws.Bool(true),
}
_, err42 := cfg.Client.DeleteCertificate(&credsInput)
if isErrorForDelete(err42) {
log.Printf("[IOT][DELETE] Error during DeleteCertificate: %+v", err42)
return err42
}
//5-Delete Thing
thingINput := awsiot.DeleteThingInput{
ThingName: aws.String(device.Name),
}
_, err5 := cfg.Client.DeleteThing(&thingINput)
if isErrorForDelete(err5) {
log.Printf("[IOT][DELETE] Error during DeleteThingInput: %+v", err5)
return err5
}
return nil
}