@@ -44,7 +44,15 @@ func NewRotator(ctx context.Context, logger *Logger) (*Rotator, error) {
4444 }, nil
4545}
4646
47- func (r * Rotator ) Rotate (ctx context.Context , serviceAccountEmail , name , bucket string , expiryInDays , renewalWindowInDays int ) error {
47+ func (r * Rotator ) Rotate (ctx context.Context ,
48+ serviceAccountEmail ,
49+ name ,
50+ bucket string ,
51+ expiryInDays ,
52+ renewalWindowInDays int ,
53+ forceCreate ,
54+ forceDelete bool ) error {
55+
4856 r .logger .Info ("checking keys for service account" , "service_account" , serviceAccountEmail )
4957
5058 resource := "projects/-/serviceAccounts/" + serviceAccountEmail
@@ -79,28 +87,33 @@ func (r *Rotator) Rotate(ctx context.Context, serviceAccountEmail, name, bucket
7987 for _ , k := range userManagedKeys .Keys {
8088 id := strings .Split (k .Name , "/" )[5 ]
8189 cn := commonNames [id ]
82- if cn != name {
83- continue
84- }
8590
8691 validBefore , err := time .Parse (time .RFC3339 , k .ValidBeforeTime )
8792 if err != nil {
8893 return err
8994 }
9095
96+ if (forceDelete && cn == name ) || now .After (validBefore ) {
97+ keysToRemove = append (keysToRemove , k .Name )
98+ }
99+
100+ if cn != name {
101+ continue
102+ }
103+
91104 pivotDate := validBefore .AddDate (0 , 0 , - renewalWindowInDays )
92105
93106 if now .Before (pivotDate ) {
94107 createNewKey = false
95108 }
96-
97- if now .After (validBefore ) {
98- keysToRemove = append (keysToRemove , k .Name )
99- }
100109 }
101110
102- if createNewKey {
103- r .logger .Info ("current key is about to expire, uploading a new one" , "service_account" , serviceAccountEmail )
111+ if forceCreate || createNewKey {
112+ if forceCreate {
113+ r .logger .Info ("creating and uploading a new key (forced)" , "service_account" , serviceAccountEmail )
114+ } else {
115+ r .logger .Info ("current key is about to expire, uploading a new one" , "service_account" , serviceAccountEmail )
116+ }
104117 if err := r .uploadNewKey (ctx , account , name , bucket , notBefore , notAfter ); err != nil {
105118 return err
106119 }
@@ -110,7 +123,11 @@ func (r *Rotator) Rotate(ctx context.Context, serviceAccountEmail, name, bucket
110123 if _ , err := r .iamService .Projects .ServiceAccounts .Keys .Delete (k ).Context (ctx ).Do (); err != nil {
111124 r .logger .Warn ("failed to delete expired key" , "service_account" , serviceAccountEmail , "key_id" , k , "err" , err )
112125 }
113- r .logger .Info ("deleted expired key" , "service_account" , serviceAccountEmail , "key_id" , k )
126+ if forceDelete {
127+ r .logger .Info ("deleted existing key (forced)" , "service_account" , serviceAccountEmail , "key_id" , k )
128+ } else {
129+ r .logger .Info ("deleted expired key" , "service_account" , serviceAccountEmail , "key_id" , k )
130+ }
114131 }
115132
116133 if ! createNewKey && len (keysToRemove ) == 0 {
0 commit comments