Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[v13] Get locks in tctl get all #27294

Merged
merged 5 commits into from Jun 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
20 changes: 20 additions & 0 deletions lib/services/local/resource.go
Expand Up @@ -101,6 +101,8 @@ func itemsFromResource(resource types.Resource) ([]backend.Item, error) {
item, err = itemFromSAMLConnector(r)
case types.ProvisionToken:
item, err = itemFromProvisionToken(r)
case types.Lock:
item, err = itemFromLock(r)
default:
return nil, trace.NotImplemented("cannot itemFrom resource of type %T", resource)
}
Expand Down Expand Up @@ -350,6 +352,24 @@ func itemsFromLocalAuthSecrets(user string, auth types.LocalAuthSecrets) ([]back
return items, nil
}

// itemFromLock attempts to encode the supplied lock as an
// instance of `backend.Item` suitable for storage.
func itemFromLock(l types.Lock) (*backend.Item, error) {
if err := l.CheckAndSetDefaults(); err != nil {
return nil, trace.Wrap(err)
}
value, err := services.MarshalLock(l)
if err != nil {
return nil, trace.Wrap(err)
}
return &backend.Item{
Key: backend.Key(locksPrefix, l.GetName()),
Value: value,
Expires: l.Expiry(),
ID: l.GetResourceID(),
}, nil
}

// TODO: convert username/suffix ops to work on bytes by default; string/byte conversion
// has order N cost.

Expand Down
20 changes: 20 additions & 0 deletions lib/services/local/resource_test.go
Expand Up @@ -26,6 +26,7 @@ import (
"github.com/jonboulle/clockwork"
"github.com/stretchr/testify/require"
"golang.org/x/crypto/bcrypt"
"google.golang.org/protobuf/testing/protocmp"

apidefaults "github.com/gravitational/teleport/api/defaults"
"github.com/gravitational/teleport/api/types"
Expand Down Expand Up @@ -230,3 +231,22 @@ func newUserTestCase(t *testing.T, name string, roles []string, withSecrets bool
}
return &user
}

func TestBootstrapLock(t *testing.T) {
t.Parallel()
ctx := context.Background()
tt := setupServicesContext(ctx, t)

nl, err := types.NewLock("test", types.LockSpecV2{
Target: types.LockTarget{
User: "user",
},
Message: "lock test",
})
require.NoError(t, err)
require.NoError(t, CreateResources(ctx, tt.bk, nl))

l, err := tt.suite.Access.GetLock(ctx, "test")
require.NoError(t, err)
require.Empty(t, cmp.Diff(nl, l, protocmp.Transform()))
}
18 changes: 18 additions & 0 deletions lib/services/resource.go
Expand Up @@ -554,6 +554,24 @@ func init() {
}
return token, nil
})
RegisterResourceMarshaler(types.KindLock, func(resource types.Resource, opts ...MarshalOption) ([]byte, error) {
lock, ok := resource.(types.Lock)
if !ok {
return nil, trace.BadParameter("expected lock, got %T", resource)
}
bytes, err := MarshalLock(lock, opts...)
if err != nil {
return nil, trace.Wrap(err)
}
return bytes, nil
})
RegisterResourceUnmarshaler(types.KindLock, func(bytes []byte, opts ...MarshalOption) (types.Resource, error) {
lock, err := UnmarshalLock(bytes, opts...)
if err != nil {
return nil, trace.Wrap(err)
}
return lock, nil
})
}

// MarshalResource attempts to marshal a resource dynamically, returning NotImplementedError
Expand Down