@@ -12,6 +12,7 @@ import (
1212 "github.com/gophercloud/gophercloud/v2"
1313 "github.com/gophercloud/gophercloud/v2/openstack/compute/v2/keypairs"
1414 "github.com/gophercloud/gophercloud/v2/pagination"
15+ "github.com/larkly/lazystack/internal/shared"
1516 "golang.org/x/crypto/ssh"
1617)
1718
@@ -23,6 +24,7 @@ type KeyPair struct {
2324
2425// ListKeyPairs fetches all keypairs.
2526func ListKeyPairs (ctx context.Context , client * gophercloud.ServiceClient ) ([]KeyPair , error ) {
27+ shared .Debugf ("[compute] listing keypairs" )
2628 var result []KeyPair
2729 err := keypairs .List (client , keypairs.ListOpts {}).EachPage (ctx , func (_ context.Context , page pagination.Page ) (bool , error ) {
2830 extracted , err := keypairs .ExtractKeyPairs (page )
@@ -38,8 +40,10 @@ func ListKeyPairs(ctx context.Context, client *gophercloud.ServiceClient) ([]Key
3840 return true , nil
3941 })
4042 if err != nil {
43+ shared .Debugf ("[compute] list keypairs: %v" , err )
4144 return nil , fmt .Errorf ("listing keypairs: %w" , err )
4245 }
46+ shared .Debugf ("[compute] listed %d keypairs" , len (result ))
4347 return result , nil
4448}
4549
@@ -54,23 +58,27 @@ type KeyPairFull struct {
5458// GenerateAndImportKeyPair generates a keypair locally and imports the public key.
5559// algorithm is "rsa" or "ed25519". keySize is only used for RSA (e.g. 2048, 4096).
5660func GenerateAndImportKeyPair (ctx context.Context , client * gophercloud.ServiceClient , name , algorithm string , keySize int ) (* KeyPairFull , error ) {
61+ shared .Debugf ("[compute] generating and importing keypair %q (algorithm=%s)" , name , algorithm )
5762 var pubKeyBytes []byte
5863 var privKeyPEM string
5964
6065 switch algorithm {
6166 case "ed25519" :
6267 pub , priv , err := ed25519 .GenerateKey (rand .Reader )
6368 if err != nil {
69+ shared .Debugf ("[compute] generate ed25519 key %q: %v" , name , err )
6470 return nil , fmt .Errorf ("generating ed25519 key: %w" , err )
6571 }
6672 sshPub , err := ssh .NewPublicKey (pub )
6773 if err != nil {
74+ shared .Debugf ("[compute] convert ed25519 public key %q: %v" , name , err )
6875 return nil , fmt .Errorf ("converting ed25519 public key: %w" , err )
6976 }
7077 pubKeyBytes = ssh .MarshalAuthorizedKey (sshPub )
7178
7279 privBytes , err := x509 .MarshalPKCS8PrivateKey (priv )
7380 if err != nil {
81+ shared .Debugf ("[compute] marshal ed25519 private key %q: %v" , name , err )
7482 return nil , fmt .Errorf ("marshaling ed25519 private key: %w" , err )
7583 }
7684 privKeyPEM = string (pem .EncodeToMemory (& pem.Block {
@@ -84,10 +92,12 @@ func GenerateAndImportKeyPair(ctx context.Context, client *gophercloud.ServiceCl
8492 }
8593 privKey , err := rsa .GenerateKey (rand .Reader , keySize )
8694 if err != nil {
95+ shared .Debugf ("[compute] generate rsa key %q (%d bits): %v" , name , keySize , err )
8796 return nil , fmt .Errorf ("generating rsa key (%d bits): %w" , keySize , err )
8897 }
8998 sshPub , err := ssh .NewPublicKey (& privKey .PublicKey )
9099 if err != nil {
100+ shared .Debugf ("[compute] convert rsa public key %q: %v" , name , err )
91101 return nil , fmt .Errorf ("converting rsa public key: %w" , err )
92102 }
93103 pubKeyBytes = ssh .MarshalAuthorizedKey (sshPub )
@@ -103,22 +113,27 @@ func GenerateAndImportKeyPair(ctx context.Context, client *gophercloud.ServiceCl
103113 // Import via Nova
104114 kp , err := ImportKeyPair (ctx , client , name , pubKeyStr )
105115 if err != nil {
116+ shared .Debugf ("[compute] generate and import keypair %q: %v" , name , err )
106117 return nil , err
107118 }
119+ shared .Debugf ("[compute] generated and imported keypair %q" , name )
108120 kp .PrivateKey = privKeyPEM
109121 return kp , nil
110122}
111123
112124// ImportKeyPair imports an existing public key.
113125func ImportKeyPair (ctx context.Context , client * gophercloud.ServiceClient , name , publicKey string ) (* KeyPairFull , error ) {
126+ shared .Debugf ("[compute] importing keypair %q" , name )
114127 opts := keypairs.CreateOpts {
115128 Name : name ,
116129 PublicKey : publicKey ,
117130 }
118131 kp , err := keypairs .Create (ctx , client , opts ).Extract ()
119132 if err != nil {
133+ shared .Debugf ("[compute] import keypair %q: %v" , name , err )
120134 return nil , fmt .Errorf ("importing keypair %s: %w" , name , err )
121135 }
136+ shared .Debugf ("[compute] imported keypair %q" , name )
122137 return & KeyPairFull {
123138 Name : kp .Name ,
124139 Type : kp .Type ,
@@ -128,10 +143,13 @@ func ImportKeyPair(ctx context.Context, client *gophercloud.ServiceClient, name,
128143
129144// GetKeyPair fetches a single keypair by name.
130145func GetKeyPair (ctx context.Context , client * gophercloud.ServiceClient , name string ) (* KeyPairFull , error ) {
146+ shared .Debugf ("[compute] getting keypair %q" , name )
131147 kp , err := keypairs .Get (ctx , client , name , keypairs.GetOpts {}).Extract ()
132148 if err != nil {
149+ shared .Debugf ("[compute] get keypair %q: %v" , name , err )
133150 return nil , fmt .Errorf ("getting keypair %s: %w" , name , err )
134151 }
152+ shared .Debugf ("[compute] got keypair %q" , name )
135153 return & KeyPairFull {
136154 Name : kp .Name ,
137155 Type : kp .Type ,
@@ -141,9 +159,12 @@ func GetKeyPair(ctx context.Context, client *gophercloud.ServiceClient, name str
141159
142160// DeleteKeyPair deletes a keypair by name.
143161func DeleteKeyPair (ctx context.Context , client * gophercloud.ServiceClient , name string ) error {
162+ shared .Debugf ("[compute] deleting keypair %q" , name )
144163 r := keypairs .Delete (ctx , client , name , keypairs.DeleteOpts {})
145164 if r .Err != nil {
165+ shared .Debugf ("[compute] delete keypair %q: %v" , name , r .Err )
146166 return fmt .Errorf ("deleting keypair %s: %w" , name , r .Err )
147167 }
168+ shared .Debugf ("[compute] deleted keypair %q" , name )
148169 return nil
149170}
0 commit comments