Merge branch 'tmessi-target-refact' (#1573)
This commit is contained in:
50 files changed
+2429
-1737
No files matched your search
@@ -129,6 +129,7 @@ protobuild:
|
||||
@protoc-go-inject-tag -input=./internal/kms/store/session_key.pb.go
|
||||
@protoc-go-inject-tag -input=./internal/kms/store/oidc_key.pb.go
|
||||
@protoc-go-inject-tag -input=./internal/target/store/target.pb.go
|
||||
@protoc-go-inject-tag -input=./internal/target/tcp/store/target.pb.go
|
||||
@protoc-go-inject-tag -input=./internal/auth/oidc/store/oidc.pb.go
|
||||
@protoc-go-inject-tag -input=./internal/scheduler/job/store/job.pb.go
|
||||
@protoc-go-inject-tag -input=./internal/credential/store/credential.pb.go
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
/boundary
|
||||
@@ -0,0 +1,6 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
// Enable tcp target support.
|
||||
_ "github.com/hashicorp/boundary/internal/target/tcp"
|
||||
)
|
||||
@@ -12,6 +12,7 @@ import (
|
||||
"github.com/hashicorp/boundary/internal/kms"
|
||||
"github.com/hashicorp/boundary/internal/servers/controller/auth"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
"github.com/hashicorp/boundary/internal/target/tcp"
|
||||
"github.com/hashicorp/boundary/internal/types/scope"
|
||||
"github.com/hashicorp/go-secure-stdlib/base62"
|
||||
)
|
||||
@@ -495,7 +496,7 @@ func (b *Server) CreateInitialTarget(ctx context.Context) (target.Target, error)
|
||||
|
||||
// Host Catalog
|
||||
if b.DevTargetId == "" {
|
||||
b.DevTargetId, err = db.NewPublicId(target.TcpTargetPrefix)
|
||||
b.DevTargetId, err = db.NewPublicId(tcp.TargetPrefix)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error generating initial target id: %w", err)
|
||||
}
|
||||
@@ -512,11 +513,11 @@ func (b *Server) CreateInitialTarget(ctx context.Context) (target.Target, error)
|
||||
target.WithSessionConnectionLimit(int32(b.DevTargetSessionConnectionLimit)),
|
||||
target.WithPublicId(b.DevTargetId),
|
||||
}
|
||||
t, err := target.NewTcpTarget(b.DevProjectId, opts...)
|
||||
t, err := tcp.New(b.DevProjectId, opts...)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error creating in memory target: %w", err)
|
||||
}
|
||||
tt, _, _, err := targetRepo.CreateTcpTarget(cancelCtx, t, opts...)
|
||||
tt, _, _, err := targetRepo.CreateTarget(cancelCtx, t, opts...)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error saving target to the db: %w", err)
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ import (
|
||||
"github.com/hashicorp/boundary/internal/servers/controller"
|
||||
"github.com/hashicorp/boundary/internal/servers/controller/handlers"
|
||||
"github.com/hashicorp/boundary/internal/servers/worker"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
"github.com/hashicorp/boundary/internal/target/tcp"
|
||||
"github.com/hashicorp/boundary/internal/types/scope"
|
||||
"github.com/hashicorp/go-secure-stdlib/parseutil"
|
||||
"github.com/hashicorp/go-secure-stdlib/strutil"
|
||||
@@ -373,7 +373,7 @@ func (c *Command) Run(args []string) int {
|
||||
c.DevHostCatalogId = fmt.Sprintf("%s_%s", static.HostCatalogPrefix, c.flagIdSuffix)
|
||||
c.DevHostSetId = fmt.Sprintf("%s_%s", static.HostSetPrefix, c.flagIdSuffix)
|
||||
c.DevHostId = fmt.Sprintf("%s_%s", static.HostPrefix, c.flagIdSuffix)
|
||||
c.DevTargetId = fmt.Sprintf("%s_%s", target.TcpTargetPrefix, c.flagIdSuffix)
|
||||
c.DevTargetId = fmt.Sprintf("%s_%s", tcp.TargetPrefix, c.flagIdSuffix)
|
||||
}
|
||||
if c.flagLoginName != "" {
|
||||
c.DevLoginName = c.flagLoginName
|
||||
|
||||
@@ -17,6 +17,7 @@ import (
|
||||
"github.com/hashicorp/boundary/internal/scheduler"
|
||||
"github.com/hashicorp/boundary/internal/session"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
"github.com/hashicorp/boundary/internal/target/tcp"
|
||||
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||
vault "github.com/hashicorp/vault/api"
|
||||
"github.com/stretchr/testify/assert"
|
||||
@@ -815,7 +816,7 @@ func TestTokenRevocationJob_Run(t *testing.T) {
|
||||
hs := static.TestSets(t, conn, hc.GetPublicId(), 1)[0]
|
||||
h := static.TestHosts(t, conn, hc.GetPublicId(), 1)[0]
|
||||
static.TestSetMembers(t, conn, hs.GetPublicId(), []*static.Host{h})
|
||||
tar := target.TestTcpTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
tar := tcp.TestTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
target.TestCredentialLibrary(t, conn, tar.GetPublicId(), cl.GetPublicId())
|
||||
sess := session.TestSession(t, conn, wrapper, session.ComposedOf{
|
||||
UserId: uId,
|
||||
@@ -1008,7 +1009,7 @@ func TestCredentialRenewalJob_RunLimits(t *testing.T) {
|
||||
hs := static.TestSets(t, conn, hc.GetPublicId(), 1)[0]
|
||||
h := static.TestHosts(t, conn, hc.GetPublicId(), 1)[0]
|
||||
static.TestSetMembers(t, conn, hs.GetPublicId(), []*static.Host{h})
|
||||
tar := target.TestTcpTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
tar := tcp.TestTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
target.TestCredentialLibrary(t, conn, tar.GetPublicId(), cl.GetPublicId())
|
||||
sess := session.TestSession(t, conn, wrapper, session.ComposedOf{
|
||||
UserId: uId,
|
||||
@@ -1117,7 +1118,7 @@ func TestCredentialRenewalJob_Run(t *testing.T) {
|
||||
hs := static.TestSets(t, conn, hc.GetPublicId(), 1)[0]
|
||||
h := static.TestHosts(t, conn, hc.GetPublicId(), 1)[0]
|
||||
static.TestSetMembers(t, conn, hs.GetPublicId(), []*static.Host{h})
|
||||
tar := target.TestTcpTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
tar := tcp.TestTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
sess := session.TestSession(t, conn, wrapper, session.ComposedOf{
|
||||
UserId: uId,
|
||||
HostId: h.GetPublicId(),
|
||||
@@ -1223,7 +1224,7 @@ func TestCredentialRenewalJob_RunExpired(t *testing.T) {
|
||||
hs := static.TestSets(t, conn, hc.GetPublicId(), 1)[0]
|
||||
h := static.TestHosts(t, conn, hc.GetPublicId(), 1)[0]
|
||||
static.TestSetMembers(t, conn, hs.GetPublicId(), []*static.Host{h})
|
||||
tar := target.TestTcpTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
tar := tcp.TestTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
sess := session.TestSession(t, conn, wrapper, session.ComposedOf{
|
||||
UserId: uId,
|
||||
HostId: h.GetPublicId(),
|
||||
@@ -1296,7 +1297,7 @@ func TestCredentialRenewalJob_NextRunIn(t *testing.T) {
|
||||
hs := static.TestSets(t, conn, hc.GetPublicId(), 1)[0]
|
||||
h := static.TestHosts(t, conn, hc.GetPublicId(), 1)[0]
|
||||
static.TestSetMembers(t, conn, hs.GetPublicId(), []*static.Host{h})
|
||||
tar := target.TestTcpTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
tar := tcp.TestTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
target.TestCredentialLibrary(t, conn, tar.GetPublicId(), cl.GetPublicId())
|
||||
sess := session.TestSession(t, conn, wrapper, session.ComposedOf{
|
||||
UserId: uId,
|
||||
@@ -1535,7 +1536,7 @@ func TestCredentialRevocationJob_RunLimits(t *testing.T) {
|
||||
hs := static.TestSets(t, conn, hc.GetPublicId(), 1)[0]
|
||||
h := static.TestHosts(t, conn, hc.GetPublicId(), 1)[0]
|
||||
static.TestSetMembers(t, conn, hs.GetPublicId(), []*static.Host{h})
|
||||
tar := target.TestTcpTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
tar := tcp.TestTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
target.TestCredentialLibrary(t, conn, tar.GetPublicId(), cl.GetPublicId())
|
||||
sess := session.TestSession(t, conn, wrapper, session.ComposedOf{
|
||||
UserId: uId,
|
||||
@@ -1646,7 +1647,7 @@ func TestCredentialRevocationJob_Run(t *testing.T) {
|
||||
hs := static.TestSets(t, conn, hc.GetPublicId(), 1)[0]
|
||||
h := static.TestHosts(t, conn, hc.GetPublicId(), 1)[0]
|
||||
static.TestSetMembers(t, conn, hs.GetPublicId(), []*static.Host{h})
|
||||
tar := target.TestTcpTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
tar := tcp.TestTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
sess := session.TestSession(t, conn, wrapper, session.ComposedOf{
|
||||
UserId: uId,
|
||||
HostId: h.GetPublicId(),
|
||||
@@ -1736,7 +1737,7 @@ func TestCredentialRevocationJob_RunDeleted(t *testing.T) {
|
||||
hs := static.TestSets(t, conn, hc.GetPublicId(), 1)[0]
|
||||
h := static.TestHosts(t, conn, hc.GetPublicId(), 1)[0]
|
||||
static.TestSetMembers(t, conn, hs.GetPublicId(), []*static.Host{h})
|
||||
tar := target.TestTcpTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
tar := tcp.TestTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
sess := session.TestSession(t, conn, wrapper, session.ComposedOf{
|
||||
UserId: uId,
|
||||
HostId: h.GetPublicId(),
|
||||
@@ -2114,7 +2115,7 @@ func TestCredentialCleanupJob_Run(t *testing.T) {
|
||||
hs := static.TestSets(t, conn, hc.GetPublicId(), 1)[0]
|
||||
h := static.TestHosts(t, conn, hc.GetPublicId(), 1)[0]
|
||||
static.TestSetMembers(t, conn, hs.GetPublicId(), []*static.Host{h})
|
||||
tar := target.TestTcpTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
tar := tcp.TestTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
sess1 := session.TestSession(t, conn, wrapper, session.ComposedOf{
|
||||
UserId: uId,
|
||||
HostId: h.GetPublicId(),
|
||||
|
||||
@@ -16,6 +16,7 @@ import (
|
||||
"github.com/hashicorp/boundary/internal/scheduler"
|
||||
"github.com/hashicorp/boundary/internal/session"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
"github.com/hashicorp/boundary/internal/target/tcp"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
@@ -103,7 +104,7 @@ func TestRepository_IssueCredentials(t *testing.T) {
|
||||
h := static.TestHosts(t, conn, hc.GetPublicId(), 1)[0]
|
||||
static.TestSetMembers(t, conn, hs.GetPublicId(), []*static.Host{h})
|
||||
|
||||
tar := target.TestTcpTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
tar := tcp.TestTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
|
||||
rc2dc := func(rcs []credential.Request) []*session.DynamicCredential {
|
||||
var dcs []*session.DynamicCredential
|
||||
@@ -221,7 +222,7 @@ func TestRepository_Revoke(t *testing.T) {
|
||||
h := static.TestHosts(t, conn, hc.GetPublicId(), 1)[0]
|
||||
static.TestSetMembers(t, conn, hs.GetPublicId(), []*static.Host{h})
|
||||
|
||||
tar := target.TestTcpTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
tar := tcp.TestTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
target.TestCredentialLibrary(t, conn, tar.GetPublicId(), cl.GetPublicId())
|
||||
|
||||
const (
|
||||
@@ -339,7 +340,7 @@ func Test_TerminateSession(t *testing.T) {
|
||||
h := static.TestHosts(t, conn, hc.GetPublicId(), 1)[0]
|
||||
static.TestSetMembers(t, conn, hs.GetPublicId(), []*static.Host{h})
|
||||
|
||||
tar := target.TestTcpTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
tar := tcp.TestTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
target.TestCredentialLibrary(t, conn, tar.GetPublicId(), cl.GetPublicId())
|
||||
|
||||
const (
|
||||
|
||||
@@ -11,6 +11,7 @@ import (
|
||||
"github.com/hashicorp/boundary/internal/kms"
|
||||
"github.com/hashicorp/boundary/internal/session"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
"github.com/hashicorp/boundary/internal/target/tcp"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
@@ -34,7 +35,7 @@ func Test_TestCredentials(t *testing.T) {
|
||||
h := static.TestHosts(t, conn, hc.GetPublicId(), 1)[0]
|
||||
static.TestSetMembers(t, conn, hs.GetPublicId(), []*static.Host{h})
|
||||
|
||||
tar := target.TestTcpTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
tar := tcp.TestTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
target.TestCredentialLibrary(t, conn, tar.GetPublicId(), cl.GetPublicId())
|
||||
|
||||
at := authtoken.TestAuthToken(t, conn, kms, org.GetPublicId())
|
||||
|
||||
@@ -14,6 +14,7 @@ import (
|
||||
"github.com/hashicorp/boundary/internal/kms"
|
||||
"github.com/hashicorp/boundary/internal/session"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
"github.com/hashicorp/boundary/internal/target/tcp"
|
||||
"github.com/hashicorp/boundary/testing/dbtest"
|
||||
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||
"github.com/stretchr/testify/assert"
|
||||
@@ -79,7 +80,7 @@ func TestMigrations_UserDimension(t *testing.T) {
|
||||
h := static.TestHosts(t, conn, hc.GetPublicId(), 1)[0]
|
||||
static.TestSetMembers(t, conn, hs.GetPublicId(), []*static.Host{h})
|
||||
|
||||
tar := target.TestTcpTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
tar := tcp.TestTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
var sessions []*session.Session
|
||||
|
||||
kmsCache := kms.TestKms(t, conn, wrapper)
|
||||
|
||||
@@ -15,6 +15,7 @@ import (
|
||||
"github.com/hashicorp/boundary/internal/kms"
|
||||
"github.com/hashicorp/boundary/internal/session"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
"github.com/hashicorp/boundary/internal/target/tcp"
|
||||
"github.com/hashicorp/boundary/testing/dbtest"
|
||||
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||
"github.com/stretchr/testify/assert"
|
||||
@@ -81,7 +82,7 @@ func TestMigrations_CredentialDimension(t *testing.T) {
|
||||
h := static.TestHosts(t, conn, hc.GetPublicId(), 1)[0]
|
||||
static.TestSetMembers(t, conn, hs.GetPublicId(), []*static.Host{h})
|
||||
|
||||
tar := target.TestTcpTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
tar := tcp.TestTarget(t, conn, prj.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
var sessions []*session.Session
|
||||
|
||||
kmsCache := kms.TestKms(t, conn, wrapper)
|
||||
@@ -157,12 +158,12 @@ func TestMigrations_CredentialDimension(t *testing.T) {
|
||||
require.Equal(want, state)
|
||||
}
|
||||
|
||||
func testSessionCredentialParams(t *testing.T, conn *db.DB, kms *kms.Kms, wrapper wrapping.Wrapper, tar *target.TcpTarget) []*session.DynamicCredential {
|
||||
func testSessionCredentialParams(t *testing.T, conn *db.DB, kms *kms.Kms, wrapper wrapping.Wrapper, tar target.Target) []*session.DynamicCredential {
|
||||
t.Helper()
|
||||
rw := db.New(conn)
|
||||
|
||||
ctx := context.Background()
|
||||
stores := vault.TestCredentialStores(t, conn, wrapper, tar.ScopeId, 1)
|
||||
stores := vault.TestCredentialStores(t, conn, wrapper, tar.GetScopeId(), 1)
|
||||
libs := vault.TestCredentialLibraries(t, conn, wrapper, stores[0].GetPublicId(), 2)
|
||||
|
||||
targetRepo, err := target.NewRepository(rw, rw, kms)
|
||||
|
||||
@@ -73,70 +73,6 @@ message TargetHostSet {
|
||||
timestamp.v1.Timestamp create_time = 30;
|
||||
}
|
||||
|
||||
message TcpTarget {
|
||||
// public_id is used to access the TargetTcp via an API
|
||||
// @inject_tag: gorm:"primary_key"
|
||||
string public_id = 10;
|
||||
|
||||
// scope id for the TargetTcp
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
string scope_id = 20;
|
||||
|
||||
// name is the optional friendly name used to
|
||||
// access the TargetTcp via an API
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
string name = 30
|
||||
[(custom_options.v1.mask_mapping) = { this: "name" that: "name" }];
|
||||
|
||||
// description of the TargetTcp
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
string description = 40 [(custom_options.v1.mask_mapping) = {
|
||||
this: "description"
|
||||
that: "description"
|
||||
}];
|
||||
|
||||
// create_time from the RDBMS
|
||||
// @inject_tag: `gorm:"default:current_timestamp"`
|
||||
timestamp.v1.Timestamp create_time = 50;
|
||||
|
||||
// update_time from the RDBMS
|
||||
// @inject_tag: `gorm:"default:current_timestamp"`
|
||||
timestamp.v1.Timestamp update_time = 60;
|
||||
|
||||
// version allows optimistic locking of the TargetTcp when modifying the
|
||||
// TargetTcp
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
uint32 version = 70;
|
||||
|
||||
// default port of the TargetTcp
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
uint32 default_port = 80 [(custom_options.v1.mask_mapping) = {
|
||||
this: "DefaultPort"
|
||||
that: "attributes.default_port"
|
||||
}];
|
||||
|
||||
// Maximum total lifetime of a created session, in seconds
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
uint32 session_max_seconds = 100 [(custom_options.v1.mask_mapping) = {
|
||||
this: "SessionMaxSeconds"
|
||||
that: "session_max_seconds"
|
||||
}];
|
||||
|
||||
// Maximum number of connections in a session
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
int32 session_connection_limit = 110 [(custom_options.v1.mask_mapping) = {
|
||||
this: "SessionConnectionLimit"
|
||||
that: "session_connection_limit"
|
||||
}];
|
||||
|
||||
// A boolean expression that allows filtering the workers that can handle a session
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
string worker_filter = 120 [(custom_options.v1.mask_mapping) = {
|
||||
this: "WorkerFilter"
|
||||
that: "worker_filter"
|
||||
}];
|
||||
}
|
||||
|
||||
message CredentialLibrary {
|
||||
// target_id of the Target
|
||||
// @inject_tag: gorm:"primary_key"
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
syntax = "proto3";
|
||||
|
||||
package controller.storage.target.tcp.store.v1;
|
||||
option go_package = "github.com/hashicorp/boundary/internal/target/tcp/store;store";
|
||||
|
||||
import "controller/storage/timestamp/v1/timestamp.proto";
|
||||
import "controller/custom_options/v1/options.proto";
|
||||
|
||||
message Target {
|
||||
// public_id is used to access the tcp.Target via an API
|
||||
// @inject_tag: gorm:"primary_key"
|
||||
string public_id = 10;
|
||||
|
||||
// scope id for the tcp.Target
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
string scope_id = 20;
|
||||
|
||||
// name is the optional friendly name used to
|
||||
// access the tcp.Target via an API
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
string name = 30
|
||||
[(custom_options.v1.mask_mapping) = { this: "name" that: "name" }];
|
||||
|
||||
// description of the tcp.Target
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
string description = 40 [(custom_options.v1.mask_mapping) = {
|
||||
this: "description"
|
||||
that: "description"
|
||||
}];
|
||||
|
||||
// create_time from the RDBMS
|
||||
// @inject_tag: `gorm:"default:current_timestamp"`
|
||||
timestamp.v1.Timestamp create_time = 50;
|
||||
|
||||
// update_time from the RDBMS
|
||||
// @inject_tag: `gorm:"default:current_timestamp"`
|
||||
timestamp.v1.Timestamp update_time = 60;
|
||||
|
||||
// version allows optimistic locking of the tcp.Target when modifying the
|
||||
// tcp.Target
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
uint32 version = 70;
|
||||
|
||||
// default port of the tcp.Target
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
uint32 default_port = 80 [(custom_options.v1.mask_mapping) = {
|
||||
this: "DefaultPort"
|
||||
that: "attributes.default_port"
|
||||
}];
|
||||
|
||||
// Maximum total lifetime of a created session, in seconds
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
uint32 session_max_seconds = 100 [(custom_options.v1.mask_mapping) = {
|
||||
this: "SessionMaxSeconds"
|
||||
that: "session_max_seconds"
|
||||
}];
|
||||
|
||||
// Maximum number of connections in a session
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
int32 session_connection_limit = 110 [(custom_options.v1.mask_mapping) = {
|
||||
this: "SessionConnectionLimit"
|
||||
that: "session_connection_limit"
|
||||
}];
|
||||
|
||||
// A boolean expression that allows filtering the workers that can handle a session
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
string worker_filter = 120 [(custom_options.v1.mask_mapping) = {
|
||||
this: "WorkerFilter"
|
||||
that: "worker_filter"
|
||||
}];
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ import (
|
||||
"github.com/hashicorp/boundary/internal/servers/controller/handlers/sessions"
|
||||
"github.com/hashicorp/boundary/internal/session"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
"github.com/hashicorp/boundary/internal/target/tcp"
|
||||
"github.com/hashicorp/boundary/internal/types/scope"
|
||||
"github.com/hashicorp/boundary/sdk/pbs/controller/api/resources/scopes"
|
||||
pb "github.com/hashicorp/boundary/sdk/pbs/controller/api/resources/sessions"
|
||||
@@ -57,7 +58,7 @@ func TestGetSession(t *testing.T) {
|
||||
hs := static.TestSets(t, conn, hc.GetPublicId(), 1)[0]
|
||||
h := static.TestHosts(t, conn, hc.GetPublicId(), 1)[0]
|
||||
static.TestSetMembers(t, conn, hs.GetPublicId(), []*static.Host{h})
|
||||
tar := target.TestTcpTarget(t, conn, p.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
tar := tcp.TestTarget(t, conn, p.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
|
||||
sess := session.TestSession(t, conn, wrap, session.ComposedOf{
|
||||
UserId: uId,
|
||||
@@ -86,7 +87,7 @@ func TestGetSession(t *testing.T) {
|
||||
Scope: &scopes.ScopeInfo{Id: p.GetPublicId(), Type: scope.Project.String(), ParentScopeId: o.GetPublicId()},
|
||||
States: []*pb.SessionState{{Status: session.StatusPending.String(), StartTime: sess.CreateTime.GetTimestamp()}},
|
||||
Certificate: sess.Certificate,
|
||||
Type: target.TcpSubtype.String(),
|
||||
Type: tcp.Subtype.String(),
|
||||
AuthorizedActions: testAuthorizedActions,
|
||||
}
|
||||
|
||||
@@ -174,7 +175,7 @@ func TestList_Self(t *testing.T) {
|
||||
hs := static.TestSets(t, conn, hc.GetPublicId(), 1)[0]
|
||||
h := static.TestHosts(t, conn, hc.GetPublicId(), 1)[0]
|
||||
static.TestSetMembers(t, conn, hs.GetPublicId(), []*static.Host{h})
|
||||
tar := target.TestTcpTarget(t, conn, pWithSessions.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
tar := tcp.TestTarget(t, conn, pWithSessions.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
|
||||
// By default a user can read/cancel their own sessions.
|
||||
session.TestSession(t, conn, wrap, session.ComposedOf{
|
||||
@@ -258,13 +259,13 @@ func TestList(t *testing.T) {
|
||||
hs := static.TestSets(t, conn, hc.GetPublicId(), 1)[0]
|
||||
h := static.TestHosts(t, conn, hc.GetPublicId(), 1)[0]
|
||||
static.TestSetMembers(t, conn, hs.GetPublicId(), []*static.Host{h})
|
||||
tar := target.TestTcpTarget(t, conn, pWithSessions.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
tar := tcp.TestTarget(t, conn, pWithSessions.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
|
||||
hcOther := static.TestCatalogs(t, conn, pWithOtherSessions.GetPublicId(), 1)[0]
|
||||
hsOther := static.TestSets(t, conn, hcOther.GetPublicId(), 1)[0]
|
||||
hOther := static.TestHosts(t, conn, hcOther.GetPublicId(), 1)[0]
|
||||
static.TestSetMembers(t, conn, hsOther.GetPublicId(), []*static.Host{hOther})
|
||||
tarOther := target.TestTcpTarget(t, conn, pWithOtherSessions.GetPublicId(), "test", target.WithHostSources([]string{hsOther.GetPublicId()}))
|
||||
tarOther := tcp.TestTarget(t, conn, pWithOtherSessions.GetPublicId(), "test", target.WithHostSources([]string{hsOther.GetPublicId()}))
|
||||
|
||||
var wantSession []*pb.Session
|
||||
var totalSession []*pb.Session
|
||||
@@ -298,7 +299,7 @@ func TestList(t *testing.T) {
|
||||
Status: status,
|
||||
States: states,
|
||||
Certificate: sess.Certificate,
|
||||
Type: target.TcpSubtype.String(),
|
||||
Type: tcp.Subtype.String(),
|
||||
AuthorizedActions: testAuthorizedActions,
|
||||
})
|
||||
|
||||
@@ -333,7 +334,7 @@ func TestList(t *testing.T) {
|
||||
Status: status,
|
||||
States: states,
|
||||
Certificate: sess.Certificate,
|
||||
Type: target.TcpSubtype.String(),
|
||||
Type: tcp.Subtype.String(),
|
||||
AuthorizedActions: testAuthorizedActions,
|
||||
})
|
||||
}
|
||||
@@ -469,7 +470,7 @@ func TestCancel(t *testing.T) {
|
||||
hs := static.TestSets(t, conn, hc.GetPublicId(), 1)[0]
|
||||
h := static.TestHosts(t, conn, hc.GetPublicId(), 1)[0]
|
||||
static.TestSetMembers(t, conn, hs.GetPublicId(), []*static.Host{h})
|
||||
tar := target.TestTcpTarget(t, conn, p.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
tar := tcp.TestTarget(t, conn, p.GetPublicId(), "test", target.WithHostSources([]string{hs.GetPublicId()}))
|
||||
|
||||
sess := session.TestSession(t, conn, wrap, session.ComposedOf{
|
||||
UserId: uId,
|
||||
@@ -496,7 +497,7 @@ func TestCancel(t *testing.T) {
|
||||
Scope: &scopes.ScopeInfo{Id: p.GetPublicId(), Type: scope.Project.String(), ParentScopeId: o.GetPublicId()},
|
||||
Status: session.StatusCanceling.String(),
|
||||
Certificate: sess.Certificate,
|
||||
Type: target.TcpSubtype.String(),
|
||||
Type: tcp.Subtype.String(),
|
||||
AuthorizedActions: testAuthorizedActions,
|
||||
}
|
||||
|
||||
|
||||
@@ -29,7 +29,8 @@ import (
|
||||
"github.com/hashicorp/boundary/internal/servers/controller/handlers"
|
||||
"github.com/hashicorp/boundary/internal/session"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
"github.com/hashicorp/boundary/internal/target/store"
|
||||
"github.com/hashicorp/boundary/internal/target/tcp"
|
||||
tcpStore "github.com/hashicorp/boundary/internal/target/tcp/store"
|
||||
"github.com/hashicorp/boundary/internal/types/action"
|
||||
"github.com/hashicorp/boundary/internal/types/resource"
|
||||
"github.com/hashicorp/boundary/internal/types/scope"
|
||||
@@ -77,7 +78,10 @@ var (
|
||||
|
||||
func init() {
|
||||
var err error
|
||||
if maskManager, err = handlers.NewMaskManager(handlers.MaskDestination{&store.TcpTarget{}}, handlers.MaskSource{&pb.Target{}, &pb.TcpTargetAttributes{}}); err != nil {
|
||||
if maskManager, err = handlers.NewMaskManager(
|
||||
handlers.MaskDestination{&tcpStore.Target{}},
|
||||
handlers.MaskSource{&pb.Target{}, &pb.TcpTargetAttributes{}},
|
||||
); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
@@ -992,7 +996,7 @@ HostSourceIterationLoop:
|
||||
|
||||
// Generate the endpoint URL
|
||||
endpointUrl := &url.URL{
|
||||
Scheme: t.GetType(),
|
||||
Scheme: t.GetType().String(),
|
||||
}
|
||||
defaultPort := t.GetDefaultPort()
|
||||
var endpointHost string
|
||||
@@ -1118,7 +1122,7 @@ HostSourceIterationLoop:
|
||||
TargetId: t.GetPublicId(),
|
||||
Scope: authResults.Scope,
|
||||
CreatedTime: sess.CreateTime.GetTimestamp(),
|
||||
Type: t.GetType(),
|
||||
Type: t.GetType().String(),
|
||||
Certificate: sess.Certificate,
|
||||
PrivateKey: privKey,
|
||||
HostId: chosenId.hostId,
|
||||
@@ -1137,7 +1141,7 @@ HostSourceIterationLoop:
|
||||
TargetId: t.GetPublicId(),
|
||||
Scope: authResults.Scope,
|
||||
CreatedTime: sess.CreateTime.GetTimestamp(),
|
||||
Type: t.GetType(),
|
||||
Type: t.GetType().String(),
|
||||
AuthorizationToken: string(encodedMarshaledSad),
|
||||
UserId: authResults.UserId,
|
||||
HostId: chosenId.hostId,
|
||||
@@ -1188,7 +1192,7 @@ func (s Service) createInRepo(ctx context.Context, item *pb.Target) (target.Targ
|
||||
if tcpAttrs.GetDefaultPort().GetValue() != 0 {
|
||||
opts = append(opts, target.WithDefaultPort(tcpAttrs.GetDefaultPort().GetValue()))
|
||||
}
|
||||
u, err := target.NewTcpTarget(item.GetScopeId(), opts...)
|
||||
u, err := tcp.New(item.GetScopeId(), opts...)
|
||||
if err != nil {
|
||||
return nil, nil, nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to build target for creation: %v.", err)
|
||||
}
|
||||
@@ -1196,7 +1200,7 @@ func (s Service) createInRepo(ctx context.Context, item *pb.Target) (target.Targ
|
||||
if err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
out, hs, cl, err := repo.CreateTcpTarget(ctx, u)
|
||||
out, hs, cl, err := repo.CreateTarget(ctx, u)
|
||||
if err != nil {
|
||||
return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create target"))
|
||||
}
|
||||
@@ -1232,7 +1236,7 @@ func (s Service) updateInRepo(ctx context.Context, scopeId, id string, mask []st
|
||||
opts = append(opts, target.WithDefaultPort(tcpAttrs.GetDefaultPort().GetValue()))
|
||||
}
|
||||
version := item.GetVersion()
|
||||
u, err := target.NewTcpTarget(scopeId, opts...)
|
||||
u, err := tcp.New(scopeId, opts...)
|
||||
if err != nil {
|
||||
return nil, nil, nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to build target for update: %v.", err)
|
||||
}
|
||||
@@ -1245,7 +1249,7 @@ func (s Service) updateInRepo(ctx context.Context, scopeId, id string, mask []st
|
||||
if err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
out, hs, cl, rowsUpdated, err := repo.UpdateTcpTarget(ctx, u, version, dbMask)
|
||||
out, hs, cl, rowsUpdated, err := repo.UpdateTarget(ctx, u, version, dbMask)
|
||||
if err != nil {
|
||||
return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to update target"))
|
||||
}
|
||||
@@ -1588,7 +1592,7 @@ func toProto(ctx context.Context, in target.Target, hostSources []target.HostSou
|
||||
// * All required parameters are set
|
||||
// * There are no conflicting parameters provided
|
||||
func validateGetRequest(req *pbs.GetTargetRequest) error {
|
||||
return handlers.ValidateGetRequest(handlers.NoopValidatorFn, req, target.TcpTargetPrefix)
|
||||
return handlers.ValidateGetRequest(handlers.NoopValidatorFn, req, tcp.TargetPrefix)
|
||||
}
|
||||
|
||||
func validateCreateRequest(req *pbs.CreateTargetRequest) error {
|
||||
@@ -1613,7 +1617,7 @@ func validateCreateRequest(req *pbs.CreateTargetRequest) error {
|
||||
badFields[globals.SessionMaxSecondsField] = "This must be greater than zero."
|
||||
}
|
||||
switch target.SubtypeFromType(req.GetItem().GetType()) {
|
||||
case target.TcpSubtype:
|
||||
case tcp.Subtype:
|
||||
tcpAttrs := &pb.TcpTargetAttributes{}
|
||||
if err := handlers.StructToProto(req.GetItem().GetAttributes(), tcpAttrs); err != nil {
|
||||
badFields[globals.AttributesField] = "Attribute fields do not match the expected format."
|
||||
@@ -1657,8 +1661,8 @@ func validateUpdateRequest(req *pbs.UpdateTargetRequest) error {
|
||||
badFields[globals.SessionMaxSecondsField] = "This must be greater than zero."
|
||||
}
|
||||
switch target.SubtypeFromId(req.GetItem().GetType()) {
|
||||
case target.TcpSubtype:
|
||||
if req.GetItem().GetType() != "" && target.SubtypeFromType(req.GetItem().GetType()) != target.TcpSubtype {
|
||||
case tcp.Subtype:
|
||||
if req.GetItem().GetType() != "" && target.SubtypeFromType(req.GetItem().GetType()) != tcp.Subtype {
|
||||
badFields[globals.TypeField] = "Cannot modify the resource type."
|
||||
}
|
||||
tcpAttrs := &pb.TcpTargetAttributes{}
|
||||
@@ -1675,11 +1679,11 @@ func validateUpdateRequest(req *pbs.UpdateTargetRequest) error {
|
||||
}
|
||||
}
|
||||
return badFields
|
||||
}, target.TcpTargetPrefix)
|
||||
}, tcp.TargetPrefix)
|
||||
}
|
||||
|
||||
func validateDeleteRequest(req *pbs.DeleteTargetRequest) error {
|
||||
return handlers.ValidateDeleteRequest(handlers.NoopValidatorFn, req, target.TcpTargetPrefix)
|
||||
return handlers.ValidateDeleteRequest(handlers.NoopValidatorFn, req, tcp.TargetPrefix)
|
||||
}
|
||||
|
||||
func validateListRequest(req *pbs.ListTargetsRequest) error {
|
||||
@@ -1699,7 +1703,7 @@ func validateListRequest(req *pbs.ListTargetsRequest) error {
|
||||
|
||||
func validateAddSetsRequest(req *pbs.AddTargetHostSetsRequest) error {
|
||||
badFields := map[string]string{}
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), target.TcpTargetPrefix) {
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), tcp.TargetPrefix) {
|
||||
badFields[globals.IdField] = "Incorrectly formatted identifier."
|
||||
}
|
||||
if req.GetVersion() == 0 {
|
||||
@@ -1722,7 +1726,7 @@ func validateAddSetsRequest(req *pbs.AddTargetHostSetsRequest) error {
|
||||
|
||||
func validateSetSetsRequest(req *pbs.SetTargetHostSetsRequest) error {
|
||||
badFields := map[string]string{}
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), target.TcpTargetPrefix) {
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), tcp.TargetPrefix) {
|
||||
badFields[globals.IdField] = "Incorrectly formatted identifier."
|
||||
}
|
||||
if req.GetVersion() == 0 {
|
||||
@@ -1742,7 +1746,7 @@ func validateSetSetsRequest(req *pbs.SetTargetHostSetsRequest) error {
|
||||
|
||||
func validateRemoveSetsRequest(req *pbs.RemoveTargetHostSetsRequest) error {
|
||||
badFields := map[string]string{}
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), target.TcpTargetPrefix) {
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), tcp.TargetPrefix) {
|
||||
badFields[globals.IdField] = "Incorrectly formatted identifier."
|
||||
}
|
||||
if req.GetVersion() == 0 {
|
||||
@@ -1765,7 +1769,7 @@ func validateRemoveSetsRequest(req *pbs.RemoveTargetHostSetsRequest) error {
|
||||
|
||||
func validateAddHostSourcesRequest(req *pbs.AddTargetHostSourcesRequest) error {
|
||||
badFields := map[string]string{}
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), target.TcpTargetPrefix) {
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), tcp.TargetPrefix) {
|
||||
badFields[globals.IdField] = "Incorrectly formatted identifier."
|
||||
}
|
||||
if req.GetVersion() == 0 {
|
||||
@@ -1788,7 +1792,7 @@ func validateAddHostSourcesRequest(req *pbs.AddTargetHostSourcesRequest) error {
|
||||
|
||||
func validateSetHostSourcesRequest(req *pbs.SetTargetHostSourcesRequest) error {
|
||||
badFields := map[string]string{}
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), target.TcpTargetPrefix) {
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), tcp.TargetPrefix) {
|
||||
badFields[globals.IdField] = "Incorrectly formatted identifier."
|
||||
}
|
||||
if req.GetVersion() == 0 {
|
||||
@@ -1808,7 +1812,7 @@ func validateSetHostSourcesRequest(req *pbs.SetTargetHostSourcesRequest) error {
|
||||
|
||||
func validateRemoveHostSourcesRequest(req *pbs.RemoveTargetHostSourcesRequest) error {
|
||||
badFields := map[string]string{}
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), target.TcpTargetPrefix) {
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), tcp.TargetPrefix) {
|
||||
badFields[globals.IdField] = "Incorrectly formatted identifier."
|
||||
}
|
||||
if req.GetVersion() == 0 {
|
||||
@@ -1831,7 +1835,7 @@ func validateRemoveHostSourcesRequest(req *pbs.RemoveTargetHostSourcesRequest) e
|
||||
|
||||
func validateAddLibrariesRequest(req *pbs.AddTargetCredentialLibrariesRequest) error {
|
||||
badFields := map[string]string{}
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), target.TcpTargetPrefix) {
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), tcp.TargetPrefix) {
|
||||
badFields[globals.IdField] = "Incorrectly formatted identifier."
|
||||
}
|
||||
if req.GetVersion() == 0 {
|
||||
@@ -1854,7 +1858,7 @@ func validateAddLibrariesRequest(req *pbs.AddTargetCredentialLibrariesRequest) e
|
||||
|
||||
func validateSetLibrariesRequest(req *pbs.SetTargetCredentialLibrariesRequest) error {
|
||||
badFields := map[string]string{}
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), target.TcpTargetPrefix) {
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), tcp.TargetPrefix) {
|
||||
badFields[globals.IdField] = "Incorrectly formatted identifier."
|
||||
}
|
||||
if req.GetVersion() == 0 {
|
||||
@@ -1874,7 +1878,7 @@ func validateSetLibrariesRequest(req *pbs.SetTargetCredentialLibrariesRequest) e
|
||||
|
||||
func validateRemoveLibrariesRequest(req *pbs.RemoveTargetCredentialLibrariesRequest) error {
|
||||
badFields := map[string]string{}
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), target.TcpTargetPrefix) {
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), tcp.TargetPrefix) {
|
||||
badFields[globals.IdField] = "Incorrectly formatted identifier."
|
||||
}
|
||||
if req.GetVersion() == 0 {
|
||||
@@ -1897,7 +1901,7 @@ func validateRemoveLibrariesRequest(req *pbs.RemoveTargetCredentialLibrariesRequ
|
||||
|
||||
func validateAddCredentialSourcesRequest(req *pbs.AddTargetCredentialSourcesRequest) error {
|
||||
badFields := map[string]string{}
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), target.TcpTargetPrefix) {
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), tcp.TargetPrefix) {
|
||||
badFields[globals.IdField] = "Incorrectly formatted identifier."
|
||||
}
|
||||
if req.GetVersion() == 0 {
|
||||
@@ -1920,7 +1924,7 @@ func validateAddCredentialSourcesRequest(req *pbs.AddTargetCredentialSourcesRequ
|
||||
|
||||
func validateSetCredentialSourcesRequest(req *pbs.SetTargetCredentialSourcesRequest) error {
|
||||
badFields := map[string]string{}
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), target.TcpTargetPrefix) {
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), tcp.TargetPrefix) {
|
||||
badFields[globals.IdField] = "Incorrectly formatted identifier."
|
||||
}
|
||||
if req.GetVersion() == 0 {
|
||||
@@ -1940,7 +1944,7 @@ func validateSetCredentialSourcesRequest(req *pbs.SetTargetCredentialSourcesRequ
|
||||
|
||||
func validateRemoveCredentialSourcesRequest(req *pbs.RemoveTargetCredentialSourcesRequest) error {
|
||||
badFields := map[string]string{}
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), target.TcpTargetPrefix) {
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), tcp.TargetPrefix) {
|
||||
badFields[globals.IdField] = "Incorrectly formatted identifier."
|
||||
}
|
||||
if req.GetVersion() == 0 {
|
||||
@@ -1967,7 +1971,7 @@ func validateAuthorizeSessionRequest(req *pbs.AuthorizeSessionRequest) error {
|
||||
scopeIdEmpty := req.GetScopeId() == ""
|
||||
scopeNameEmpty := req.GetScopeName() == ""
|
||||
if nameEmpty {
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), target.TcpTargetPrefix) {
|
||||
if !handlers.ValidId(handlers.Id(req.GetId()), tcp.TargetPrefix) {
|
||||
badFields[globals.IdField] = "Incorrectly formatted identifier."
|
||||
}
|
||||
if !scopeIdEmpty {
|
||||
|
||||
@@ -32,6 +32,7 @@ import (
|
||||
"github.com/hashicorp/boundary/internal/servers/controller/handlers/workers"
|
||||
"github.com/hashicorp/boundary/internal/session"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
"github.com/hashicorp/boundary/internal/target/tcp"
|
||||
"github.com/hashicorp/boundary/internal/types/scope"
|
||||
credpb "github.com/hashicorp/boundary/sdk/pbs/controller/api/resources/credentiallibraries"
|
||||
"github.com/hashicorp/boundary/sdk/pbs/controller/api/resources/scopes"
|
||||
@@ -106,7 +107,7 @@ func TestGet(t *testing.T) {
|
||||
hc := static.TestCatalogs(t, conn, proj.GetPublicId(), 1)[0]
|
||||
hs := static.TestSets(t, conn, hc.GetPublicId(), 2)
|
||||
|
||||
tar := target.TestTcpTarget(t, conn, proj.GetPublicId(), "test", target.WithHostSources([]string{hs[0].GetPublicId(), hs[1].GetPublicId()}))
|
||||
tar := tcp.TestTarget(t, conn, proj.GetPublicId(), "test", target.WithHostSources([]string{hs[0].GetPublicId(), hs[1].GetPublicId()}))
|
||||
|
||||
pTar := &pb.Target{
|
||||
Id: tar.GetPublicId(),
|
||||
@@ -141,7 +142,7 @@ func TestGet(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "Get a non existing Target",
|
||||
req: &pbs.GetTargetRequest{Id: target.TcpTargetPrefix + "_DoesntExis"},
|
||||
req: &pbs.GetTargetRequest{Id: tcp.TargetPrefix + "_DoesntExis"},
|
||||
res: nil,
|
||||
err: handlers.ApiErrorWithCode(codes.NotFound),
|
||||
},
|
||||
@@ -153,7 +154,7 @@ func TestGet(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "space in id",
|
||||
req: &pbs.GetTargetRequest{Id: target.TcpTargetPrefix + "_1 23456789"},
|
||||
req: &pbs.GetTargetRequest{Id: tcp.TargetPrefix + "_1 23456789"},
|
||||
res: nil,
|
||||
err: handlers.ApiErrorWithCode(codes.InvalidArgument),
|
||||
},
|
||||
@@ -201,7 +202,7 @@ func TestList(t *testing.T) {
|
||||
var totalTars []*pb.Target
|
||||
for i := 0; i < 5; i++ {
|
||||
name := fmt.Sprintf("tar%d", i)
|
||||
tar := target.TestTcpTarget(t, conn, proj.GetPublicId(), name, target.WithHostSources([]string{hss[0].GetPublicId(), hss[1].GetPublicId()}))
|
||||
tar := tcp.TestTarget(t, conn, proj.GetPublicId(), name, target.WithHostSources([]string{hss[0].GetPublicId(), hss[1].GetPublicId()}))
|
||||
wantTars = append(wantTars, &pb.Target{
|
||||
Id: tar.GetPublicId(),
|
||||
ScopeId: proj.GetPublicId(),
|
||||
@@ -217,7 +218,7 @@ func TestList(t *testing.T) {
|
||||
AuthorizedActions: testAuthorizedActions,
|
||||
})
|
||||
totalTars = append(totalTars, wantTars[i])
|
||||
tar = target.TestTcpTarget(t, conn, otherProj.GetPublicId(), name, target.WithHostSources([]string{otherHss[0].GetPublicId(), otherHss[1].GetPublicId()}))
|
||||
tar = tcp.TestTarget(t, conn, otherProj.GetPublicId(), name, target.WithHostSources([]string{otherHss[0].GetPublicId(), otherHss[1].GetPublicId()}))
|
||||
totalTars = append(totalTars, &pb.Target{
|
||||
Id: tar.GetPublicId(),
|
||||
ScopeId: otherProj.GetPublicId(),
|
||||
@@ -316,7 +317,7 @@ func TestDelete(t *testing.T) {
|
||||
}
|
||||
|
||||
_, proj := iam.TestScopes(t, iamRepo)
|
||||
tar := target.TestTcpTarget(t, conn, proj.GetPublicId(), "test")
|
||||
tar := tcp.TestTarget(t, conn, proj.GetPublicId(), "test")
|
||||
|
||||
s, err := testService(t, conn, kms, wrapper)
|
||||
require.NoError(t, err, "Couldn't create a new target service.")
|
||||
@@ -339,7 +340,7 @@ func TestDelete(t *testing.T) {
|
||||
name: "Delete Not Existing Target",
|
||||
scopeId: proj.GetPublicId(),
|
||||
req: &pbs.DeleteTargetRequest{
|
||||
Id: target.TcpTargetPrefix + "_doesntexis",
|
||||
Id: tcp.TargetPrefix + "_doesntexis",
|
||||
},
|
||||
err: handlers.ApiErrorWithCode(codes.NotFound),
|
||||
},
|
||||
@@ -347,7 +348,7 @@ func TestDelete(t *testing.T) {
|
||||
name: "Bad target id formatting",
|
||||
scopeId: proj.GetPublicId(),
|
||||
req: &pbs.DeleteTargetRequest{
|
||||
Id: target.TcpTargetPrefix + "_bad_format",
|
||||
Id: tcp.TargetPrefix + "_bad_format",
|
||||
},
|
||||
err: handlers.ApiErrorWithCode(codes.InvalidArgument),
|
||||
},
|
||||
@@ -379,7 +380,7 @@ func TestDelete_twice(t *testing.T) {
|
||||
|
||||
_, proj := iam.TestScopes(t, iamRepo)
|
||||
|
||||
tar := target.TestTcpTarget(t, conn, proj.GetPublicId(), "test")
|
||||
tar := tcp.TestTarget(t, conn, proj.GetPublicId(), "test")
|
||||
|
||||
s, err := testService(t, conn, kms, wrapper)
|
||||
require.NoError(err, "Couldn't create a new target service.")
|
||||
@@ -426,7 +427,7 @@ func TestCreate(t *testing.T) {
|
||||
WorkerFilter: wrapperspb.String(`type == "bar"`),
|
||||
}},
|
||||
res: &pbs.CreateTargetResponse{
|
||||
Uri: fmt.Sprintf("targets/%s_", target.TcpTargetPrefix),
|
||||
Uri: fmt.Sprintf("targets/%s_", tcp.TargetPrefix),
|
||||
Item: &pb.Target{
|
||||
ScopeId: proj.GetPublicId(),
|
||||
Scope: &scopes.ScopeInfo{Id: proj.GetPublicId(), Type: scope.Project.String(), ParentScopeId: org.GetPublicId()},
|
||||
@@ -522,7 +523,7 @@ func TestCreate(t *testing.T) {
|
||||
|
||||
if got != nil {
|
||||
assert.Contains(got.GetUri(), tc.res.GetUri())
|
||||
assert.True(strings.HasPrefix(got.GetItem().GetId(), target.TcpTargetPrefix), got.GetItem().GetId())
|
||||
assert.True(strings.HasPrefix(got.GetItem().GetId(), tcp.TargetPrefix), got.GetItem().GetId())
|
||||
|
||||
// Clear all values which are hard to compare against.
|
||||
got.Uri, tc.res.Uri = "", ""
|
||||
@@ -570,18 +571,18 @@ func TestUpdate(t *testing.T) {
|
||||
{Id: hs[1].GetPublicId(), HostCatalogId: hs[1].GetCatalogId()},
|
||||
}
|
||||
|
||||
tar, err := target.NewTcpTarget(proj.GetPublicId(), target.WithName("default"), target.WithDescription("default"))
|
||||
tar, err := tcp.New(proj.GetPublicId(), target.WithName("default"), target.WithDescription("default"))
|
||||
tar.DefaultPort = 2
|
||||
require.NoError(t, err)
|
||||
gtar, _, _, err := repo.CreateTcpTarget(context.Background(), tar, target.WithHostSources([]string{hs[0].GetPublicId(), hs[1].GetPublicId()}))
|
||||
gtar, _, _, err := repo.CreateTarget(context.Background(), tar, target.WithHostSources([]string{hs[0].GetPublicId(), hs[1].GetPublicId()}))
|
||||
require.NoError(t, err)
|
||||
tar = gtar.(*target.TcpTarget)
|
||||
tar = gtar.(*tcp.Target)
|
||||
|
||||
var version uint32 = 1
|
||||
|
||||
resetTarget := func() {
|
||||
version++
|
||||
_, _, _, _, err = repo.UpdateTcpTarget(context.Background(), tar, version, []string{"Name", "Description"})
|
||||
_, _, _, _, err = repo.UpdateTarget(context.Background(), tar, version, []string{"Name", "Description"})
|
||||
require.NoError(t, err, "Failed to reset target.")
|
||||
version++
|
||||
}
|
||||
@@ -611,7 +612,7 @@ func TestUpdate(t *testing.T) {
|
||||
Description: wrapperspb.String("desc"),
|
||||
SessionMaxSeconds: wrapperspb.UInt32(3600),
|
||||
SessionConnectionLimit: wrapperspb.Int32(5),
|
||||
Type: target.TcpSubtype.String(),
|
||||
Type: tcp.Subtype.String(),
|
||||
},
|
||||
},
|
||||
res: &pbs.UpdateTargetResponse{
|
||||
@@ -645,7 +646,7 @@ func TestUpdate(t *testing.T) {
|
||||
Item: &pb.Target{
|
||||
Name: wrapperspb.String("name"),
|
||||
Description: wrapperspb.String("desc"),
|
||||
Type: target.TcpSubtype.String(),
|
||||
Type: tcp.Subtype.String(),
|
||||
},
|
||||
},
|
||||
res: &pbs.UpdateTargetResponse{
|
||||
@@ -826,7 +827,7 @@ func TestUpdate(t *testing.T) {
|
||||
{
|
||||
name: "Update a Non Existing Target",
|
||||
req: &pbs.UpdateTargetRequest{
|
||||
Id: target.TcpTargetPrefix + "_DoesntExis",
|
||||
Id: tcp.TargetPrefix + "_DoesntExis",
|
||||
UpdateMask: &field_mask.FieldMask{
|
||||
Paths: []string{"description"},
|
||||
},
|
||||
@@ -938,10 +939,10 @@ func TestUpdate_BadVersion(t *testing.T) {
|
||||
repo, err := repoFn()
|
||||
require.NoError(t, err, "Couldn't create new target repo.")
|
||||
|
||||
tar, err := target.NewTcpTarget(proj.GetPublicId(), target.WithName("default"), target.WithDescription("default"))
|
||||
tar, err := tcp.New(proj.GetPublicId(), target.WithName("default"), target.WithDescription("default"))
|
||||
tar.DefaultPort = 2
|
||||
require.NoError(t, err)
|
||||
gtar, _, _, err := repo.CreateTcpTarget(context.Background(), tar)
|
||||
gtar, _, _, err := repo.CreateTarget(context.Background(), tar)
|
||||
require.NoError(t, err)
|
||||
|
||||
tested, err := testService(t, conn, kms, wrapper)
|
||||
@@ -980,25 +981,25 @@ func TestAddTargetHostSets(t *testing.T) {
|
||||
|
||||
addCases := []struct {
|
||||
name string
|
||||
tar *target.TcpTarget
|
||||
tar *tcp.Target
|
||||
addHostSets []string
|
||||
resultHostSets []string
|
||||
}{
|
||||
{
|
||||
name: "Add set on empty target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "empty"),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "empty"),
|
||||
addHostSets: []string{hs[1].GetPublicId()},
|
||||
resultHostSets: []string{hs[1].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Add set on populated target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "populated", target.WithHostSources([]string{hs[0].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "populated", target.WithHostSources([]string{hs[0].GetPublicId()})),
|
||||
addHostSets: []string{hs[1].GetPublicId()},
|
||||
resultHostSets: []string{hs[0].GetPublicId(), hs[1].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Add duplicated sets on populated target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "duplicated", target.WithHostSources([]string{hs[0].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "duplicated", target.WithHostSources([]string{hs[0].GetPublicId()})),
|
||||
addHostSets: []string{hs[1].GetPublicId(), hs[1].GetPublicId()},
|
||||
resultHostSets: []string{hs[0].GetPublicId(), hs[1].GetPublicId()},
|
||||
},
|
||||
@@ -1021,7 +1022,7 @@ func TestAddTargetHostSets(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
tar := target.TestTcpTarget(t, conn, proj.GetPublicId(), "test")
|
||||
tar := tcp.TestTarget(t, conn, proj.GetPublicId(), "test")
|
||||
|
||||
failCases := []struct {
|
||||
name string
|
||||
@@ -1096,31 +1097,31 @@ func TestSetTargetHostSets(t *testing.T) {
|
||||
|
||||
setCases := []struct {
|
||||
name string
|
||||
tar *target.TcpTarget
|
||||
tar *tcp.Target
|
||||
setHostSets []string
|
||||
resultHostSets []string
|
||||
}{
|
||||
{
|
||||
name: "Set on empty target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "empty"),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "empty"),
|
||||
setHostSets: []string{hs[1].GetPublicId()},
|
||||
resultHostSets: []string{hs[1].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Set on populated target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "populated", target.WithHostSources([]string{hs[0].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "populated", target.WithHostSources([]string{hs[0].GetPublicId()})),
|
||||
setHostSets: []string{hs[1].GetPublicId()},
|
||||
resultHostSets: []string{hs[1].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Set duplicate host set on populated target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "duplicate", target.WithHostSources([]string{hs[0].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "duplicate", target.WithHostSources([]string{hs[0].GetPublicId()})),
|
||||
setHostSets: []string{hs[1].GetPublicId(), hs[1].GetPublicId()},
|
||||
resultHostSets: []string{hs[1].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Set empty on populated target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "another populated", target.WithHostSources([]string{hs[0].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "another populated", target.WithHostSources([]string{hs[0].GetPublicId()})),
|
||||
setHostSets: []string{},
|
||||
resultHostSets: nil,
|
||||
},
|
||||
@@ -1139,7 +1140,7 @@ func TestSetTargetHostSets(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
tar := target.TestTcpTarget(t, conn, proj.GetPublicId(), "test name")
|
||||
tar := tcp.TestTarget(t, conn, proj.GetPublicId(), "test name")
|
||||
|
||||
failCases := []struct {
|
||||
name string
|
||||
@@ -1206,32 +1207,32 @@ func TestRemoveTargetHostSets(t *testing.T) {
|
||||
|
||||
removeCases := []struct {
|
||||
name string
|
||||
tar *target.TcpTarget
|
||||
tar *tcp.Target
|
||||
removeHosts []string
|
||||
resultHosts []string
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "Remove from empty",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "empty"),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "empty"),
|
||||
removeHosts: []string{hs[1].GetPublicId()},
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "Remove 1 of 2 sets",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "remove partial", target.WithHostSources([]string{hs[0].GetPublicId(), hs[1].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "remove partial", target.WithHostSources([]string{hs[0].GetPublicId(), hs[1].GetPublicId()})),
|
||||
removeHosts: []string{hs[1].GetPublicId()},
|
||||
resultHosts: []string{hs[0].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Remove 1 duplicate set of 2 sets",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "remove duplicate", target.WithHostSources([]string{hs[0].GetPublicId(), hs[1].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "remove duplicate", target.WithHostSources([]string{hs[0].GetPublicId(), hs[1].GetPublicId()})),
|
||||
removeHosts: []string{hs[1].GetPublicId(), hs[1].GetPublicId()},
|
||||
resultHosts: []string{hs[0].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Remove all hosts from set",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "remove all", target.WithHostSources([]string{hs[0].GetPublicId(), hs[1].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "remove all", target.WithHostSources([]string{hs[0].GetPublicId(), hs[1].GetPublicId()})),
|
||||
removeHosts: []string{hs[0].GetPublicId(), hs[1].GetPublicId()},
|
||||
resultHosts: []string{},
|
||||
},
|
||||
@@ -1258,7 +1259,7 @@ func TestRemoveTargetHostSets(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
tar := target.TestTcpTarget(t, conn, proj.GetPublicId(), "testing")
|
||||
tar := tcp.TestTarget(t, conn, proj.GetPublicId(), "testing")
|
||||
|
||||
failCases := []struct {
|
||||
name string
|
||||
@@ -1334,25 +1335,25 @@ func TestAddTargetHostSources(t *testing.T) {
|
||||
|
||||
addCases := []struct {
|
||||
name string
|
||||
tar *target.TcpTarget
|
||||
tar *tcp.Target
|
||||
addHostSources []string
|
||||
resultHostSources []string
|
||||
}{
|
||||
{
|
||||
name: "Add set on empty target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "empty"),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "empty"),
|
||||
addHostSources: []string{hs[1].GetPublicId()},
|
||||
resultHostSources: []string{hs[1].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Add set on populated target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "populated", target.WithHostSources([]string{hs[0].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "populated", target.WithHostSources([]string{hs[0].GetPublicId()})),
|
||||
addHostSources: []string{hs[1].GetPublicId()},
|
||||
resultHostSources: []string{hs[0].GetPublicId(), hs[1].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Add duplicated sets on populated target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "duplicated", target.WithHostSources([]string{hs[0].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "duplicated", target.WithHostSources([]string{hs[0].GetPublicId()})),
|
||||
addHostSources: []string{hs[1].GetPublicId(), hs[1].GetPublicId()},
|
||||
resultHostSources: []string{hs[0].GetPublicId(), hs[1].GetPublicId()},
|
||||
},
|
||||
@@ -1375,7 +1376,7 @@ func TestAddTargetHostSources(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
tar := target.TestTcpTarget(t, conn, proj.GetPublicId(), "test")
|
||||
tar := tcp.TestTarget(t, conn, proj.GetPublicId(), "test")
|
||||
|
||||
failCases := []struct {
|
||||
name string
|
||||
@@ -1450,31 +1451,31 @@ func TestSetTargetHostSources(t *testing.T) {
|
||||
|
||||
setCases := []struct {
|
||||
name string
|
||||
tar *target.TcpTarget
|
||||
tar *tcp.Target
|
||||
setHostSources []string
|
||||
resultHostSources []string
|
||||
}{
|
||||
{
|
||||
name: "Set on empty target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "empty"),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "empty"),
|
||||
setHostSources: []string{hs[1].GetPublicId()},
|
||||
resultHostSources: []string{hs[1].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Set on populated target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "populated", target.WithHostSources([]string{hs[0].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "populated", target.WithHostSources([]string{hs[0].GetPublicId()})),
|
||||
setHostSources: []string{hs[1].GetPublicId()},
|
||||
resultHostSources: []string{hs[1].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Set duplicate host set on populated target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "duplicate", target.WithHostSources([]string{hs[0].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "duplicate", target.WithHostSources([]string{hs[0].GetPublicId()})),
|
||||
setHostSources: []string{hs[1].GetPublicId(), hs[1].GetPublicId()},
|
||||
resultHostSources: []string{hs[1].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Set empty on populated target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "another populated", target.WithHostSources([]string{hs[0].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "another populated", target.WithHostSources([]string{hs[0].GetPublicId()})),
|
||||
setHostSources: []string{},
|
||||
resultHostSources: nil,
|
||||
},
|
||||
@@ -1493,7 +1494,7 @@ func TestSetTargetHostSources(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
tar := target.TestTcpTarget(t, conn, proj.GetPublicId(), "test name")
|
||||
tar := tcp.TestTarget(t, conn, proj.GetPublicId(), "test name")
|
||||
|
||||
failCases := []struct {
|
||||
name string
|
||||
@@ -1560,32 +1561,32 @@ func TestRemoveTargetHostSources(t *testing.T) {
|
||||
|
||||
removeCases := []struct {
|
||||
name string
|
||||
tar *target.TcpTarget
|
||||
tar *tcp.Target
|
||||
removeHostSources []string
|
||||
resultHostSources []string
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "Remove from empty",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "empty"),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "empty"),
|
||||
removeHostSources: []string{hs[1].GetPublicId()},
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "Remove 1 of 2 sets",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "remove partial", target.WithHostSources([]string{hs[0].GetPublicId(), hs[1].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "remove partial", target.WithHostSources([]string{hs[0].GetPublicId(), hs[1].GetPublicId()})),
|
||||
removeHostSources: []string{hs[1].GetPublicId()},
|
||||
resultHostSources: []string{hs[0].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Remove 1 duplicate set of 2 sets",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "remove duplicate", target.WithHostSources([]string{hs[0].GetPublicId(), hs[1].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "remove duplicate", target.WithHostSources([]string{hs[0].GetPublicId(), hs[1].GetPublicId()})),
|
||||
removeHostSources: []string{hs[1].GetPublicId(), hs[1].GetPublicId()},
|
||||
resultHostSources: []string{hs[0].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Remove all hosts from set",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "remove all", target.WithHostSources([]string{hs[0].GetPublicId(), hs[1].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "remove all", target.WithHostSources([]string{hs[0].GetPublicId(), hs[1].GetPublicId()})),
|
||||
removeHostSources: []string{hs[0].GetPublicId(), hs[1].GetPublicId()},
|
||||
resultHostSources: []string{},
|
||||
},
|
||||
@@ -1612,7 +1613,7 @@ func TestRemoveTargetHostSources(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
tar := target.TestTcpTarget(t, conn, proj.GetPublicId(), "testing")
|
||||
tar := tcp.TestTarget(t, conn, proj.GetPublicId(), "testing")
|
||||
|
||||
failCases := []struct {
|
||||
name string
|
||||
@@ -1688,25 +1689,25 @@ func TestAddTargetLibraries(t *testing.T) {
|
||||
|
||||
addCases := []struct {
|
||||
name string
|
||||
tar *target.TcpTarget
|
||||
tar *tcp.Target
|
||||
addLibraries []string
|
||||
resultLibraryIds []string
|
||||
}{
|
||||
{
|
||||
name: "Add library on empty target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "empty for libraries"),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "empty for libraries"),
|
||||
addLibraries: []string{cls[1].GetPublicId()},
|
||||
resultLibraryIds: []string{cls[1].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Add library on populated target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "populated for libraries", target.WithCredentialSources([]string{cls[0].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "populated for libraries", target.WithCredentialSources([]string{cls[0].GetPublicId()})),
|
||||
addLibraries: []string{cls[1].GetPublicId()},
|
||||
resultLibraryIds: []string{cls[0].GetPublicId(), cls[1].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Add duplicated libraries on populated target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "duplicated for libraries", target.WithCredentialSources([]string{cls[0].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "duplicated for libraries", target.WithCredentialSources([]string{cls[0].GetPublicId()})),
|
||||
addLibraries: []string{cls[1].GetPublicId(), cls[1].GetPublicId()},
|
||||
resultLibraryIds: []string{cls[0].GetPublicId(), cls[1].GetPublicId()},
|
||||
},
|
||||
@@ -1737,7 +1738,7 @@ func TestAddTargetLibraries(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
tar := target.TestTcpTarget(t, conn, proj.GetPublicId(), "test")
|
||||
tar := tcp.TestTarget(t, conn, proj.GetPublicId(), "test")
|
||||
|
||||
failCases := []struct {
|
||||
name string
|
||||
@@ -1823,32 +1824,32 @@ func TestSetTargetLibraries(t *testing.T) {
|
||||
|
||||
setCases := []struct {
|
||||
name string
|
||||
tar *target.TcpTarget
|
||||
tar *tcp.Target
|
||||
setLibraries []string
|
||||
resultLibraryIds []string
|
||||
resultLibraries []*pb.CredentialLibrary
|
||||
}{
|
||||
{
|
||||
name: "Set on empty target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "empty"),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "empty"),
|
||||
setLibraries: []string{cls[1].GetPublicId()},
|
||||
resultLibraryIds: []string{cls[1].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Set on populated target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "populated", target.WithCredentialSources([]string{cls[0].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "populated", target.WithCredentialSources([]string{cls[0].GetPublicId()})),
|
||||
setLibraries: []string{cls[1].GetPublicId()},
|
||||
resultLibraryIds: []string{cls[1].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Set duplicate libraries on populated target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "duplicate", target.WithCredentialSources([]string{cls[0].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "duplicate", target.WithCredentialSources([]string{cls[0].GetPublicId()})),
|
||||
setLibraries: []string{cls[1].GetPublicId(), cls[1].GetPublicId()},
|
||||
resultLibraryIds: []string{cls[1].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Set empty on populated target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "another populated", target.WithCredentialSources([]string{cls[0].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "another populated", target.WithCredentialSources([]string{cls[0].GetPublicId()})),
|
||||
setLibraries: []string{},
|
||||
resultLibraryIds: nil,
|
||||
},
|
||||
@@ -1882,7 +1883,7 @@ func TestSetTargetLibraries(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
tar := target.TestTcpTarget(t, conn, proj.GetPublicId(), "test name")
|
||||
tar := tcp.TestTarget(t, conn, proj.GetPublicId(), "test name")
|
||||
|
||||
failCases := []struct {
|
||||
name string
|
||||
@@ -1949,26 +1950,26 @@ func TestRemoveTargetLibraries(t *testing.T) {
|
||||
|
||||
removeCases := []struct {
|
||||
name string
|
||||
tar *target.TcpTarget
|
||||
tar *tcp.Target
|
||||
removeLibs []string
|
||||
resultLibIds []string
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "Remove from empty",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "empty"),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "empty"),
|
||||
removeLibs: []string{cls[1].GetPublicId()},
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "Remove 1 of 2 libraries",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "remove partial", target.WithCredentialSources([]string{cls[0].GetPublicId(), cls[1].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "remove partial", target.WithCredentialSources([]string{cls[0].GetPublicId(), cls[1].GetPublicId()})),
|
||||
removeLibs: []string{cls[1].GetPublicId()},
|
||||
resultLibIds: []string{cls[0].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Remove 1 duplicate set of 2 libraries",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "remove duplicate", target.WithCredentialSources([]string{cls[0].GetPublicId(), cls[1].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "remove duplicate", target.WithCredentialSources([]string{cls[0].GetPublicId(), cls[1].GetPublicId()})),
|
||||
removeLibs: []string{
|
||||
cls[1].GetPublicId(), cls[1].GetPublicId(),
|
||||
},
|
||||
@@ -1976,7 +1977,7 @@ func TestRemoveTargetLibraries(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "Remove all libraries from target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "remove all", target.WithCredentialSources([]string{cls[0].GetPublicId(), cls[1].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "remove all", target.WithCredentialSources([]string{cls[0].GetPublicId(), cls[1].GetPublicId()})),
|
||||
removeLibs: []string{
|
||||
cls[0].GetPublicId(), cls[1].GetPublicId(),
|
||||
},
|
||||
@@ -2003,7 +2004,7 @@ func TestRemoveTargetLibraries(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
tar := target.TestTcpTarget(t, conn, proj.GetPublicId(), "testing")
|
||||
tar := tcp.TestTarget(t, conn, proj.GetPublicId(), "testing")
|
||||
|
||||
failCases := []struct {
|
||||
name string
|
||||
@@ -2085,25 +2086,25 @@ func TestAddTargetSources(t *testing.T) {
|
||||
|
||||
addCases := []struct {
|
||||
name string
|
||||
tar *target.TcpTarget
|
||||
tar *tcp.Target
|
||||
addSources []string
|
||||
resultSourceIds []string
|
||||
}{
|
||||
{
|
||||
name: "Add source on empty target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "empty for sources"),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "empty for sources"),
|
||||
addSources: []string{cls[1].GetPublicId()},
|
||||
resultSourceIds: []string{cls[1].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Add source on populated target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "populated for sources", target.WithCredentialSources([]string{cls[0].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "populated for sources", target.WithCredentialSources([]string{cls[0].GetPublicId()})),
|
||||
addSources: []string{cls[1].GetPublicId()},
|
||||
resultSourceIds: []string{cls[0].GetPublicId(), cls[1].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Add duplicated sources on populated target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "duplicated for sources", target.WithCredentialSources([]string{cls[0].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "duplicated for sources", target.WithCredentialSources([]string{cls[0].GetPublicId()})),
|
||||
addSources: []string{cls[1].GetPublicId(), cls[1].GetPublicId()},
|
||||
resultSourceIds: []string{cls[0].GetPublicId(), cls[1].GetPublicId()},
|
||||
},
|
||||
@@ -2134,7 +2135,7 @@ func TestAddTargetSources(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
tar := target.TestTcpTarget(t, conn, proj.GetPublicId(), "test")
|
||||
tar := tcp.TestTarget(t, conn, proj.GetPublicId(), "test")
|
||||
|
||||
failCases := []struct {
|
||||
name string
|
||||
@@ -2220,32 +2221,32 @@ func TestSetTargetCredentialSources(t *testing.T) {
|
||||
|
||||
setCases := []struct {
|
||||
name string
|
||||
tar *target.TcpTarget
|
||||
tar *tcp.Target
|
||||
setCredentialSources []string
|
||||
resultCredentialSourceIds []string
|
||||
resultCredentialSources []*pb.CredentialLibrary
|
||||
}{
|
||||
{
|
||||
name: "Set on empty target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "empty"),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "empty"),
|
||||
setCredentialSources: []string{cls[1].GetPublicId()},
|
||||
resultCredentialSourceIds: []string{cls[1].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Set on populated target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "populated", target.WithCredentialSources([]string{cls[0].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "populated", target.WithCredentialSources([]string{cls[0].GetPublicId()})),
|
||||
setCredentialSources: []string{cls[1].GetPublicId()},
|
||||
resultCredentialSourceIds: []string{cls[1].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Set duplicate sources on populated target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "duplicate", target.WithCredentialSources([]string{cls[0].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "duplicate", target.WithCredentialSources([]string{cls[0].GetPublicId()})),
|
||||
setCredentialSources: []string{cls[1].GetPublicId(), cls[1].GetPublicId()},
|
||||
resultCredentialSourceIds: []string{cls[1].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Set empty on populated target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "another populated", target.WithCredentialSources([]string{cls[0].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "another populated", target.WithCredentialSources([]string{cls[0].GetPublicId()})),
|
||||
setCredentialSources: []string{},
|
||||
resultCredentialSourceIds: nil,
|
||||
},
|
||||
@@ -2279,7 +2280,7 @@ func TestSetTargetCredentialSources(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
tar := target.TestTcpTarget(t, conn, proj.GetPublicId(), "test name")
|
||||
tar := tcp.TestTarget(t, conn, proj.GetPublicId(), "test name")
|
||||
|
||||
failCases := []struct {
|
||||
name string
|
||||
@@ -2346,26 +2347,26 @@ func TestRemoveTargetCredentialSources(t *testing.T) {
|
||||
|
||||
removeCases := []struct {
|
||||
name string
|
||||
tar *target.TcpTarget
|
||||
tar *tcp.Target
|
||||
removeCredentialSources []string
|
||||
resultCredentialSourceIds []string
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "Remove from empty",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "empty"),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "empty"),
|
||||
removeCredentialSources: []string{cls[1].GetPublicId()},
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "Remove 1 of 2 sources",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "remove partial", target.WithCredentialSources([]string{cls[0].GetPublicId(), cls[1].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "remove partial", target.WithCredentialSources([]string{cls[0].GetPublicId(), cls[1].GetPublicId()})),
|
||||
removeCredentialSources: []string{cls[1].GetPublicId()},
|
||||
resultCredentialSourceIds: []string{cls[0].GetPublicId()},
|
||||
},
|
||||
{
|
||||
name: "Remove 1 duplicate set of 2 sources",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "remove duplicate", target.WithCredentialSources([]string{cls[0].GetPublicId(), cls[1].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "remove duplicate", target.WithCredentialSources([]string{cls[0].GetPublicId(), cls[1].GetPublicId()})),
|
||||
removeCredentialSources: []string{
|
||||
cls[1].GetPublicId(), cls[1].GetPublicId(),
|
||||
},
|
||||
@@ -2373,7 +2374,7 @@ func TestRemoveTargetCredentialSources(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "Remove all sources from target",
|
||||
tar: target.TestTcpTarget(t, conn, proj.GetPublicId(), "remove all", target.WithCredentialSources([]string{cls[0].GetPublicId(), cls[1].GetPublicId()})),
|
||||
tar: tcp.TestTarget(t, conn, proj.GetPublicId(), "remove all", target.WithCredentialSources([]string{cls[0].GetPublicId(), cls[1].GetPublicId()})),
|
||||
removeCredentialSources: []string{
|
||||
cls[0].GetPublicId(), cls[1].GetPublicId(),
|
||||
},
|
||||
@@ -2400,7 +2401,7 @@ func TestRemoveTargetCredentialSources(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
tar := target.TestTcpTarget(t, conn, proj.GetPublicId(), "testing")
|
||||
tar := tcp.TestTarget(t, conn, proj.GetPublicId(), "testing")
|
||||
|
||||
failCases := []struct {
|
||||
name string
|
||||
@@ -2512,7 +2513,7 @@ func TestAuthorizeSession(t *testing.T) {
|
||||
s, err := targets.NewService(kms, repoFn, iamRepoFn, serversRepoFn, sessionRepoFn, staticHostRepoFn, credentialRepoFn)
|
||||
require.NoError(t, err)
|
||||
|
||||
tar := target.TestTcpTarget(t, conn, proj.GetPublicId(), "test")
|
||||
tar := tcp.TestTarget(t, conn, proj.GetPublicId(), "test")
|
||||
hc := static.TestCatalogs(t, conn, proj.GetPublicId(), 1)[0]
|
||||
h := static.TestHosts(t, conn, hc.GetPublicId(), 1)[0]
|
||||
hs := static.TestSets(t, conn, hc.GetPublicId(), 1)[0]
|
||||
@@ -2687,7 +2688,7 @@ func TestAuthorizeSession_Errors(t *testing.T) {
|
||||
sec, tok := v.CreateToken(t, vault.WithPolicies([]string{"default", "database"}))
|
||||
store := vault.TestCredentialStore(t, conn, wrapper, proj.GetPublicId(), v.Addr, tok, sec.Auth.Accessor)
|
||||
|
||||
workerExists := func(tar *target.TcpTarget) (version uint32) {
|
||||
workerExists := func(tar *tcp.Target) (version uint32) {
|
||||
workerService := workers.NewWorkerServiceServer(serversRepoFn, sessionRepoFn, &sync.Map{}, kms)
|
||||
_, err := workerService.Status(context.Background(), &spbs.StatusRequest{
|
||||
Worker: &spb.Server{
|
||||
@@ -2699,7 +2700,7 @@ func TestAuthorizeSession_Errors(t *testing.T) {
|
||||
return tar.GetVersion()
|
||||
}
|
||||
|
||||
hostSetNoHostExists := func(tar *target.TcpTarget) (version uint32) {
|
||||
hostSetNoHostExists := func(tar *tcp.Target) (version uint32) {
|
||||
hc := static.TestCatalogs(t, conn, proj.GetPublicId(), 1)[0]
|
||||
hs := static.TestSets(t, conn, hc.GetPublicId(), 1)[0]
|
||||
|
||||
@@ -2712,7 +2713,7 @@ func TestAuthorizeSession_Errors(t *testing.T) {
|
||||
return tr.GetItem().GetVersion()
|
||||
}
|
||||
|
||||
hostExists := func(tar *target.TcpTarget) (version uint32) {
|
||||
hostExists := func(tar *tcp.Target) (version uint32) {
|
||||
hc := static.TestCatalogs(t, conn, proj.GetPublicId(), 1)[0]
|
||||
h := static.TestHosts(t, conn, hc.GetPublicId(), 1)[0]
|
||||
hs := static.TestSets(t, conn, hc.GetPublicId(), 1)[0]
|
||||
@@ -2726,7 +2727,7 @@ func TestAuthorizeSession_Errors(t *testing.T) {
|
||||
return apiTar.GetItem().GetVersion()
|
||||
}
|
||||
|
||||
libraryExists := func(tar *target.TcpTarget) (version uint32) {
|
||||
libraryExists := func(tar *tcp.Target) (version uint32) {
|
||||
credService, err := credentiallibraries.NewService(credentialRepoFn, iamRepoFn)
|
||||
require.NoError(t, err)
|
||||
clsResp, err := credService.CreateCredentialLibrary(ctx, &pbs.CreateCredentialLibraryRequest{Item: &credpb.CredentialLibrary{
|
||||
@@ -2748,7 +2749,7 @@ func TestAuthorizeSession_Errors(t *testing.T) {
|
||||
return tr.GetItem().GetVersion()
|
||||
}
|
||||
|
||||
misConfiguredlibraryExists := func(tar *target.TcpTarget) (version uint32) {
|
||||
misConfiguredlibraryExists := func(tar *tcp.Target) (version uint32) {
|
||||
credService, err := credentiallibraries.NewService(credentialRepoFn, iamRepoFn)
|
||||
require.NoError(t, err)
|
||||
clsResp, err := credService.CreateCredentialLibrary(ctx, &pbs.CreateCredentialLibraryRequest{Item: &credpb.CredentialLibrary{
|
||||
@@ -2772,33 +2773,33 @@ func TestAuthorizeSession_Errors(t *testing.T) {
|
||||
|
||||
cases := []struct {
|
||||
name string
|
||||
setup []func(*target.TcpTarget) uint32
|
||||
setup []func(*tcp.Target) uint32
|
||||
err bool
|
||||
}{
|
||||
{
|
||||
// This one must be run first since it relies on the DB not having any worker details
|
||||
name: "no worker",
|
||||
setup: []func(tcpTarget *target.TcpTarget) uint32{hostExists, libraryExists},
|
||||
setup: []func(tcpTarget *tcp.Target) uint32{hostExists, libraryExists},
|
||||
err: true,
|
||||
},
|
||||
{
|
||||
name: "success",
|
||||
setup: []func(tcpTarget *target.TcpTarget) uint32{workerExists, hostExists, libraryExists},
|
||||
setup: []func(tcpTarget *tcp.Target) uint32{workerExists, hostExists, libraryExists},
|
||||
},
|
||||
{
|
||||
name: "no hosts",
|
||||
setup: []func(tcpTarget *target.TcpTarget) uint32{workerExists, hostSetNoHostExists, libraryExists},
|
||||
setup: []func(tcpTarget *tcp.Target) uint32{workerExists, hostSetNoHostExists, libraryExists},
|
||||
err: true,
|
||||
},
|
||||
{
|
||||
name: "bad library configuration",
|
||||
setup: []func(tcpTarget *target.TcpTarget) uint32{workerExists, hostExists, misConfiguredlibraryExists},
|
||||
setup: []func(tcpTarget *tcp.Target) uint32{workerExists, hostExists, misConfiguredlibraryExists},
|
||||
err: true,
|
||||
},
|
||||
}
|
||||
for i, tc := range cases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
tar := target.TestTcpTarget(t, conn, proj.GetPublicId(), fmt.Sprintf("test-%d", i))
|
||||
tar := tcp.TestTarget(t, conn, proj.GetPublicId(), fmt.Sprintf("test-%d", i))
|
||||
|
||||
for _, fn := range tc.setup {
|
||||
ver := fn(tar)
|
||||
|
||||
@@ -15,7 +15,8 @@ import (
|
||||
"github.com/hashicorp/boundary/internal/host/static"
|
||||
staticStore "github.com/hashicorp/boundary/internal/host/static/store"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
targetStore "github.com/hashicorp/boundary/internal/target/store"
|
||||
"github.com/hashicorp/boundary/internal/target/tcp"
|
||||
tcpStore "github.com/hashicorp/boundary/internal/target/tcp/store"
|
||||
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||
"github.com/jackc/pgconn"
|
||||
"google.golang.org/protobuf/types/known/timestamppb"
|
||||
@@ -1314,8 +1315,8 @@ func TestRepository_CancelSessionViaFKNull(t *testing.T) {
|
||||
cancelFk: func() cancelFk {
|
||||
s := setupFn()
|
||||
|
||||
t := &target.TcpTarget{
|
||||
TcpTarget: &targetStore.TcpTarget{
|
||||
t := &tcp.Target{
|
||||
Target: &tcpStore.Target{
|
||||
PublicId: s.TargetId,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ import (
|
||||
"github.com/hashicorp/boundary/internal/kms"
|
||||
"github.com/hashicorp/boundary/internal/servers"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
"github.com/hashicorp/boundary/internal/target/tcp"
|
||||
wrapping "github.com/hashicorp/go-kms-wrapping"
|
||||
"github.com/hashicorp/go-secure-stdlib/base62"
|
||||
"github.com/hashicorp/go-uuid"
|
||||
@@ -132,7 +133,7 @@ func TestSessionParams(t *testing.T, conn *db.DB, wrapper wrapping.Wrapper, iamR
|
||||
sets := static.TestSets(t, conn, cats[0].PublicId, 1)
|
||||
_ = static.TestSetMembers(t, conn, sets[0].PublicId, hosts)
|
||||
|
||||
tcpTarget := target.TestTcpTarget(t, conn, proj.PublicId, "test target")
|
||||
tcpTarget := tcp.TestTarget(t, conn, proj.PublicId, "test target")
|
||||
|
||||
kms := kms.TestKms(t, conn, wrapper)
|
||||
targetRepo, err := target.NewRepository(rw, rw, kms)
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
package target
|
||||
package target_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/boundary/internal/credential"
|
||||
"github.com/hashicorp/boundary/internal/errors"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
"github.com/hashicorp/boundary/internal/target/store"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
@@ -18,7 +19,7 @@ func TestCredentialLibrary_New(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
want *CredentialLibrary
|
||||
want *target.CredentialLibrary
|
||||
wantErr errors.Code
|
||||
}{
|
||||
{
|
||||
@@ -41,7 +42,7 @@ func TestCredentialLibrary_New(t *testing.T) {
|
||||
targetId: "targ_0000000",
|
||||
libraryId: "lib_0000000",
|
||||
},
|
||||
want: &CredentialLibrary{
|
||||
want: &target.CredentialLibrary{
|
||||
CredentialLibrary: &store.CredentialLibrary{
|
||||
TargetId: "targ_0000000",
|
||||
CredentialLibraryId: "lib_0000000",
|
||||
@@ -54,7 +55,7 @@ func TestCredentialLibrary_New(t *testing.T) {
|
||||
tt := tt
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
got, err := NewCredentialLibrary(tt.args.targetId, tt.args.libraryId)
|
||||
got, err := target.NewCredentialLibrary(tt.args.targetId, tt.args.libraryId)
|
||||
if tt.wantErr != 0 {
|
||||
assert.Truef(errors.Match(errors.T(tt.wantErr), err), "want err: %q got: %q", tt.wantErr, err)
|
||||
assert.Nil(got)
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
package target
|
||||
|
||||
// Expose functions for use in tests.
|
||||
var (
|
||||
AllocTargetView = allocTargetView
|
||||
TargetsViewDefaultTable = targetsViewDefaultTable
|
||||
)
|
||||
@@ -44,13 +44,6 @@ func NewTargetHostSet(targetId, hostSetId string, _ ...Option) (*TargetHostSet,
|
||||
return t, nil
|
||||
}
|
||||
|
||||
// allocTargetHostSet will allocate a target host set
|
||||
func allocTargetHostSet() TargetHostSet {
|
||||
return TargetHostSet{
|
||||
TargetHostSet: &store.TargetHostSet{},
|
||||
}
|
||||
}
|
||||
|
||||
// Clone creates a clone of the target host set
|
||||
func (t *TargetHostSet) Clone() interface{} {
|
||||
cp := proto.Clone(t.TargetHostSet)
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
package target
|
||||
|
||||
import (
|
||||
"github.com/hashicorp/boundary/internal/db"
|
||||
"github.com/hashicorp/boundary/internal/errors"
|
||||
)
|
||||
|
||||
const (
|
||||
TcpTargetPrefix = "ttcp"
|
||||
)
|
||||
|
||||
func newTcpTargetId() (string, error) {
|
||||
const op = "target.newTcpTargetId"
|
||||
id, err := db.NewPublicId(TcpTargetPrefix)
|
||||
if err != nil {
|
||||
return "", errors.WrapDeprecated(err, op)
|
||||
}
|
||||
return id, nil
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
package target
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func Test_Ids(t *testing.T) {
|
||||
t.Parallel()
|
||||
t.Run("tcp", func(t *testing.T) {
|
||||
id, err := newTcpTargetId()
|
||||
require.NoError(t, err)
|
||||
assert.True(t, strings.HasPrefix(id, TcpTargetPrefix+"_"))
|
||||
})
|
||||
}
|
||||
+47
-47
@@ -2,8 +2,8 @@ package target
|
||||
|
||||
import "time"
|
||||
|
||||
// getOpts - iterate the inbound Options and return a struct
|
||||
func getOpts(opt ...Option) options {
|
||||
// GetOpts - iterate the inbound Options and return a struct
|
||||
func GetOpts(opt ...Option) options {
|
||||
opts := getDefaultOptions()
|
||||
for _, o := range opt {
|
||||
o(&opts)
|
||||
@@ -16,54 +16,54 @@ type Option func(*options)
|
||||
|
||||
// options = how options are represented
|
||||
type options struct {
|
||||
withName string
|
||||
withDescription string
|
||||
withDefaultPort uint32
|
||||
withLimit int
|
||||
withScopeId string
|
||||
withScopeIds []string
|
||||
withScopeName string
|
||||
withUserId string
|
||||
withTargetType *TargetType
|
||||
withHostSources []string
|
||||
withCredentialSources []string
|
||||
withSessionMaxSeconds uint32
|
||||
withSessionConnectionLimit int32
|
||||
withPublicId string
|
||||
withWorkerFilter string
|
||||
WithName string
|
||||
WithDescription string
|
||||
WithDefaultPort uint32
|
||||
WithLimit int
|
||||
WithScopeId string
|
||||
WithScopeIds []string
|
||||
WithScopeName string
|
||||
WithUserId string
|
||||
WithTargetType *TargetType
|
||||
WithHostSources []string
|
||||
WithCredentialSources []string
|
||||
WithSessionMaxSeconds uint32
|
||||
WithSessionConnectionLimit int32
|
||||
WithPublicId string
|
||||
WithWorkerFilter string
|
||||
}
|
||||
|
||||
func getDefaultOptions() options {
|
||||
return options{
|
||||
withName: "",
|
||||
withDescription: "",
|
||||
withLimit: 0,
|
||||
withDefaultPort: 0,
|
||||
withScopeId: "",
|
||||
withScopeIds: nil,
|
||||
withScopeName: "",
|
||||
withUserId: "",
|
||||
withTargetType: nil,
|
||||
withHostSources: nil,
|
||||
withCredentialSources: nil,
|
||||
withSessionMaxSeconds: uint32((8 * time.Hour).Seconds()),
|
||||
withSessionConnectionLimit: 1,
|
||||
withPublicId: "",
|
||||
withWorkerFilter: "",
|
||||
WithName: "",
|
||||
WithDescription: "",
|
||||
WithLimit: 0,
|
||||
WithDefaultPort: 0,
|
||||
WithScopeId: "",
|
||||
WithScopeIds: nil,
|
||||
WithScopeName: "",
|
||||
WithUserId: "",
|
||||
WithTargetType: nil,
|
||||
WithHostSources: nil,
|
||||
WithCredentialSources: nil,
|
||||
WithSessionMaxSeconds: uint32((8 * time.Hour).Seconds()),
|
||||
WithSessionConnectionLimit: 1,
|
||||
WithPublicId: "",
|
||||
WithWorkerFilter: "",
|
||||
}
|
||||
}
|
||||
|
||||
// WithDescription provides an optional description
|
||||
func WithDescription(desc string) Option {
|
||||
return func(o *options) {
|
||||
o.withDescription = desc
|
||||
o.WithDescription = desc
|
||||
}
|
||||
}
|
||||
|
||||
// WithName provides an option to search by a friendly name
|
||||
func WithName(name string) Option {
|
||||
return func(o *options) {
|
||||
o.withName = name
|
||||
o.WithName = name
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,88 +72,88 @@ func WithName(name string) Option {
|
||||
// If WithLimit == 0, then default limits are used for results.
|
||||
func WithLimit(limit int) Option {
|
||||
return func(o *options) {
|
||||
o.withLimit = limit
|
||||
o.WithLimit = limit
|
||||
}
|
||||
}
|
||||
|
||||
// WithDefaultPort provides an option to specify the default target port.
|
||||
func WithDefaultPort(p uint32) Option {
|
||||
return func(o *options) {
|
||||
o.withDefaultPort = p
|
||||
o.WithDefaultPort = p
|
||||
}
|
||||
}
|
||||
|
||||
// WithScopeId provides an option to search by a scope id
|
||||
func WithScopeId(scopeId string) Option {
|
||||
return func(o *options) {
|
||||
o.withScopeId = scopeId
|
||||
o.WithScopeId = scopeId
|
||||
}
|
||||
}
|
||||
|
||||
// WithScopeId provides an option to search by multiple scope id
|
||||
func WithScopeIds(scopeIds []string) Option {
|
||||
return func(o *options) {
|
||||
o.withScopeIds = scopeIds
|
||||
o.WithScopeIds = scopeIds
|
||||
}
|
||||
}
|
||||
|
||||
// WithScopeId provides an option to search by a scope name
|
||||
func WithScopeName(scopeName string) Option {
|
||||
return func(o *options) {
|
||||
o.withScopeName = scopeName
|
||||
o.WithScopeName = scopeName
|
||||
}
|
||||
}
|
||||
|
||||
// WithUserId provides an option to search by a user public id
|
||||
func WithUserId(userId string) Option {
|
||||
return func(o *options) {
|
||||
o.withUserId = userId
|
||||
o.WithUserId = userId
|
||||
}
|
||||
}
|
||||
|
||||
// WithTargetType provides an option to search by a target type
|
||||
func WithTargetType(t TargetType) Option {
|
||||
return func(o *options) {
|
||||
o.withTargetType = &t
|
||||
o.WithTargetType = &t
|
||||
}
|
||||
}
|
||||
|
||||
// WithHostSources provides an option for providing a list of host source ids
|
||||
func WithHostSources(hs []string) Option {
|
||||
return func(o *options) {
|
||||
o.withHostSources = hs
|
||||
o.WithHostSources = hs
|
||||
}
|
||||
}
|
||||
|
||||
// WithCredentialSources provides an option for providing a list of credential source ids
|
||||
func WithCredentialSources(cl []string) Option {
|
||||
return func(o *options) {
|
||||
o.withCredentialSources = cl
|
||||
o.WithCredentialSources = cl
|
||||
}
|
||||
}
|
||||
|
||||
func WithSessionMaxSeconds(dur uint32) Option {
|
||||
return func(o *options) {
|
||||
o.withSessionMaxSeconds = dur
|
||||
o.WithSessionMaxSeconds = dur
|
||||
}
|
||||
}
|
||||
|
||||
func WithSessionConnectionLimit(limit int32) Option {
|
||||
return func(o *options) {
|
||||
o.withSessionConnectionLimit = limit
|
||||
o.WithSessionConnectionLimit = limit
|
||||
}
|
||||
}
|
||||
|
||||
// WithPublicId provides an optional public id
|
||||
func WithPublicId(id string) Option {
|
||||
return func(o *options) {
|
||||
o.withPublicId = id
|
||||
o.WithPublicId = id
|
||||
}
|
||||
}
|
||||
|
||||
// WithWorkerFilter provides an optional worker filter
|
||||
func WithWorkerFilter(filter string) Option {
|
||||
return func(o *options) {
|
||||
o.withWorkerFilter = filter
|
||||
o.WithWorkerFilter = filter
|
||||
}
|
||||
}
|
||||
@@ -11,104 +11,104 @@ func Test_GetOpts(t *testing.T) {
|
||||
t.Parallel()
|
||||
t.Run("WithName", func(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
opts := getOpts(WithName("test"))
|
||||
opts := GetOpts(WithName("test"))
|
||||
testOpts := getDefaultOptions()
|
||||
testOpts.withName = "test"
|
||||
testOpts.WithName = "test"
|
||||
assert.Equal(opts, testOpts)
|
||||
})
|
||||
t.Run("WithDescription", func(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
opts := getOpts(WithDescription("test desc"))
|
||||
opts := GetOpts(WithDescription("test desc"))
|
||||
testOpts := getDefaultOptions()
|
||||
testOpts.withDescription = "test desc"
|
||||
testOpts.WithDescription = "test desc"
|
||||
assert.Equal(opts, testOpts)
|
||||
})
|
||||
t.Run("WithLimit", func(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
// test default of 0
|
||||
opts := getOpts()
|
||||
opts := GetOpts()
|
||||
testOpts := getDefaultOptions()
|
||||
testOpts.withLimit = 0
|
||||
testOpts.WithLimit = 0
|
||||
assert.Equal(opts, testOpts)
|
||||
|
||||
opts = getOpts(WithLimit(-1))
|
||||
opts = GetOpts(WithLimit(-1))
|
||||
testOpts = getDefaultOptions()
|
||||
testOpts.withLimit = -1
|
||||
testOpts.WithLimit = -1
|
||||
assert.Equal(opts, testOpts)
|
||||
|
||||
opts = getOpts(WithLimit(1))
|
||||
opts = GetOpts(WithLimit(1))
|
||||
testOpts = getDefaultOptions()
|
||||
testOpts.withLimit = 1
|
||||
testOpts.WithLimit = 1
|
||||
assert.Equal(opts, testOpts)
|
||||
})
|
||||
t.Run("WithDefaultPort", func(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
// test default of 0
|
||||
opts := getOpts()
|
||||
opts := GetOpts()
|
||||
testOpts := getDefaultOptions()
|
||||
testOpts.withDefaultPort = 0
|
||||
testOpts.WithDefaultPort = 0
|
||||
assert.Equal(opts, testOpts)
|
||||
|
||||
opts = getOpts(WithDefaultPort(22))
|
||||
opts = GetOpts(WithDefaultPort(22))
|
||||
testOpts = getDefaultOptions()
|
||||
testOpts.withDefaultPort = uint32(22)
|
||||
testOpts.WithDefaultPort = uint32(22)
|
||||
assert.Equal(opts, testOpts)
|
||||
})
|
||||
t.Run("WithUserId", func(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
opts := getOpts(WithUserId("testId"))
|
||||
opts := GetOpts(WithUserId("testId"))
|
||||
testOpts := getDefaultOptions()
|
||||
testOpts.withUserId = "testId"
|
||||
testOpts.WithUserId = "testId"
|
||||
assert.Equal(opts, testOpts)
|
||||
})
|
||||
t.Run("WithScopeId", func(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
opts := getOpts(WithScopeId("testId"))
|
||||
opts := GetOpts(WithScopeId("testId"))
|
||||
testOpts := getDefaultOptions()
|
||||
testOpts.withScopeId = "testId"
|
||||
testOpts.WithScopeId = "testId"
|
||||
assert.Equal(opts, testOpts)
|
||||
})
|
||||
t.Run("WithScopeName", func(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
opts := getOpts(WithScopeName("testName"))
|
||||
opts := GetOpts(WithScopeName("testName"))
|
||||
testOpts := getDefaultOptions()
|
||||
testOpts.withScopeName = "testName"
|
||||
testOpts.WithScopeName = "testName"
|
||||
assert.Equal(opts, testOpts)
|
||||
})
|
||||
t.Run("WithPublicId", func(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
opts := getOpts(WithPublicId("testId"))
|
||||
opts := GetOpts(WithPublicId("testId"))
|
||||
testOpts := getDefaultOptions()
|
||||
testOpts.withPublicId = "testId"
|
||||
testOpts.WithPublicId = "testId"
|
||||
assert.Equal(opts, testOpts)
|
||||
})
|
||||
t.Run("WithTargetType", func(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
opts := getOpts(WithTargetType(TcpTargetType))
|
||||
opts := GetOpts(WithTargetType(TcpTargetType))
|
||||
testOpts := getDefaultOptions()
|
||||
target := TcpTargetType
|
||||
testOpts.withTargetType = &target
|
||||
testOpts.WithTargetType = &target
|
||||
assert.Equal(opts, testOpts)
|
||||
})
|
||||
t.Run("WithHostSources", func(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
opts := getOpts(WithHostSources([]string{"alice", "bob"}))
|
||||
opts := GetOpts(WithHostSources([]string{"alice", "bob"}))
|
||||
testOpts := getDefaultOptions()
|
||||
testOpts.withHostSources = []string{"alice", "bob"}
|
||||
testOpts.WithHostSources = []string{"alice", "bob"}
|
||||
assert.Equal(opts, testOpts)
|
||||
})
|
||||
t.Run("WithWorkerFilter", func(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
opts := getOpts(WithWorkerFilter(`"/foo" == "bar"`))
|
||||
opts := GetOpts(WithWorkerFilter(`"/foo" == "bar"`))
|
||||
testOpts := getDefaultOptions()
|
||||
testOpts.withWorkerFilter = `"/foo" == "bar"`
|
||||
testOpts.WithWorkerFilter = `"/foo" == "bar"`
|
||||
assert.Equal(opts, testOpts)
|
||||
})
|
||||
t.Run("WithCredentialSources", func(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
opts := getOpts(WithCredentialSources([]string{"alice", "bob"}))
|
||||
opts := GetOpts(WithCredentialSources([]string{"alice", "bob"}))
|
||||
testOpts := getDefaultOptions()
|
||||
testOpts.withCredentialSources = []string{"alice", "bob"}
|
||||
testOpts.WithCredentialSources = []string{"alice", "bob"}
|
||||
assert.Equal(opts, testOpts)
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
package target
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"sync"
|
||||
|
||||
"github.com/hashicorp/boundary/internal/types/subtypes"
|
||||
)
|
||||
|
||||
// AllocFunc is a function that creates an in-memory Target.
|
||||
type AllocFunc func() Target
|
||||
|
||||
// VetFunc is a function that checks the given Target to ensure it can
|
||||
// be used by the Repository.
|
||||
type VetFunc func(context.Context, Target) error
|
||||
|
||||
type registryEntry struct {
|
||||
alloc AllocFunc
|
||||
vet VetFunc
|
||||
prefix string
|
||||
}
|
||||
|
||||
type registry struct {
|
||||
m map[subtypes.Subtype]*registryEntry
|
||||
subtypes *subtypes.Registry
|
||||
|
||||
sync.RWMutex
|
||||
}
|
||||
|
||||
func (r *registry) set(s subtypes.Subtype, entry *registryEntry) {
|
||||
r.Lock()
|
||||
defer r.Unlock()
|
||||
|
||||
_, previouslySet := r.m[s]
|
||||
if previouslySet {
|
||||
panic(fmt.Sprintf("target subtype %s already registered", s))
|
||||
}
|
||||
|
||||
if err := r.subtypes.Register(s, entry.prefix); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
r.m[s] = entry
|
||||
}
|
||||
|
||||
func (r *registry) get(s subtypes.Subtype) (*registryEntry, bool) {
|
||||
r.RLock()
|
||||
defer r.RUnlock()
|
||||
|
||||
entry, ok := r.m[s]
|
||||
if ok {
|
||||
return entry, ok
|
||||
}
|
||||
return nil, ok
|
||||
}
|
||||
|
||||
func (r *registry) allocFunc(s subtypes.Subtype) (AllocFunc, bool) {
|
||||
entry, ok := r.get(s)
|
||||
if !ok {
|
||||
return nil, ok
|
||||
}
|
||||
return entry.alloc, ok
|
||||
}
|
||||
|
||||
func (r *registry) vetFunc(s subtypes.Subtype) (VetFunc, bool) {
|
||||
entry, ok := r.get(s)
|
||||
if !ok {
|
||||
return nil, ok
|
||||
}
|
||||
return entry.vet, ok
|
||||
}
|
||||
|
||||
func (r *registry) idPrefix(s subtypes.Subtype) (string, bool) {
|
||||
entry, ok := r.get(s)
|
||||
if !ok {
|
||||
return "", ok
|
||||
}
|
||||
return entry.prefix, ok
|
||||
}
|
||||
|
||||
var subtypeRegistry = registry{
|
||||
m: make(map[subtypes.Subtype]*registryEntry),
|
||||
subtypes: subtypes.NewRegistry(),
|
||||
}
|
||||
|
||||
// SubtypeFromType returns the Subtype from the provided string or if
|
||||
// no Subtype was registered with that string Unknown is returned.
|
||||
func SubtypeFromType(t string) subtypes.Subtype {
|
||||
subtypeRegistry.RLock()
|
||||
defer subtypeRegistry.RUnlock()
|
||||
return subtypeRegistry.subtypes.SubtypeFromType(t)
|
||||
}
|
||||
|
||||
// SubtypeFromId returns the Subtype from the provided id if the id's prefix
|
||||
// was registered with a Subtype. Otherwise Unknown is returned.
|
||||
func SubtypeFromId(id string) subtypes.Subtype {
|
||||
subtypeRegistry.RLock()
|
||||
defer subtypeRegistry.RUnlock()
|
||||
return subtypeRegistry.subtypes.SubtypeFromId(id)
|
||||
}
|
||||
|
||||
// Register registers repository hooks and the prefixes for a provided Subtype. Register
|
||||
// panics if the subtype has already been registered or if any of the
|
||||
// prefixes are associated with another subtype.
|
||||
func Register(s subtypes.Subtype, af AllocFunc, vf VetFunc, prefix string) {
|
||||
subtypeRegistry.set(s, ®istryEntry{
|
||||
alloc: af,
|
||||
vet: vf,
|
||||
prefix: prefix,
|
||||
})
|
||||
}
|
||||
+232
-33
@@ -6,6 +6,7 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/hashicorp/boundary/internal/db"
|
||||
dbcommon "github.com/hashicorp/boundary/internal/db/common"
|
||||
"github.com/hashicorp/boundary/internal/errors"
|
||||
"github.com/hashicorp/boundary/internal/kms"
|
||||
"github.com/hashicorp/boundary/internal/oplog"
|
||||
@@ -13,7 +14,7 @@ import (
|
||||
|
||||
// Cloneable provides a cloning interface
|
||||
type Cloneable interface {
|
||||
Clone() interface{}
|
||||
Clone() Target
|
||||
}
|
||||
|
||||
// Repository is the target database repository
|
||||
@@ -39,16 +40,16 @@ func NewRepository(r db.Reader, w db.Writer, kms *kms.Kms, opt ...Option) (*Repo
|
||||
if kms == nil {
|
||||
return nil, errors.NewDeprecated(errors.InvalidParameter, op, "nil kms")
|
||||
}
|
||||
opts := getOpts(opt...)
|
||||
if opts.withLimit == 0 {
|
||||
opts := GetOpts(opt...)
|
||||
if opts.WithLimit == 0 {
|
||||
// zero signals the boundary defaults should be used.
|
||||
opts.withLimit = db.DefaultLimit
|
||||
opts.WithLimit = db.DefaultLimit
|
||||
}
|
||||
return &Repository{
|
||||
reader: r,
|
||||
writer: w,
|
||||
kms: kms,
|
||||
defaultLimit: opts.withLimit,
|
||||
defaultLimit: opts.WithLimit,
|
||||
}, nil
|
||||
}
|
||||
|
||||
@@ -57,7 +58,7 @@ func NewRepository(r db.Reader, w db.Writer, kms *kms.Kms, opt ...Option) (*Repo
|
||||
// found, it will return nil, nil, nil, nil. No options are currently supported.
|
||||
func (r *Repository) LookupTarget(ctx context.Context, publicIdOrName string, opt ...Option) (Target, []HostSource, []CredentialSource, error) {
|
||||
const op = "target.(Repository).LookupTarget"
|
||||
opts := getOpts(opt...)
|
||||
opts := GetOpts(opt...)
|
||||
|
||||
if publicIdOrName == "" {
|
||||
return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing public id")
|
||||
@@ -65,23 +66,23 @@ func (r *Repository) LookupTarget(ctx context.Context, publicIdOrName string, op
|
||||
|
||||
var where []string
|
||||
var whereArgs []interface{}
|
||||
nameEmpty := opts.withName == ""
|
||||
scopeIdEmpty := opts.withScopeId == ""
|
||||
scopeNameEmpty := opts.withScopeName == ""
|
||||
nameEmpty := opts.WithName == ""
|
||||
scopeIdEmpty := opts.WithScopeId == ""
|
||||
scopeNameEmpty := opts.WithScopeName == ""
|
||||
if !nameEmpty {
|
||||
if opts.withName != publicIdOrName {
|
||||
if opts.WithName != publicIdOrName {
|
||||
return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "name passed in but does not match publicId")
|
||||
}
|
||||
where, whereArgs = append(where, "lower(name) = lower(?)"), append(whereArgs, opts.withName)
|
||||
where, whereArgs = append(where, "lower(name) = lower(?)"), append(whereArgs, opts.WithName)
|
||||
switch {
|
||||
case scopeIdEmpty && scopeNameEmpty:
|
||||
return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "using name but both scope ID and scope name are empty")
|
||||
case !scopeIdEmpty && !scopeNameEmpty:
|
||||
return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "using name but both scope ID and scope name are set")
|
||||
case !scopeIdEmpty:
|
||||
where, whereArgs = append(where, "scope_id = ?"), append(whereArgs, opts.withScopeId)
|
||||
where, whereArgs = append(where, "scope_id = ?"), append(whereArgs, opts.WithScopeId)
|
||||
case !scopeNameEmpty:
|
||||
where, whereArgs = append(where, "scope_id = (select public_id from iam_scope where lower(name) = lower(?))"), append(whereArgs, opts.withScopeName)
|
||||
where, whereArgs = append(where, "scope_id = (select public_id from iam_scope where lower(name) = lower(?))"), append(whereArgs, opts.WithScopeName)
|
||||
default:
|
||||
return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "unknown combination of parameters")
|
||||
}
|
||||
@@ -130,7 +131,7 @@ func (r *Repository) LookupTarget(ctx context.Context, publicIdOrName string, op
|
||||
}
|
||||
return nil, nil, nil, errors.Wrap(ctx, err, op)
|
||||
}
|
||||
subtype, err := target.targetSubtype()
|
||||
subtype, err := target.targetSubtype(ctx)
|
||||
if err != nil {
|
||||
return nil, nil, nil, errors.Wrap(ctx, err, op)
|
||||
}
|
||||
@@ -140,18 +141,18 @@ func (r *Repository) LookupTarget(ctx context.Context, publicIdOrName string, op
|
||||
// ListTargets in targets in a scope. Supports the WithScopeId, WithLimit, WithTargetType options.
|
||||
func (r *Repository) ListTargets(ctx context.Context, opt ...Option) ([]Target, error) {
|
||||
const op = "target.(Repository).ListTargets"
|
||||
opts := getOpts(opt...)
|
||||
if len(opts.withScopeIds) == 0 && opts.withUserId == "" {
|
||||
opts := GetOpts(opt...)
|
||||
if len(opts.WithScopeIds) == 0 && opts.WithUserId == "" {
|
||||
return nil, errors.New(ctx, errors.InvalidParameter, op, "must specify either scope id or user id")
|
||||
}
|
||||
// TODO (jimlambrt 8/2020) - implement WithUserId() optional filtering.
|
||||
var where []string
|
||||
var args []interface{}
|
||||
if len(opts.withScopeIds) != 0 {
|
||||
where, args = append(where, "scope_id in (?)"), append(args, opts.withScopeIds)
|
||||
if len(opts.WithScopeIds) != 0 {
|
||||
where, args = append(where, "scope_id in (?)"), append(args, opts.WithScopeIds)
|
||||
}
|
||||
if opts.withTargetType != nil {
|
||||
where, args = append(where, "type = ?"), append(args, opts.withTargetType.String())
|
||||
if opts.WithTargetType != nil {
|
||||
where, args = append(where, "type = ?"), append(args, opts.WithTargetType.String())
|
||||
}
|
||||
|
||||
var foundTargets []*targetView
|
||||
@@ -163,7 +164,7 @@ func (r *Repository) ListTargets(ctx context.Context, opt ...Option) ([]Target,
|
||||
targets := make([]Target, 0, len(foundTargets))
|
||||
|
||||
for _, t := range foundTargets {
|
||||
subtype, err := t.targetSubtype()
|
||||
subtype, err := t.targetSubtype(ctx)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(ctx, err, op)
|
||||
}
|
||||
@@ -176,12 +177,12 @@ func (r *Repository) ListTargets(ctx context.Context, opt ...Option) ([]Target,
|
||||
// repo defaultLimit
|
||||
func (r *Repository) list(ctx context.Context, resources interface{}, where string, args []interface{}, opt ...Option) error {
|
||||
const op = "target.(Repository).list"
|
||||
opts := getOpts(opt...)
|
||||
opts := GetOpts(opt...)
|
||||
limit := r.defaultLimit
|
||||
var dbOpts []db.Option
|
||||
if opts.withLimit != 0 {
|
||||
if opts.WithLimit != 0 {
|
||||
// non-zero signals an override of the default limit for the repo.
|
||||
limit = opts.withLimit
|
||||
limit = opts.WithLimit
|
||||
}
|
||||
dbOpts = append(dbOpts, db.WithLimit(limit))
|
||||
if err := r.reader.SearchWhere(ctx, resources, where, args, dbOpts...); err != nil {
|
||||
@@ -202,17 +203,16 @@ func (r *Repository) DeleteTarget(ctx context.Context, publicId string, _ ...Opt
|
||||
return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", publicId)))
|
||||
}
|
||||
var metadata oplog.Metadata
|
||||
var deleteTarget interface{}
|
||||
switch t.Type {
|
||||
case TcpTargetType.String():
|
||||
tcpT := allocTcpTarget()
|
||||
tcpT.PublicId = publicId
|
||||
deleteTarget = &tcpT
|
||||
metadata = tcpT.oplog(oplog.OpType_OP_TYPE_DELETE)
|
||||
default:
|
||||
var deleteTarget Target
|
||||
alloc, ok := subtypeRegistry.allocFunc(t.Subtype())
|
||||
if !ok {
|
||||
return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s is an unsupported target type %s", publicId, t.Type))
|
||||
}
|
||||
|
||||
deleteTarget = alloc()
|
||||
deleteTarget.SetPublicId(ctx, publicId)
|
||||
metadata = deleteTarget.Oplog(oplog.OpType_OP_TYPE_DELETE)
|
||||
|
||||
oplogWrapper, err := r.kms.GetWrapper(ctx, t.ScopeId, kms.KeyPurposeOplog)
|
||||
if err != nil {
|
||||
return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper"))
|
||||
@@ -277,7 +277,7 @@ func (r *Repository) update(ctx context.Context, target Target, version uint32,
|
||||
if err != nil {
|
||||
return nil, nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper"))
|
||||
}
|
||||
metadata := target.oplog(oplog.OpType_OP_TYPE_UPDATE)
|
||||
metadata := target.Oplog(oplog.OpType_OP_TYPE_UPDATE)
|
||||
dbOpts = append(dbOpts, db.WithOplog(oplogWrapper, metadata))
|
||||
|
||||
var rowsUpdated int
|
||||
@@ -320,3 +320,202 @@ func (r *Repository) update(ctx context.Context, target Target, version uint32,
|
||||
}
|
||||
return returnedTarget.(Target), hostSources, credSources, rowsUpdated, nil
|
||||
}
|
||||
|
||||
// CreateTarget inserts into the repository and returns the new Target with
|
||||
// its list of host sets and credential libraries.
|
||||
// WithHostSources and WithCredentialSources are the only supported option.
|
||||
func (r *Repository) CreateTarget(ctx context.Context, target Target, opt ...Option) (Target, []HostSource, []CredentialSource, error) {
|
||||
const op = "target.(Repository).CreateTarget"
|
||||
opts := GetOpts(opt...)
|
||||
if target == nil {
|
||||
return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing target")
|
||||
}
|
||||
|
||||
vet, ok := subtypeRegistry.vetFunc(target.GetType())
|
||||
if !ok {
|
||||
return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("unsupported target type %s", target.GetType()))
|
||||
}
|
||||
if err := vet(ctx, target); err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
if target.GetScopeId() == "" {
|
||||
return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing scope id")
|
||||
}
|
||||
if target.GetName() == "" {
|
||||
return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing name")
|
||||
}
|
||||
if target.GetPublicId() != "" {
|
||||
return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "public id not empty")
|
||||
}
|
||||
|
||||
t := target.Clone()
|
||||
|
||||
if opts.WithPublicId != "" {
|
||||
if err := t.SetPublicId(ctx, opts.WithPublicId); err != nil {
|
||||
return nil, nil, nil, err
|
||||
}
|
||||
} else {
|
||||
prefix, ok := subtypeRegistry.idPrefix(target.GetType())
|
||||
if !ok {
|
||||
return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("unsupported target type %s", target.GetType()))
|
||||
}
|
||||
id, err := db.NewPublicId(prefix)
|
||||
if err != nil {
|
||||
return nil, nil, nil, errors.Wrap(ctx, err, op)
|
||||
}
|
||||
t.SetPublicId(ctx, id)
|
||||
}
|
||||
|
||||
oplogWrapper, err := r.kms.GetWrapper(ctx, target.GetScopeId(), kms.KeyPurposeOplog)
|
||||
if err != nil {
|
||||
return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper"))
|
||||
}
|
||||
|
||||
newHostSets := make([]interface{}, 0, len(opts.WithHostSources))
|
||||
for _, hsId := range opts.WithHostSources {
|
||||
hostSet, err := NewTargetHostSet(t.GetPublicId(), hsId)
|
||||
if err != nil {
|
||||
return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory target host set"))
|
||||
}
|
||||
newHostSets = append(newHostSets, hostSet)
|
||||
}
|
||||
|
||||
newCredLibs := make([]interface{}, 0, len(opts.WithCredentialSources))
|
||||
for _, clId := range opts.WithCredentialSources {
|
||||
credLib, err := NewCredentialLibrary(t.GetPublicId(), clId)
|
||||
if err != nil {
|
||||
return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory target credential library"))
|
||||
}
|
||||
newCredLibs = append(newCredLibs, credLib)
|
||||
}
|
||||
|
||||
metadata := t.Oplog(oplog.OpType_OP_TYPE_CREATE)
|
||||
var returnedTarget interface{}
|
||||
var returnedHostSources []HostSource
|
||||
var returnedCredSources []CredentialSource
|
||||
_, err = r.writer.DoTx(
|
||||
ctx,
|
||||
db.StdRetryCnt,
|
||||
db.ExpBackoff{},
|
||||
func(read db.Reader, w db.Writer) error {
|
||||
targetTicket, err := w.GetTicket(t)
|
||||
if err != nil {
|
||||
return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket"))
|
||||
}
|
||||
msgs := make([]*oplog.Message, 0, 2)
|
||||
var targetOplogMsg oplog.Message
|
||||
returnedTarget = t.Clone()
|
||||
if err := w.Create(ctx, returnedTarget, db.NewOplogMsg(&targetOplogMsg)); err != nil {
|
||||
return errors.Wrap(ctx, err, op, errors.WithMsg("unable to create target"))
|
||||
}
|
||||
msgs = append(msgs, &targetOplogMsg)
|
||||
if len(newHostSets) > 0 {
|
||||
hostSetOplogMsgs := make([]*oplog.Message, 0, len(newHostSets))
|
||||
if err := w.CreateItems(ctx, newHostSets, db.NewOplogMsgs(&hostSetOplogMsgs)); err != nil {
|
||||
return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add host sets"))
|
||||
}
|
||||
if returnedHostSources, err = fetchHostSources(ctx, read, t.GetPublicId()); err != nil {
|
||||
return errors.Wrap(ctx, err, op, errors.WithMsg("unable to read host sources"))
|
||||
}
|
||||
msgs = append(msgs, hostSetOplogMsgs...)
|
||||
}
|
||||
if len(newCredLibs) > 0 {
|
||||
credLibOplogMsgs := make([]*oplog.Message, 0, len(newCredLibs))
|
||||
if err := w.CreateItems(ctx, newCredLibs, db.NewOplogMsgs(&credLibOplogMsgs)); err != nil {
|
||||
return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add credential sources"))
|
||||
}
|
||||
if returnedCredSources, err = fetchCredentialSources(ctx, read, t.GetPublicId()); err != nil {
|
||||
return errors.Wrap(ctx, err, op, errors.WithMsg("unable to read credential sources"))
|
||||
}
|
||||
msgs = append(msgs, credLibOplogMsgs...)
|
||||
}
|
||||
if err := w.WriteOplogEntryWith(ctx, oplogWrapper, targetTicket, metadata, msgs); err != nil {
|
||||
return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog"))
|
||||
}
|
||||
|
||||
return nil
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s target id", t.GetPublicId())))
|
||||
}
|
||||
return returnedTarget.(Target), returnedHostSources, returnedCredSources, nil
|
||||
}
|
||||
|
||||
// UpdateTarget will update a target in the repository and return the written
|
||||
// target. fieldMaskPaths provides field_mask.proto paths for fields that should
|
||||
// be updated. Fields will be set to NULL if the field is a zero value and
|
||||
// included in fieldMask. Name, Description, and WorkerFilter are the only
|
||||
// updatable fields. If no updatable fields are included in the fieldMaskPaths,
|
||||
// then an error is returned.
|
||||
func (r *Repository) UpdateTarget(ctx context.Context, target Target, version uint32, fieldMaskPaths []string, _ ...Option) (Target, []HostSource, []CredentialSource, int, error) {
|
||||
const op = "target.(Repository).UpdateTarget"
|
||||
if target == nil {
|
||||
return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing target")
|
||||
}
|
||||
vet, ok := subtypeRegistry.vetFunc(target.GetType())
|
||||
if !ok {
|
||||
return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("unsupported target type %s", target.GetType()))
|
||||
}
|
||||
if err := vet(ctx, target); err != nil {
|
||||
return nil, nil, nil, db.NoRowsAffected, err
|
||||
}
|
||||
|
||||
if target.GetPublicId() == "" {
|
||||
return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing target public id")
|
||||
}
|
||||
|
||||
for _, f := range fieldMaskPaths {
|
||||
switch {
|
||||
case strings.EqualFold("name", f):
|
||||
case strings.EqualFold("description", f):
|
||||
case strings.EqualFold("defaultport", f):
|
||||
case strings.EqualFold("sessionmaxseconds", f):
|
||||
case strings.EqualFold("sessionconnectionlimit", f):
|
||||
case strings.EqualFold("workerfilter", f):
|
||||
default:
|
||||
return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidFieldMask, op, fmt.Sprintf("invalid field mask: %s", f))
|
||||
}
|
||||
}
|
||||
var dbMask, nullFields []string
|
||||
dbMask, nullFields = dbcommon.BuildUpdatePaths(
|
||||
map[string]interface{}{
|
||||
"Name": target.GetName(),
|
||||
"Description": target.GetDescription(),
|
||||
"DefaultPort": target.GetDefaultPort(),
|
||||
"SessionMaxSeconds": target.GetSessionMaxSeconds(),
|
||||
"SessionConnectionLimit": target.GetSessionConnectionLimit(),
|
||||
"WorkerFilter": target.GetWorkerFilter(),
|
||||
},
|
||||
fieldMaskPaths,
|
||||
[]string{"SessionMaxSeconds", "SessionConnectionLimit"},
|
||||
)
|
||||
if len(dbMask) == 0 && len(nullFields) == 0 {
|
||||
return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.EmptyFieldMask, op, "empty field mask")
|
||||
}
|
||||
var returnedTarget Target
|
||||
var rowsUpdated int
|
||||
var hostSources []HostSource
|
||||
var credSources []CredentialSource
|
||||
_, err := r.writer.DoTx(
|
||||
ctx,
|
||||
db.StdRetryCnt,
|
||||
db.ExpBackoff{},
|
||||
func(read db.Reader, w db.Writer) error {
|
||||
var err error
|
||||
t := target.Clone()
|
||||
returnedTarget, hostSources, credSources, rowsUpdated, err = r.update(ctx, t, version, dbMask, nullFields)
|
||||
if err != nil {
|
||||
return errors.Wrap(ctx, err, op)
|
||||
}
|
||||
return nil
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
if errors.IsUniqueError(err) {
|
||||
return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.NotUnique, op, fmt.Sprintf("target %s already exists in scope %s", target.GetName(), target.GetScopeId()))
|
||||
}
|
||||
return nil, nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", target.GetPublicId())))
|
||||
}
|
||||
return returnedTarget, hostSources, credSources, rowsUpdated, nil
|
||||
}
|
||||
@@ -43,19 +43,18 @@ func (r *Repository) AddTargetCredentialSources(ctx context.Context, targetId st
|
||||
return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", targetId)))
|
||||
}
|
||||
var metadata oplog.Metadata
|
||||
var target interface{}
|
||||
switch t.Type {
|
||||
case TcpTargetType.String():
|
||||
tcpT := allocTcpTarget()
|
||||
tcpT.PublicId = t.PublicId
|
||||
tcpT.Version = targetVersion + 1
|
||||
target = &tcpT
|
||||
metadata = tcpT.oplog(oplog.OpType_OP_TYPE_UPDATE)
|
||||
metadata["op-type"] = append(metadata["op-type"], oplog.OpType_OP_TYPE_CREATE.String())
|
||||
default:
|
||||
|
||||
alloc, ok := subtypeRegistry.allocFunc(t.Subtype())
|
||||
if !ok {
|
||||
return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s is an unsupported target type %s", t.PublicId, t.Type))
|
||||
}
|
||||
|
||||
target := alloc()
|
||||
target.SetPublicId(ctx, t.PublicId)
|
||||
target.SetVersion(targetVersion + 1)
|
||||
metadata = target.Oplog(oplog.OpType_OP_TYPE_UPDATE)
|
||||
metadata["op-type"] = append(metadata["op-type"], oplog.OpType_OP_TYPE_CREATE.String())
|
||||
|
||||
oplogWrapper, err := r.kms.GetWrapper(ctx, t.GetScopeId(), kms.KeyPurposeOplog)
|
||||
if err != nil {
|
||||
return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper"))
|
||||
@@ -143,18 +142,16 @@ func (r *Repository) DeleteTargetCredentialSources(ctx context.Context, targetId
|
||||
return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", targetId)))
|
||||
}
|
||||
var metadata oplog.Metadata
|
||||
var target interface{}
|
||||
switch t.Type {
|
||||
case TcpTargetType.String():
|
||||
tcpT := allocTcpTarget()
|
||||
tcpT.PublicId = t.PublicId
|
||||
tcpT.Version = targetVersion + 1
|
||||
target = &tcpT
|
||||
metadata = tcpT.oplog(oplog.OpType_OP_TYPE_UPDATE)
|
||||
metadata["op-type"] = append(metadata["op-type"], oplog.OpType_OP_TYPE_DELETE.String())
|
||||
default:
|
||||
|
||||
alloc, ok := subtypeRegistry.allocFunc(t.Subtype())
|
||||
if !ok {
|
||||
return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s is an unsupported target type %s", t.PublicId, t.Type))
|
||||
}
|
||||
target := alloc()
|
||||
target.SetPublicId(ctx, t.PublicId)
|
||||
target.SetVersion(targetVersion + 1)
|
||||
metadata = target.Oplog(oplog.OpType_OP_TYPE_UPDATE)
|
||||
metadata["op-type"] = append(metadata["op-type"], oplog.OpType_OP_TYPE_DELETE.String())
|
||||
|
||||
oplogWrapper, err := r.kms.GetWrapper(ctx, t.GetScopeId(), kms.KeyPurposeOplog)
|
||||
if err != nil {
|
||||
@@ -257,17 +254,16 @@ func (r *Repository) SetTargetCredentialSources(ctx context.Context, targetId st
|
||||
return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", targetId)))
|
||||
}
|
||||
var metadata oplog.Metadata
|
||||
var target interface{}
|
||||
switch t.Type {
|
||||
case TcpTargetType.String():
|
||||
tcpT := allocTcpTarget()
|
||||
tcpT.PublicId = t.PublicId
|
||||
tcpT.Version = targetVersion + 1
|
||||
target = &tcpT
|
||||
metadata = tcpT.oplog(oplog.OpType_OP_TYPE_UPDATE)
|
||||
default:
|
||||
|
||||
alloc, ok := subtypeRegistry.allocFunc(t.Subtype())
|
||||
if !ok {
|
||||
return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s is an unsupported target type %s", t.PublicId, t.Type))
|
||||
}
|
||||
target := alloc()
|
||||
target.SetPublicId(ctx, t.PublicId)
|
||||
target.SetVersion(targetVersion + 1)
|
||||
metadata = target.Oplog(oplog.OpType_OP_TYPE_UPDATE)
|
||||
|
||||
oplogWrapper, err := r.kms.GetWrapper(ctx, t.GetScopeId(), kms.KeyPurposeOplog)
|
||||
if err != nil {
|
||||
return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper"))
|
||||
|
||||
@@ -40,18 +40,18 @@ func (r *Repository) AddTargetHostSources(ctx context.Context, targetId string,
|
||||
return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", targetId)))
|
||||
}
|
||||
var metadata oplog.Metadata
|
||||
var target interface{}
|
||||
switch t.Type {
|
||||
case TcpTargetType.String():
|
||||
tcpT := allocTcpTarget()
|
||||
tcpT.PublicId = t.PublicId
|
||||
tcpT.Version = targetVersion + 1
|
||||
target = &tcpT
|
||||
metadata = tcpT.oplog(oplog.OpType_OP_TYPE_UPDATE)
|
||||
metadata["op-type"] = append(metadata["op-type"], oplog.OpType_OP_TYPE_CREATE.String())
|
||||
default:
|
||||
|
||||
alloc, ok := subtypeRegistry.allocFunc(t.Subtype())
|
||||
if !ok {
|
||||
return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s is an unsupported target type %s", t.PublicId, t.Type))
|
||||
}
|
||||
|
||||
target := alloc()
|
||||
target.SetPublicId(ctx, t.PublicId)
|
||||
target.SetVersion(targetVersion + 1)
|
||||
metadata = target.Oplog(oplog.OpType_OP_TYPE_UPDATE)
|
||||
metadata["op-type"] = append(metadata["op-type"], oplog.OpType_OP_TYPE_CREATE.String())
|
||||
|
||||
oplogWrapper, err := r.kms.GetWrapper(ctx, t.GetScopeId(), kms.KeyPurposeOplog)
|
||||
if err != nil {
|
||||
return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper"))
|
||||
@@ -137,18 +137,18 @@ func (r *Repository) DeleteTargetHostSources(ctx context.Context, targetId strin
|
||||
}
|
||||
|
||||
var metadata oplog.Metadata
|
||||
var target interface{}
|
||||
switch t.Type {
|
||||
case TcpTargetType.String():
|
||||
tcpT := allocTcpTarget()
|
||||
tcpT.PublicId = t.PublicId
|
||||
tcpT.Version = targetVersion + 1
|
||||
target = &tcpT
|
||||
metadata = tcpT.oplog(oplog.OpType_OP_TYPE_UPDATE)
|
||||
metadata["op-type"] = append(metadata["op-type"], oplog.OpType_OP_TYPE_DELETE.String())
|
||||
default:
|
||||
|
||||
alloc, ok := subtypeRegistry.allocFunc(t.Subtype())
|
||||
if !ok {
|
||||
return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s is an unsupported target type %s", t.PublicId, t.Type))
|
||||
}
|
||||
|
||||
target := alloc()
|
||||
target.SetPublicId(ctx, t.PublicId)
|
||||
target.SetVersion(targetVersion + 1)
|
||||
metadata = target.Oplog(oplog.OpType_OP_TYPE_UPDATE)
|
||||
metadata["op-type"] = append(metadata["op-type"], oplog.OpType_OP_TYPE_DELETE.String())
|
||||
|
||||
oplogWrapper, err := r.kms.GetWrapper(ctx, t.GetScopeId(), kms.KeyPurposeOplog)
|
||||
if err != nil {
|
||||
return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper"))
|
||||
@@ -260,17 +260,17 @@ func (r *Repository) SetTargetHostSources(ctx context.Context, targetId string,
|
||||
}
|
||||
|
||||
var metadata oplog.Metadata
|
||||
var target interface{}
|
||||
switch t.Type {
|
||||
case TcpTargetType.String():
|
||||
tcpT := allocTcpTarget()
|
||||
tcpT.PublicId = t.PublicId
|
||||
tcpT.Version = targetVersion + 1
|
||||
target = &tcpT
|
||||
metadata = tcpT.oplog(oplog.OpType_OP_TYPE_UPDATE)
|
||||
default:
|
||||
|
||||
alloc, ok := subtypeRegistry.allocFunc(t.Subtype())
|
||||
if !ok {
|
||||
return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s is an unsupported target type %s", t.PublicId, t.Type))
|
||||
}
|
||||
|
||||
target := alloc()
|
||||
target.SetPublicId(ctx, t.PublicId)
|
||||
target.SetVersion(targetVersion + 1)
|
||||
metadata = target.Oplog(oplog.OpType_OP_TYPE_UPDATE)
|
||||
|
||||
oplogWrapper, err := r.kms.GetWrapper(ctx, t.GetScopeId(), kms.KeyPurposeOplog)
|
||||
if err != nil {
|
||||
return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper"))
|
||||
|
||||
@@ -1,198 +0,0 @@
|
||||
package target
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/hashicorp/boundary/internal/db"
|
||||
dbcommon "github.com/hashicorp/boundary/internal/db/common"
|
||||
"github.com/hashicorp/boundary/internal/errors"
|
||||
"github.com/hashicorp/boundary/internal/kms"
|
||||
"github.com/hashicorp/boundary/internal/oplog"
|
||||
)
|
||||
|
||||
// CreateTcpTarget inserts into the repository and returns the new Target with
|
||||
// its list of host sets and credential libraries.
|
||||
// WithHostSources and WithCredentialSources are the only supported option.
|
||||
func (r *Repository) CreateTcpTarget(ctx context.Context, target *TcpTarget, opt ...Option) (Target, []HostSource, []CredentialSource, error) {
|
||||
const op = "target.(Repository).CreateTcpTarget"
|
||||
opts := getOpts(opt...)
|
||||
if target == nil {
|
||||
return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing target")
|
||||
}
|
||||
if target.TcpTarget == nil {
|
||||
return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing target store")
|
||||
}
|
||||
if target.ScopeId == "" {
|
||||
return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing scope id")
|
||||
}
|
||||
if target.Name == "" {
|
||||
return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing name")
|
||||
}
|
||||
if target.PublicId != "" {
|
||||
return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "public id not empty")
|
||||
}
|
||||
|
||||
t := target.Clone().(*TcpTarget)
|
||||
|
||||
if opts.withPublicId != "" {
|
||||
if !strings.HasPrefix(opts.withPublicId, TcpTargetPrefix+"_") {
|
||||
return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("passed-in public ID %q has wrong prefix, should be %q", opts.withPublicId, TcpTargetPrefix))
|
||||
}
|
||||
t.PublicId = opts.withPublicId
|
||||
} else {
|
||||
id, err := newTcpTargetId()
|
||||
if err != nil {
|
||||
return nil, nil, nil, errors.Wrap(ctx, err, op)
|
||||
}
|
||||
t.PublicId = id
|
||||
}
|
||||
|
||||
oplogWrapper, err := r.kms.GetWrapper(ctx, target.ScopeId, kms.KeyPurposeOplog)
|
||||
if err != nil {
|
||||
return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper"))
|
||||
}
|
||||
|
||||
newHostSets := make([]interface{}, 0, len(opts.withHostSources))
|
||||
for _, hsId := range opts.withHostSources {
|
||||
hostSet, err := NewTargetHostSet(t.PublicId, hsId)
|
||||
if err != nil {
|
||||
return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory target host set"))
|
||||
}
|
||||
newHostSets = append(newHostSets, hostSet)
|
||||
}
|
||||
|
||||
newCredLibs := make([]interface{}, 0, len(opts.withCredentialSources))
|
||||
for _, clId := range opts.withCredentialSources {
|
||||
credLib, err := NewCredentialLibrary(t.PublicId, clId)
|
||||
if err != nil {
|
||||
return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory target credential library"))
|
||||
}
|
||||
newCredLibs = append(newCredLibs, credLib)
|
||||
}
|
||||
|
||||
metadata := t.oplog(oplog.OpType_OP_TYPE_CREATE)
|
||||
var returnedTarget interface{}
|
||||
var returnedHostSources []HostSource
|
||||
var returnedCredSources []CredentialSource
|
||||
_, err = r.writer.DoTx(
|
||||
ctx,
|
||||
db.StdRetryCnt,
|
||||
db.ExpBackoff{},
|
||||
func(read db.Reader, w db.Writer) error {
|
||||
targetTicket, err := w.GetTicket(t)
|
||||
if err != nil {
|
||||
return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket"))
|
||||
}
|
||||
msgs := make([]*oplog.Message, 0, 2)
|
||||
var targetOplogMsg oplog.Message
|
||||
returnedTarget = t.Clone()
|
||||
if err := w.Create(ctx, returnedTarget, db.NewOplogMsg(&targetOplogMsg)); err != nil {
|
||||
return errors.Wrap(ctx, err, op, errors.WithMsg("unable to create target"))
|
||||
}
|
||||
msgs = append(msgs, &targetOplogMsg)
|
||||
if len(newHostSets) > 0 {
|
||||
hostSetOplogMsgs := make([]*oplog.Message, 0, len(newHostSets))
|
||||
if err := w.CreateItems(ctx, newHostSets, db.NewOplogMsgs(&hostSetOplogMsgs)); err != nil {
|
||||
return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add host sets"))
|
||||
}
|
||||
if returnedHostSources, err = fetchHostSources(ctx, read, t.PublicId); err != nil {
|
||||
return errors.Wrap(ctx, err, op, errors.WithMsg("unable to read host sources"))
|
||||
}
|
||||
msgs = append(msgs, hostSetOplogMsgs...)
|
||||
}
|
||||
if len(newCredLibs) > 0 {
|
||||
credLibOplogMsgs := make([]*oplog.Message, 0, len(newCredLibs))
|
||||
if err := w.CreateItems(ctx, newCredLibs, db.NewOplogMsgs(&credLibOplogMsgs)); err != nil {
|
||||
return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add credential sources"))
|
||||
}
|
||||
if returnedCredSources, err = fetchCredentialSources(ctx, read, t.PublicId); err != nil {
|
||||
return errors.Wrap(ctx, err, op, errors.WithMsg("unable to read credential sources"))
|
||||
}
|
||||
msgs = append(msgs, credLibOplogMsgs...)
|
||||
}
|
||||
if err := w.WriteOplogEntryWith(ctx, oplogWrapper, targetTicket, metadata, msgs); err != nil {
|
||||
return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog"))
|
||||
}
|
||||
|
||||
return nil
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s target id", t.PublicId)))
|
||||
}
|
||||
return returnedTarget.(*TcpTarget), returnedHostSources, returnedCredSources, nil
|
||||
}
|
||||
|
||||
// UpdateTcpTarget will update a target in the repository and return the written
|
||||
// target. fieldMaskPaths provides field_mask.proto paths for fields that should
|
||||
// be updated. Fields will be set to NULL if the field is a zero value and
|
||||
// included in fieldMask. Name, Description, and WorkerFilter are the only
|
||||
// updatable fields. If no updatable fields are included in the fieldMaskPaths,
|
||||
// then an error is returned.
|
||||
func (r *Repository) UpdateTcpTarget(ctx context.Context, target *TcpTarget, version uint32, fieldMaskPaths []string, _ ...Option) (Target, []HostSource, []CredentialSource, int, error) {
|
||||
const op = "target.(Repository).UpdateTcpTarget"
|
||||
if target == nil {
|
||||
return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing target")
|
||||
}
|
||||
if target.TcpTarget == nil {
|
||||
return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing target store")
|
||||
}
|
||||
if target.PublicId == "" {
|
||||
return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing target public id")
|
||||
}
|
||||
for _, f := range fieldMaskPaths {
|
||||
switch {
|
||||
case strings.EqualFold("name", f):
|
||||
case strings.EqualFold("description", f):
|
||||
case strings.EqualFold("defaultport", f):
|
||||
case strings.EqualFold("sessionmaxseconds", f):
|
||||
case strings.EqualFold("sessionconnectionlimit", f):
|
||||
case strings.EqualFold("workerfilter", f):
|
||||
default:
|
||||
return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidFieldMask, op, fmt.Sprintf("invalid field mask: %s", f))
|
||||
}
|
||||
}
|
||||
var dbMask, nullFields []string
|
||||
dbMask, nullFields = dbcommon.BuildUpdatePaths(
|
||||
map[string]interface{}{
|
||||
"Name": target.Name,
|
||||
"Description": target.Description,
|
||||
"DefaultPort": target.DefaultPort,
|
||||
"SessionMaxSeconds": target.SessionMaxSeconds,
|
||||
"SessionConnectionLimit": target.SessionConnectionLimit,
|
||||
"WorkerFilter": target.WorkerFilter,
|
||||
},
|
||||
fieldMaskPaths,
|
||||
[]string{"SessionMaxSeconds", "SessionConnectionLimit"},
|
||||
)
|
||||
if len(dbMask) == 0 && len(nullFields) == 0 {
|
||||
return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.EmptyFieldMask, op, "empty field mask")
|
||||
}
|
||||
var returnedTarget Target
|
||||
var rowsUpdated int
|
||||
var hostSources []HostSource
|
||||
var credSources []CredentialSource
|
||||
_, err := r.writer.DoTx(
|
||||
ctx,
|
||||
db.StdRetryCnt,
|
||||
db.ExpBackoff{},
|
||||
func(read db.Reader, w db.Writer) error {
|
||||
var err error
|
||||
t := target.Clone().(*TcpTarget)
|
||||
returnedTarget, hostSources, credSources, rowsUpdated, err = r.update(ctx, t, version, dbMask, nullFields)
|
||||
if err != nil {
|
||||
return errors.Wrap(ctx, err, op)
|
||||
}
|
||||
return nil
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
if errors.IsUniqueError(err) {
|
||||
return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.NotUnique, op, fmt.Sprintf("target %s already exists in scope %s", target.Name, target.ScopeId))
|
||||
}
|
||||
return nil, nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", target.PublicId)))
|
||||
}
|
||||
return returnedTarget, hostSources, credSources, rowsUpdated, nil
|
||||
}
|
||||
+344
-350
@@ -1,17 +1,11 @@
|
||||
package target
|
||||
package target_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/hashicorp/boundary/internal/db"
|
||||
"github.com/hashicorp/boundary/internal/errors"
|
||||
"github.com/hashicorp/boundary/internal/iam"
|
||||
"github.com/hashicorp/boundary/internal/kms"
|
||||
"github.com/hashicorp/boundary/internal/oplog"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
@@ -28,9 +22,9 @@ func TestNewRepository(t *testing.T) {
|
||||
kms *kms.Kms
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
want *Repository
|
||||
name string
|
||||
args args
|
||||
// want *target.Repository
|
||||
wantErr bool
|
||||
wantErrString string
|
||||
}{
|
||||
@@ -41,12 +35,12 @@ func TestNewRepository(t *testing.T) {
|
||||
w: rw,
|
||||
kms: testKms,
|
||||
},
|
||||
want: &Repository{
|
||||
reader: rw,
|
||||
writer: rw,
|
||||
kms: testKms,
|
||||
defaultLimit: db.DefaultLimit,
|
||||
},
|
||||
// want: &target.Repository{
|
||||
// reader: rw,
|
||||
// writer: rw,
|
||||
// kms: testKms,
|
||||
// defaultLimit: db.DefaultLimit,
|
||||
// },
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
@@ -56,7 +50,7 @@ func TestNewRepository(t *testing.T) {
|
||||
w: rw,
|
||||
kms: nil,
|
||||
},
|
||||
want: nil,
|
||||
// want: nil,
|
||||
wantErr: true,
|
||||
wantErrString: "target.NewRepository: nil kms: parameter violation: error #100",
|
||||
},
|
||||
@@ -67,7 +61,7 @@ func TestNewRepository(t *testing.T) {
|
||||
w: nil,
|
||||
kms: testKms,
|
||||
},
|
||||
want: nil,
|
||||
// want: nil,
|
||||
wantErr: true,
|
||||
wantErrString: "target.NewRepository: nil writer: parameter violation: error #100",
|
||||
},
|
||||
@@ -78,7 +72,7 @@ func TestNewRepository(t *testing.T) {
|
||||
w: rw,
|
||||
kms: testKms,
|
||||
},
|
||||
want: nil,
|
||||
// want: nil,
|
||||
wantErr: true,
|
||||
wantErrString: "target.NewRepository: nil reader: parameter violation: error #100",
|
||||
},
|
||||
@@ -86,343 +80,343 @@ func TestNewRepository(t *testing.T) {
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
got, err := NewRepository(tt.args.r, tt.args.w, tt.args.kms)
|
||||
got, err := target.NewRepository(tt.args.r, tt.args.w, tt.args.kms)
|
||||
if tt.wantErr {
|
||||
require.Error(err)
|
||||
assert.Equal(tt.wantErrString, err.Error())
|
||||
return
|
||||
}
|
||||
require.NoError(err)
|
||||
assert.Equal(tt.want, got)
|
||||
assert.NotNil(got)
|
||||
// assert.Equal(tt.want, got)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestRepository_LookupTarget(t *testing.T) {
|
||||
t.Parallel()
|
||||
conn, _ := db.TestSetup(t, "postgres")
|
||||
wrapper := db.TestWrapper(t)
|
||||
testKms := kms.TestKms(t, conn, wrapper)
|
||||
iamRepo := iam.TestRepo(t, conn, wrapper)
|
||||
_, proj := iam.TestScopes(t, iamRepo)
|
||||
proj.Name = "project-name"
|
||||
_, _, err := iamRepo.UpdateScope(context.Background(), proj, 1, []string{"name"})
|
||||
require.NoError(t, err)
|
||||
rw := db.New(conn)
|
||||
repo, err := NewRepository(rw, rw, testKms)
|
||||
require.NoError(t, err)
|
||||
tgt := TestTcpTarget(t, conn, proj.PublicId, "target-name")
|
||||
|
||||
tests := []struct {
|
||||
testName string
|
||||
id string
|
||||
name string
|
||||
scopeId string
|
||||
scopeName string
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
testName: "id",
|
||||
id: tgt.PublicId,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
testName: "name only",
|
||||
name: tgt.Name,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
testName: "scope id only",
|
||||
scopeId: proj.PublicId,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
testName: "scope name only",
|
||||
scopeName: proj.Name,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
testName: "scope name and id",
|
||||
scopeId: proj.PublicId,
|
||||
scopeName: proj.Name,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
testName: "everything",
|
||||
name: tgt.Name,
|
||||
scopeId: proj.PublicId,
|
||||
scopeName: proj.Name,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
testName: "name and scope name",
|
||||
name: tgt.Name,
|
||||
scopeName: proj.Name,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
testName: "name and scope id",
|
||||
name: tgt.Name,
|
||||
scopeId: proj.PublicId,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
testName: "id and name",
|
||||
id: tgt.PublicId,
|
||||
name: tgt.Name,
|
||||
scopeId: proj.PublicId,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
testName: "id and scope name",
|
||||
id: tgt.PublicId,
|
||||
scopeName: proj.Name,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
testName: "id and scope id",
|
||||
id: tgt.PublicId,
|
||||
scopeId: proj.PublicId,
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.testName, func(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
id := tt.id
|
||||
if tt.name != "" && tt.id == "" {
|
||||
id = tt.name
|
||||
}
|
||||
var opts []Option
|
||||
if tt.name != "" {
|
||||
opts = append(opts, WithName(tt.name))
|
||||
}
|
||||
if tt.scopeId != "" {
|
||||
opts = append(opts, WithScopeId(tt.scopeId))
|
||||
}
|
||||
if tt.scopeName != "" {
|
||||
opts = append(opts, WithScopeName(tt.scopeName))
|
||||
}
|
||||
got, _, _, err := repo.LookupTarget(context.Background(), id, opts...)
|
||||
if tt.wantErr {
|
||||
require.Error(err)
|
||||
return
|
||||
}
|
||||
require.NoError(err)
|
||||
assert.Equal(tgt.PublicId, got.GetPublicId())
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestRepository_ListTargets(t *testing.T) {
|
||||
t.Parallel()
|
||||
conn, _ := db.TestSetup(t, "postgres")
|
||||
const testLimit = 10
|
||||
wrapper := db.TestWrapper(t)
|
||||
testKms := kms.TestKms(t, conn, wrapper)
|
||||
iamRepo := iam.TestRepo(t, conn, wrapper)
|
||||
_, proj := iam.TestScopes(t, iamRepo)
|
||||
rw := db.New(conn)
|
||||
repo, err := NewRepository(rw, rw, testKms)
|
||||
require.NoError(t, err)
|
||||
repo.defaultLimit = testLimit
|
||||
|
||||
type args struct {
|
||||
opt []Option
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
createCnt int
|
||||
createScopeId string
|
||||
createScopeId2 string
|
||||
grantUserId string
|
||||
args args
|
||||
wantCnt int
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "tcp-target",
|
||||
createCnt: 5,
|
||||
createScopeId: proj.PublicId,
|
||||
args: args{
|
||||
opt: []Option{WithTargetType(TcpTargetType), WithScopeIds([]string{proj.PublicId})},
|
||||
},
|
||||
wantCnt: 5,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "no-limit",
|
||||
createCnt: testLimit + 1,
|
||||
createScopeId: proj.PublicId,
|
||||
args: args{
|
||||
opt: []Option{WithLimit(-1), WithScopeIds([]string{proj.PublicId})},
|
||||
},
|
||||
wantCnt: testLimit + 1,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "default-limit",
|
||||
createCnt: testLimit + 1,
|
||||
createScopeId: proj.PublicId,
|
||||
args: args{
|
||||
opt: []Option{WithScopeIds([]string{proj.PublicId})},
|
||||
},
|
||||
wantCnt: testLimit,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "custom-limit",
|
||||
createCnt: testLimit + 1,
|
||||
createScopeId: proj.PublicId,
|
||||
args: args{
|
||||
opt: []Option{WithLimit(3), WithScopeIds([]string{proj.PublicId})},
|
||||
},
|
||||
wantCnt: 3,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "bad-org",
|
||||
createCnt: 1,
|
||||
createScopeId: proj.PublicId,
|
||||
args: args{
|
||||
opt: []Option{WithScopeIds([]string{"bad-id"})},
|
||||
},
|
||||
wantCnt: 0,
|
||||
wantErr: false,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
require.NoError(conn.Where("1=1").Delete(allocTcpTarget()).Error)
|
||||
testGroups := []*TcpTarget{}
|
||||
for i := 0; i < tt.createCnt; i++ {
|
||||
switch {
|
||||
case tt.createScopeId2 != "" && i%2 == 0:
|
||||
testGroups = append(testGroups, TestTcpTarget(t, conn, tt.createScopeId2, strconv.Itoa(i)))
|
||||
default:
|
||||
testGroups = append(testGroups, TestTcpTarget(t, conn, tt.createScopeId, strconv.Itoa(i)))
|
||||
}
|
||||
}
|
||||
assert.Equal(tt.createCnt, len(testGroups))
|
||||
got, err := repo.ListTargets(context.Background(), tt.args.opt...)
|
||||
if tt.wantErr {
|
||||
require.Error(err)
|
||||
return
|
||||
}
|
||||
require.NoError(err)
|
||||
assert.Equal(tt.wantCnt, len(got))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestRepository_ListRoles_Multiple_Scopes(t *testing.T) {
|
||||
t.Parallel()
|
||||
conn, _ := db.TestSetup(t, "postgres")
|
||||
wrapper := db.TestWrapper(t)
|
||||
testKms := kms.TestKms(t, conn, wrapper)
|
||||
iamRepo := iam.TestRepo(t, conn, wrapper)
|
||||
_, proj1 := iam.TestScopes(t, iamRepo)
|
||||
_, proj2 := iam.TestScopes(t, iamRepo)
|
||||
rw := db.New(conn)
|
||||
repo, err := NewRepository(rw, rw, testKms)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.NoError(t, conn.Where("1=1").Delete(allocTcpTarget()).Error)
|
||||
|
||||
const numPerScope = 10
|
||||
var total int
|
||||
for i := 0; i < numPerScope; i++ {
|
||||
TestTcpTarget(t, conn, proj1.GetPublicId(), fmt.Sprintf("proj1-%d", i))
|
||||
total++
|
||||
TestTcpTarget(t, conn, proj2.GetPublicId(), fmt.Sprintf("proj2-%d", i))
|
||||
total++
|
||||
}
|
||||
|
||||
got, err := repo.ListTargets(context.Background(), WithScopeIds([]string{"global", proj1.GetPublicId(), proj2.GetPublicId()}))
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, total, len(got))
|
||||
}
|
||||
|
||||
func TestRepository_DeleteTarget(t *testing.T) {
|
||||
t.Parallel()
|
||||
conn, _ := db.TestSetup(t, "postgres")
|
||||
rw := db.New(conn)
|
||||
wrapper := db.TestWrapper(t)
|
||||
testKms := kms.TestKms(t, conn, wrapper)
|
||||
iamRepo := iam.TestRepo(t, conn, wrapper)
|
||||
_, proj := iam.TestScopes(t, iamRepo)
|
||||
repo, err := NewRepository(rw, rw, testKms)
|
||||
require.NoError(t, err)
|
||||
|
||||
type args struct {
|
||||
target Target
|
||||
opt []Option
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
wantRowsDeleted int
|
||||
wantErr bool
|
||||
wantErrMsg string
|
||||
}{
|
||||
{
|
||||
name: "valid",
|
||||
args: args{
|
||||
target: TestTcpTarget(t, conn, proj.PublicId, "valid"),
|
||||
},
|
||||
wantRowsDeleted: 1,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "no-public-id",
|
||||
args: args{
|
||||
target: func() Target {
|
||||
target := allocTcpTarget()
|
||||
return &target
|
||||
}(),
|
||||
},
|
||||
wantRowsDeleted: 0,
|
||||
wantErr: true,
|
||||
wantErrMsg: "target.(Repository).DeleteTarget: missing public id: parameter violation: error #100",
|
||||
},
|
||||
{
|
||||
name: "not-found",
|
||||
args: args{
|
||||
target: func() Target {
|
||||
id, err := newTcpTargetId()
|
||||
require.NoError(t, err)
|
||||
target := allocTcpTarget()
|
||||
target.PublicId = id
|
||||
return &target
|
||||
}(),
|
||||
},
|
||||
wantRowsDeleted: 0,
|
||||
wantErr: true,
|
||||
wantErrMsg: "db.LookupById: record not found, search issue: error #1100",
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
deletedRows, err := repo.DeleteTarget(context.Background(), tt.args.target.GetPublicId(), tt.args.opt...)
|
||||
if tt.wantErr {
|
||||
assert.Error(err)
|
||||
assert.Equal(0, deletedRows)
|
||||
assert.Contains(err.Error(), tt.wantErrMsg)
|
||||
err = db.TestVerifyOplog(t, rw, tt.args.target.GetPublicId(), db.WithOperation(oplog.OpType_OP_TYPE_DELETE), db.WithCreateNotBefore(10*time.Second))
|
||||
assert.Error(err)
|
||||
assert.True(errors.IsNotFoundError(err))
|
||||
return
|
||||
}
|
||||
assert.NoError(err)
|
||||
assert.Equal(tt.wantRowsDeleted, deletedRows)
|
||||
foundGroup, _, _, err := repo.LookupTarget(context.Background(), tt.args.target.GetPublicId())
|
||||
assert.NoError(err)
|
||||
assert.Nil(foundGroup)
|
||||
|
||||
err = db.TestVerifyOplog(t, rw, tt.args.target.GetPublicId(), db.WithOperation(oplog.OpType_OP_TYPE_DELETE), db.WithCreateNotBefore(10*time.Second))
|
||||
assert.NoError(err)
|
||||
})
|
||||
}
|
||||
}
|
||||
// func TestRepository_LookupTarget(t *testing.T) {
|
||||
// t.Parallel()
|
||||
// conn, _ := db.TestSetup(t, "postgres")
|
||||
// wrapper := db.TestWrapper(t)
|
||||
// testKms := kms.TestKms(t, conn, wrapper)
|
||||
// iamRepo := iam.TestRepo(t, conn, wrapper)
|
||||
// _, proj := iam.TestScopes(t, iamRepo)
|
||||
// proj.Name = "project-name"
|
||||
// _, _, err := iamRepo.UpdateScope(context.Background(), proj, 1, []string{"name"})
|
||||
// require.NoError(t, err)
|
||||
// rw := db.New(conn)
|
||||
// repo, err := target.NewRepository(rw, rw, testKms)
|
||||
// require.NoError(t, err)
|
||||
// tgt := target.TestTcpTarget(t, conn, proj.PublicId, "target-name")
|
||||
//
|
||||
// tests := []struct {
|
||||
// testName string
|
||||
// id string
|
||||
// name string
|
||||
// scopeId string
|
||||
// scopeName string
|
||||
// wantErr bool
|
||||
// }{
|
||||
// {
|
||||
// testName: "id",
|
||||
// id: tgt.PublicId,
|
||||
// wantErr: false,
|
||||
// },
|
||||
// {
|
||||
// testName: "name only",
|
||||
// name: tgt.Name,
|
||||
// wantErr: true,
|
||||
// },
|
||||
// {
|
||||
// testName: "scope id only",
|
||||
// scopeId: proj.PublicId,
|
||||
// wantErr: true,
|
||||
// },
|
||||
// {
|
||||
// testName: "scope name only",
|
||||
// scopeName: proj.Name,
|
||||
// wantErr: true,
|
||||
// },
|
||||
// {
|
||||
// testName: "scope name and id",
|
||||
// scopeId: proj.PublicId,
|
||||
// scopeName: proj.Name,
|
||||
// wantErr: true,
|
||||
// },
|
||||
// {
|
||||
// testName: "everything",
|
||||
// name: tgt.Name,
|
||||
// scopeId: proj.PublicId,
|
||||
// scopeName: proj.Name,
|
||||
// wantErr: true,
|
||||
// },
|
||||
// {
|
||||
// testName: "name and scope name",
|
||||
// name: tgt.Name,
|
||||
// scopeName: proj.Name,
|
||||
// wantErr: false,
|
||||
// },
|
||||
// {
|
||||
// testName: "name and scope id",
|
||||
// name: tgt.Name,
|
||||
// scopeId: proj.PublicId,
|
||||
// wantErr: false,
|
||||
// },
|
||||
// {
|
||||
// testName: "id and name",
|
||||
// id: tgt.PublicId,
|
||||
// name: tgt.Name,
|
||||
// scopeId: proj.PublicId,
|
||||
// wantErr: true,
|
||||
// },
|
||||
// {
|
||||
// testName: "id and scope name",
|
||||
// id: tgt.PublicId,
|
||||
// scopeName: proj.Name,
|
||||
// wantErr: true,
|
||||
// },
|
||||
// {
|
||||
// testName: "id and scope id",
|
||||
// id: tgt.PublicId,
|
||||
// scopeId: proj.PublicId,
|
||||
// wantErr: true,
|
||||
// },
|
||||
// }
|
||||
// for _, tt := range tests {
|
||||
// t.Run(tt.testName, func(t *testing.T) {
|
||||
// assert, require := assert.New(t), require.New(t)
|
||||
// id := tt.id
|
||||
// if tt.name != "" && tt.id == "" {
|
||||
// id = tt.name
|
||||
// }
|
||||
// var opts []target.Option
|
||||
// if tt.name != "" {
|
||||
// opts = append(opts, target.WithName(tt.name))
|
||||
// }
|
||||
// if tt.scopeId != "" {
|
||||
// opts = append(opts, target.WithScopeId(tt.scopeId))
|
||||
// }
|
||||
// if tt.scopeName != "" {
|
||||
// opts = append(opts, target.WithScopeName(tt.scopeName))
|
||||
// }
|
||||
// got, _, _, err := repo.LookupTarget(context.Background(), id, opts...)
|
||||
// if tt.wantErr {
|
||||
// require.Error(err)
|
||||
// return
|
||||
// }
|
||||
// require.NoError(err)
|
||||
// assert.Equal(tgt.PublicId, got.GetPublicId())
|
||||
// })
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// func TestRepository_ListTargets(t *testing.T) {
|
||||
// t.Parallel()
|
||||
// conn, _ := db.TestSetup(t, "postgres")
|
||||
// const testLimit = 10
|
||||
// wrapper := db.TestWrapper(t)
|
||||
// testKms := kms.TestKms(t, conn, wrapper)
|
||||
// iamRepo := iam.TestRepo(t, conn, wrapper)
|
||||
// _, proj := iam.TestScopes(t, iamRepo)
|
||||
// rw := db.New(conn)
|
||||
// repo, err := target.NewRepository(rw, rw, testKms, target.WithLimit(testLimit))
|
||||
// require.NoError(t, err)
|
||||
//
|
||||
// type args struct {
|
||||
// opt []target.Option
|
||||
// }
|
||||
// tests := []struct {
|
||||
// name string
|
||||
// createCnt int
|
||||
// createScopeId string
|
||||
// createScopeId2 string
|
||||
// grantUserId string
|
||||
// args args
|
||||
// wantCnt int
|
||||
// wantErr bool
|
||||
// }{
|
||||
// {
|
||||
// name: "tcp-target",
|
||||
// createCnt: 5,
|
||||
// createScopeId: proj.PublicId,
|
||||
// args: args{
|
||||
// opt: []target.Option{target.WithTargetType(target.TcpTargetType), target.WithScopeIds([]string{proj.PublicId})},
|
||||
// },
|
||||
// wantCnt: 5,
|
||||
// wantErr: false,
|
||||
// },
|
||||
// {
|
||||
// name: "no-limit",
|
||||
// createCnt: testLimit + 1,
|
||||
// createScopeId: proj.PublicId,
|
||||
// args: args{
|
||||
// opt: []target.Option{target.WithLimit(-1), target.WithScopeIds([]string{proj.PublicId})},
|
||||
// },
|
||||
// wantCnt: testLimit + 1,
|
||||
// wantErr: false,
|
||||
// },
|
||||
// {
|
||||
// name: "default-limit",
|
||||
// createCnt: testLimit + 1,
|
||||
// createScopeId: proj.PublicId,
|
||||
// args: args{
|
||||
// opt: []target.Option{target.WithScopeIds([]string{proj.PublicId})},
|
||||
// },
|
||||
// wantCnt: testLimit,
|
||||
// wantErr: false,
|
||||
// },
|
||||
// {
|
||||
// name: "custom-limit",
|
||||
// createCnt: testLimit + 1,
|
||||
// createScopeId: proj.PublicId,
|
||||
// args: args{
|
||||
// opt: []target.Option{target.WithLimit(3), target.WithScopeIds([]string{proj.PublicId})},
|
||||
// },
|
||||
// wantCnt: 3,
|
||||
// wantErr: false,
|
||||
// },
|
||||
// {
|
||||
// name: "bad-org",
|
||||
// createCnt: 1,
|
||||
// createScopeId: proj.PublicId,
|
||||
// args: args{
|
||||
// opt: []target.Option{target.WithScopeIds([]string{"bad-id"})},
|
||||
// },
|
||||
// wantCnt: 0,
|
||||
// wantErr: false,
|
||||
// },
|
||||
// }
|
||||
// for _, tt := range tests {
|
||||
// t.Run(tt.name, func(t *testing.T) {
|
||||
// assert, require := assert.New(t), require.New(t)
|
||||
// require.NoError(conn.Where("1=1").Delete(target.NewTestTcpTarget("")).Error)
|
||||
// testGroups := []*target.TcpTarget{}
|
||||
// for i := 0; i < tt.createCnt; i++ {
|
||||
// switch {
|
||||
// case tt.createScopeId2 != "" && i%2 == 0:
|
||||
// testGroups = append(testGroups, target.TestTcpTarget(t, conn, tt.createScopeId2, strconv.Itoa(i)))
|
||||
// default:
|
||||
// testGroups = append(testGroups, target.TestTcpTarget(t, conn, tt.createScopeId, strconv.Itoa(i)))
|
||||
// }
|
||||
// }
|
||||
// assert.Equal(tt.createCnt, len(testGroups))
|
||||
// got, err := repo.ListTargets(context.Background(), tt.args.opt...)
|
||||
// if tt.wantErr {
|
||||
// require.Error(err)
|
||||
// return
|
||||
// }
|
||||
// require.NoError(err)
|
||||
// assert.Equal(tt.wantCnt, len(got))
|
||||
// })
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// func TestRepository_ListRoles_Multiple_Scopes(t *testing.T) {
|
||||
// t.Parallel()
|
||||
// conn, _ := db.TestSetup(t, "postgres")
|
||||
// wrapper := db.TestWrapper(t)
|
||||
// testKms := kms.TestKms(t, conn, wrapper)
|
||||
// iamRepo := iam.TestRepo(t, conn, wrapper)
|
||||
// _, proj1 := iam.TestScopes(t, iamRepo)
|
||||
// _, proj2 := iam.TestScopes(t, iamRepo)
|
||||
// rw := db.New(conn)
|
||||
// repo, err := target.NewRepository(rw, rw, testKms)
|
||||
// require.NoError(t, err)
|
||||
//
|
||||
// require.NoError(t, conn.Where("1=1").Delete(target.NewTestTcpTarget("")).Error)
|
||||
//
|
||||
// const numPerScope = 10
|
||||
// var total int
|
||||
// for i := 0; i < numPerScope; i++ {
|
||||
// target.TestTcpTarget(t, conn, proj1.GetPublicId(), fmt.Sprintf("proj1-%d", i))
|
||||
// total++
|
||||
// target.TestTcpTarget(t, conn, proj2.GetPublicId(), fmt.Sprintf("proj2-%d", i))
|
||||
// total++
|
||||
// }
|
||||
//
|
||||
// got, err := repo.ListTargets(context.Background(), target.WithScopeIds([]string{"global", proj1.GetPublicId(), proj2.GetPublicId()}))
|
||||
// require.NoError(t, err)
|
||||
// assert.Equal(t, total, len(got))
|
||||
// }
|
||||
//
|
||||
// func TestRepository_DeleteTarget(t *testing.T) {
|
||||
// t.Parallel()
|
||||
// conn, _ := db.TestSetup(t, "postgres")
|
||||
// rw := db.New(conn)
|
||||
// wrapper := db.TestWrapper(t)
|
||||
// testKms := kms.TestKms(t, conn, wrapper)
|
||||
// iamRepo := iam.TestRepo(t, conn, wrapper)
|
||||
// _, proj := iam.TestScopes(t, iamRepo)
|
||||
// repo, err := target.NewRepository(rw, rw, testKms)
|
||||
// require.NoError(t, err)
|
||||
//
|
||||
// type args struct {
|
||||
// target target.Target
|
||||
// opt []target.Option
|
||||
// }
|
||||
// tests := []struct {
|
||||
// name string
|
||||
// args args
|
||||
// wantRowsDeleted int
|
||||
// wantErr bool
|
||||
// wantErrMsg string
|
||||
// }{
|
||||
// {
|
||||
// name: "valid",
|
||||
// args: args{
|
||||
// target: target.TestTcpTarget(t, conn, proj.PublicId, "valid"),
|
||||
// },
|
||||
// wantRowsDeleted: 1,
|
||||
// wantErr: false,
|
||||
// },
|
||||
// {
|
||||
// name: "no-public-id",
|
||||
// args: args{
|
||||
// target: func() target.Target {
|
||||
// tar, _ := target.NewTcpTarget(proj.PublicId)
|
||||
// return tar
|
||||
// }(),
|
||||
// },
|
||||
// wantRowsDeleted: 0,
|
||||
// wantErr: true,
|
||||
// wantErrMsg: "target.(Repository).DeleteTarget: missing public id: parameter violation: error #100",
|
||||
// },
|
||||
// {
|
||||
// name: "not-found",
|
||||
// args: args{
|
||||
// target: func() target.Target {
|
||||
// id, err := target.NewTcpTargetId()
|
||||
// require.NoError(t, err)
|
||||
// tar, _ := target.NewTcpTarget(proj.PublicId)
|
||||
// tar.PublicId = id
|
||||
// return tar
|
||||
// }(),
|
||||
// },
|
||||
// wantRowsDeleted: 0,
|
||||
// wantErr: true,
|
||||
// wantErrMsg: "db.LookupById: record not found, search issue: error #1100",
|
||||
// },
|
||||
// }
|
||||
// for _, tt := range tests {
|
||||
// t.Run(tt.name, func(t *testing.T) {
|
||||
// assert := assert.New(t)
|
||||
// deletedRows, err := repo.DeleteTarget(context.Background(), tt.args.target.GetPublicId(), tt.args.opt...)
|
||||
// if tt.wantErr {
|
||||
// assert.Error(err)
|
||||
// assert.Equal(0, deletedRows)
|
||||
// assert.Contains(err.Error(), tt.wantErrMsg)
|
||||
// err = db.TestVerifyOplog(t, rw, tt.args.target.GetPublicId(), db.WithOperation(oplog.OpType_OP_TYPE_DELETE), db.WithCreateNotBefore(10*time.Second))
|
||||
// assert.Error(err)
|
||||
// assert.True(errors.IsNotFoundError(err))
|
||||
// return
|
||||
// }
|
||||
// assert.NoError(err)
|
||||
// assert.Equal(tt.wantRowsDeleted, deletedRows)
|
||||
// foundGroup, _, _, err := repo.LookupTarget(context.Background(), tt.args.target.GetPublicId())
|
||||
// assert.NoError(err)
|
||||
// assert.Nil(foundGroup)
|
||||
//
|
||||
// err = db.TestVerifyOplog(t, rw, tt.args.target.GetPublicId(), db.WithOperation(oplog.OpType_OP_TYPE_DELETE), db.WithCreateNotBefore(10*time.Second))
|
||||
// assert.NoError(err)
|
||||
// })
|
||||
// }
|
||||
// }
|
||||
@@ -253,157 +253,6 @@ func (x *TargetHostSet) GetCreateTime() *timestamp.Timestamp {
|
||||
return nil
|
||||
}
|
||||
|
||||
type TcpTarget struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
// public_id is used to access the TargetTcp via an API
|
||||
// @inject_tag: gorm:"primary_key"
|
||||
PublicId string `protobuf:"bytes,10,opt,name=public_id,json=publicId,proto3" json:"public_id,omitempty" gorm:"primary_key"`
|
||||
// scope id for the TargetTcp
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
ScopeId string `protobuf:"bytes,20,opt,name=scope_id,json=scopeId,proto3" json:"scope_id,omitempty" gorm:"default:null"`
|
||||
// name is the optional friendly name used to
|
||||
// access the TargetTcp via an API
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
Name string `protobuf:"bytes,30,opt,name=name,proto3" json:"name,omitempty" gorm:"default:null"`
|
||||
// description of the TargetTcp
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
Description string `protobuf:"bytes,40,opt,name=description,proto3" json:"description,omitempty" gorm:"default:null"`
|
||||
// create_time from the RDBMS
|
||||
// @inject_tag: `gorm:"default:current_timestamp"`
|
||||
CreateTime *timestamp.Timestamp `protobuf:"bytes,50,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty" gorm:"default:current_timestamp"`
|
||||
// update_time from the RDBMS
|
||||
// @inject_tag: `gorm:"default:current_timestamp"`
|
||||
UpdateTime *timestamp.Timestamp `protobuf:"bytes,60,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty" gorm:"default:current_timestamp"`
|
||||
// version allows optimistic locking of the TargetTcp when modifying the
|
||||
// TargetTcp
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
Version uint32 `protobuf:"varint,70,opt,name=version,proto3" json:"version,omitempty" gorm:"default:null"`
|
||||
// default port of the TargetTcp
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
DefaultPort uint32 `protobuf:"varint,80,opt,name=default_port,json=defaultPort,proto3" json:"default_port,omitempty" gorm:"default:null"`
|
||||
// Maximum total lifetime of a created session, in seconds
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
SessionMaxSeconds uint32 `protobuf:"varint,100,opt,name=session_max_seconds,json=sessionMaxSeconds,proto3" json:"session_max_seconds,omitempty" gorm:"default:null"`
|
||||
// Maximum number of connections in a session
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
SessionConnectionLimit int32 `protobuf:"varint,110,opt,name=session_connection_limit,json=sessionConnectionLimit,proto3" json:"session_connection_limit,omitempty" gorm:"default:null"`
|
||||
// A boolean expression that allows filtering the workers that can handle a session
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
WorkerFilter string `protobuf:"bytes,120,opt,name=worker_filter,json=workerFilter,proto3" json:"worker_filter,omitempty" gorm:"default:null"`
|
||||
}
|
||||
|
||||
func (x *TcpTarget) Reset() {
|
||||
*x = TcpTarget{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_controller_storage_target_store_v1_target_proto_msgTypes[2]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *TcpTarget) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*TcpTarget) ProtoMessage() {}
|
||||
|
||||
func (x *TcpTarget) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_controller_storage_target_store_v1_target_proto_msgTypes[2]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use TcpTarget.ProtoReflect.Descriptor instead.
|
||||
func (*TcpTarget) Descriptor() ([]byte, []int) {
|
||||
return file_controller_storage_target_store_v1_target_proto_rawDescGZIP(), []int{2}
|
||||
}
|
||||
|
||||
func (x *TcpTarget) GetPublicId() string {
|
||||
if x != nil {
|
||||
return x.PublicId
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *TcpTarget) GetScopeId() string {
|
||||
if x != nil {
|
||||
return x.ScopeId
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *TcpTarget) GetName() string {
|
||||
if x != nil {
|
||||
return x.Name
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *TcpTarget) GetDescription() string {
|
||||
if x != nil {
|
||||
return x.Description
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *TcpTarget) GetCreateTime() *timestamp.Timestamp {
|
||||
if x != nil {
|
||||
return x.CreateTime
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *TcpTarget) GetUpdateTime() *timestamp.Timestamp {
|
||||
if x != nil {
|
||||
return x.UpdateTime
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *TcpTarget) GetVersion() uint32 {
|
||||
if x != nil {
|
||||
return x.Version
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *TcpTarget) GetDefaultPort() uint32 {
|
||||
if x != nil {
|
||||
return x.DefaultPort
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *TcpTarget) GetSessionMaxSeconds() uint32 {
|
||||
if x != nil {
|
||||
return x.SessionMaxSeconds
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *TcpTarget) GetSessionConnectionLimit() int32 {
|
||||
if x != nil {
|
||||
return x.SessionConnectionLimit
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *TcpTarget) GetWorkerFilter() string {
|
||||
if x != nil {
|
||||
return x.WorkerFilter
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type CredentialLibrary struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
@@ -426,7 +275,7 @@ type CredentialLibrary struct {
|
||||
func (x *CredentialLibrary) Reset() {
|
||||
*x = CredentialLibrary{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_controller_storage_target_store_v1_target_proto_msgTypes[3]
|
||||
mi := &file_controller_storage_target_store_v1_target_proto_msgTypes[2]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
@@ -439,7 +288,7 @@ func (x *CredentialLibrary) String() string {
|
||||
func (*CredentialLibrary) ProtoMessage() {}
|
||||
|
||||
func (x *CredentialLibrary) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_controller_storage_target_store_v1_target_proto_msgTypes[3]
|
||||
mi := &file_controller_storage_target_store_v1_target_proto_msgTypes[2]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
@@ -452,7 +301,7 @@ func (x *CredentialLibrary) ProtoReflect() protoreflect.Message {
|
||||
|
||||
// Deprecated: Use CredentialLibrary.ProtoReflect.Descriptor instead.
|
||||
func (*CredentialLibrary) Descriptor() ([]byte, []int) {
|
||||
return file_controller_storage_target_store_v1_target_proto_rawDescGZIP(), []int{3}
|
||||
return file_controller_storage_target_store_v1_target_proto_rawDescGZIP(), []int{2}
|
||||
}
|
||||
|
||||
func (x *CredentialLibrary) GetTargetId() string {
|
||||
@@ -538,70 +387,25 @@ var file_controller_storage_target_store_v1_target_proto_rawDesc = []byte{
|
||||
0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61,
|
||||
0x67, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x31, 0x2e,
|
||||
0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74,
|
||||
0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xc6, 0x05, 0x0a, 0x09, 0x54, 0x63, 0x70, 0x54, 0x61, 0x72,
|
||||
0x67, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x69, 0x64,
|
||||
0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x64,
|
||||
0x12, 0x19, 0x0a, 0x08, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x14, 0x20, 0x01,
|
||||
0x28, 0x09, 0x52, 0x07, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x04, 0x6e,
|
||||
0x61, 0x6d, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x42, 0x10, 0xc2, 0xdd, 0x29, 0x0c, 0x0a,
|
||||
0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x04, 0x6e, 0x61, 0x6d,
|
||||
0x65, 0x12, 0x40, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
|
||||
0x18, 0x28, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1e, 0xc2, 0xdd, 0x29, 0x1a, 0x0a, 0x0b, 0x64, 0x65,
|
||||
0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72,
|
||||
0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
|
||||
0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69,
|
||||
0x6d, 0x65, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72,
|
||||
0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x74, 0x69,
|
||||
0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73,
|
||||
0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65,
|
||||
0x12, 0x4b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18,
|
||||
0x3c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c,
|
||||
0x65, 0x72, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x73,
|
||||
0x74, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
|
||||
0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a,
|
||||
0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x46, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07,
|
||||
0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75,
|
||||
0x6c, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x50, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x2a, 0xc2,
|
||||
0xdd, 0x29, 0x26, 0x0a, 0x0b, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x6f, 0x72, 0x74,
|
||||
0x12, 0x17, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x64, 0x65, 0x66,
|
||||
0x61, 0x75, 0x6c, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x0b, 0x64, 0x65, 0x66, 0x61, 0x75,
|
||||
0x6c, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x5c, 0x0a, 0x13, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f,
|
||||
0x6e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x64, 0x20,
|
||||
0x01, 0x28, 0x0d, 0x42, 0x2c, 0xc2, 0xdd, 0x29, 0x28, 0x0a, 0x11, 0x53, 0x65, 0x73, 0x73, 0x69,
|
||||
0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x13, 0x73, 0x65,
|
||||
0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64,
|
||||
0x73, 0x52, 0x11, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x63,
|
||||
0x6f, 0x6e, 0x64, 0x73, 0x12, 0x70, 0x0a, 0x18, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f,
|
||||
0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74,
|
||||
0x18, 0x6e, 0x20, 0x01, 0x28, 0x05, 0x42, 0x36, 0xc2, 0xdd, 0x29, 0x32, 0x0a, 0x16, 0x53, 0x65,
|
||||
0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c,
|
||||
0x69, 0x6d, 0x69, 0x74, 0x12, 0x18, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f,
|
||||
0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x16,
|
||||
0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f,
|
||||
0x6e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x46, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72,
|
||||
0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x78, 0x20, 0x01, 0x28, 0x09, 0x42, 0x21, 0xc2,
|
||||
0xdd, 0x29, 0x1d, 0x0a, 0x0c, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65,
|
||||
0x72, 0x12, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72,
|
||||
0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0xe0,
|
||||
0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x4c, 0x69, 0x62,
|
||||
0x72, 0x61, 0x72, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69,
|
||||
0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49,
|
||||
0x64, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f,
|
||||
0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09,
|
||||
0x52, 0x13, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x72,
|
||||
0x61, 0x72, 0x79, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74,
|
||||
0x69, 0x61, 0x6c, 0x5f, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28,
|
||||
0x09, 0x52, 0x11, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x50, 0x75, 0x72,
|
||||
0x70, 0x6f, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74,
|
||||
0x69, 0x6d, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
|
||||
0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x74,
|
||||
0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65,
|
||||
0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d,
|
||||
0x65, 0x42, 0x3b, 0x5a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
|
||||
0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61,
|
||||
0x72, 0x79, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x61, 0x72, 0x67,
|
||||
0x65, 0x74, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x3b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x62, 0x06,
|
||||
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xe0, 0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e,
|
||||
0x74, 0x69, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x74,
|
||||
0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
|
||||
0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x72, 0x65, 0x64,
|
||||
0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5f, 0x69,
|
||||
0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74,
|
||||
0x69, 0x61, 0x6c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x12,
|
||||
0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x70, 0x75, 0x72, 0x70, 0x6f,
|
||||
0x73, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e,
|
||||
0x74, 0x69, 0x61, 0x6c, 0x50, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0b, 0x63,
|
||||
0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b,
|
||||
0x32, 0x2a, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x74,
|
||||
0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e,
|
||||
0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72,
|
||||
0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x42, 0x3b, 0x5a, 0x39, 0x67, 0x69, 0x74, 0x68,
|
||||
0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70,
|
||||
0x2f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e,
|
||||
0x61, 0x6c, 0x2f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x3b,
|
||||
0x73, 0x74, 0x6f, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
@@ -616,26 +420,23 @@ func file_controller_storage_target_store_v1_target_proto_rawDescGZIP() []byte {
|
||||
return file_controller_storage_target_store_v1_target_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_controller_storage_target_store_v1_target_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
|
||||
var file_controller_storage_target_store_v1_target_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
|
||||
var file_controller_storage_target_store_v1_target_proto_goTypes = []interface{}{
|
||||
(*TargetView)(nil), // 0: controller.storage.target.store.v1.TargetView
|
||||
(*TargetHostSet)(nil), // 1: controller.storage.target.store.v1.TargetHostSet
|
||||
(*TcpTarget)(nil), // 2: controller.storage.target.store.v1.TcpTarget
|
||||
(*CredentialLibrary)(nil), // 3: controller.storage.target.store.v1.CredentialLibrary
|
||||
(*timestamp.Timestamp)(nil), // 4: controller.storage.timestamp.v1.Timestamp
|
||||
(*CredentialLibrary)(nil), // 2: controller.storage.target.store.v1.CredentialLibrary
|
||||
(*timestamp.Timestamp)(nil), // 3: controller.storage.timestamp.v1.Timestamp
|
||||
}
|
||||
var file_controller_storage_target_store_v1_target_proto_depIdxs = []int32{
|
||||
4, // 0: controller.storage.target.store.v1.TargetView.create_time:type_name -> controller.storage.timestamp.v1.Timestamp
|
||||
4, // 1: controller.storage.target.store.v1.TargetView.update_time:type_name -> controller.storage.timestamp.v1.Timestamp
|
||||
4, // 2: controller.storage.target.store.v1.TargetHostSet.create_time:type_name -> controller.storage.timestamp.v1.Timestamp
|
||||
4, // 3: controller.storage.target.store.v1.TcpTarget.create_time:type_name -> controller.storage.timestamp.v1.Timestamp
|
||||
4, // 4: controller.storage.target.store.v1.TcpTarget.update_time:type_name -> controller.storage.timestamp.v1.Timestamp
|
||||
4, // 5: controller.storage.target.store.v1.CredentialLibrary.create_time:type_name -> controller.storage.timestamp.v1.Timestamp
|
||||
6, // [6:6] is the sub-list for method output_type
|
||||
6, // [6:6] is the sub-list for method input_type
|
||||
6, // [6:6] is the sub-list for extension type_name
|
||||
6, // [6:6] is the sub-list for extension extendee
|
||||
0, // [0:6] is the sub-list for field type_name
|
||||
3, // 0: controller.storage.target.store.v1.TargetView.create_time:type_name -> controller.storage.timestamp.v1.Timestamp
|
||||
3, // 1: controller.storage.target.store.v1.TargetView.update_time:type_name -> controller.storage.timestamp.v1.Timestamp
|
||||
3, // 2: controller.storage.target.store.v1.TargetHostSet.create_time:type_name -> controller.storage.timestamp.v1.Timestamp
|
||||
3, // 3: controller.storage.target.store.v1.CredentialLibrary.create_time:type_name -> controller.storage.timestamp.v1.Timestamp
|
||||
4, // [4:4] is the sub-list for method output_type
|
||||
4, // [4:4] is the sub-list for method input_type
|
||||
4, // [4:4] is the sub-list for extension type_name
|
||||
4, // [4:4] is the sub-list for extension extendee
|
||||
0, // [0:4] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_controller_storage_target_store_v1_target_proto_init() }
|
||||
@@ -669,18 +470,6 @@ func file_controller_storage_target_store_v1_target_proto_init() {
|
||||
}
|
||||
}
|
||||
file_controller_storage_target_store_v1_target_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*TcpTarget); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_controller_storage_target_store_v1_target_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*CredentialLibrary); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
@@ -699,7 +488,7 @@ func file_controller_storage_target_store_v1_target_proto_init() {
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_controller_storage_target_store_v1_target_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 4,
|
||||
NumMessages: 3,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
package target
|
||||
|
||||
import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Subtype int
|
||||
|
||||
const (
|
||||
UnknownSubtype Subtype = iota
|
||||
TcpSubtype
|
||||
)
|
||||
|
||||
func (t Subtype) String() string {
|
||||
switch t {
|
||||
case TcpSubtype:
|
||||
return "tcp"
|
||||
}
|
||||
return "unknown"
|
||||
}
|
||||
|
||||
// SubtypeFromType converts a string to a Subtype.
|
||||
// returns UnknownSubtype if no Subtype with that name is found.
|
||||
func SubtypeFromType(t string) Subtype {
|
||||
switch {
|
||||
case strings.EqualFold(strings.TrimSpace(t), TcpSubtype.String()):
|
||||
return TcpSubtype
|
||||
}
|
||||
return UnknownSubtype
|
||||
}
|
||||
|
||||
// SubtypeFromId takes any public id in the target subsystem and uses the prefix to determine
|
||||
// what subtype the id is for.
|
||||
// Returns UnknownSubtype if no Subtype with this id's prefix is found.
|
||||
func SubtypeFromId(id string) Subtype {
|
||||
switch {
|
||||
case strings.HasPrefix(strings.TrimSpace(id), TcpTargetPrefix):
|
||||
return TcpSubtype
|
||||
}
|
||||
return UnknownSubtype
|
||||
}
|
||||
+44
-22
@@ -1,12 +1,14 @@
|
||||
package target
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/hashicorp/boundary/internal/db/timestamp"
|
||||
"github.com/hashicorp/boundary/internal/errors"
|
||||
"github.com/hashicorp/boundary/internal/oplog"
|
||||
"github.com/hashicorp/boundary/internal/target/store"
|
||||
"github.com/hashicorp/boundary/internal/types/subtypes"
|
||||
)
|
||||
|
||||
// Target is a commmon interface for all target subtypes
|
||||
@@ -17,13 +19,25 @@ type Target interface {
|
||||
GetName() string
|
||||
GetDescription() string
|
||||
GetVersion() uint32
|
||||
GetType() string
|
||||
GetType() subtypes.Subtype
|
||||
GetCreateTime() *timestamp.Timestamp
|
||||
GetUpdateTime() *timestamp.Timestamp
|
||||
GetSessionMaxSeconds() uint32
|
||||
GetSessionConnectionLimit() int32
|
||||
GetWorkerFilter() string
|
||||
oplog(op oplog.OpType) oplog.Metadata
|
||||
Clone() Target
|
||||
SetPublicId(context.Context, string) error
|
||||
SetScopeId(string)
|
||||
SetName(string)
|
||||
SetDescription(string)
|
||||
SetVersion(uint32)
|
||||
SetDefaultPort(uint32)
|
||||
SetCreateTime(*timestamp.Timestamp)
|
||||
SetUpdateTime(*timestamp.Timestamp)
|
||||
SetSessionMaxSeconds(uint32)
|
||||
SetSessionConnectionLimit(int32)
|
||||
SetWorkerFilter(string)
|
||||
Oplog(op oplog.OpType) oplog.Metadata
|
||||
}
|
||||
|
||||
// TargetType defines the possible types for targets.
|
||||
@@ -79,24 +93,32 @@ func (t *targetView) SetTableName(n string) {
|
||||
}
|
||||
}
|
||||
|
||||
// targetSubtype converts the target view to the concrete subtype
|
||||
func (t *targetView) targetSubtype() (Target, error) {
|
||||
const op = "target.targetView.targetSubtype"
|
||||
switch t.Type {
|
||||
case TcpTargetType.String():
|
||||
tcpTarget := allocTcpTarget()
|
||||
tcpTarget.PublicId = t.PublicId
|
||||
tcpTarget.ScopeId = t.ScopeId
|
||||
tcpTarget.Name = t.Name
|
||||
tcpTarget.Description = t.Description
|
||||
tcpTarget.DefaultPort = t.DefaultPort
|
||||
tcpTarget.CreateTime = t.CreateTime
|
||||
tcpTarget.UpdateTime = t.UpdateTime
|
||||
tcpTarget.Version = t.Version
|
||||
tcpTarget.SessionMaxSeconds = t.SessionMaxSeconds
|
||||
tcpTarget.SessionConnectionLimit = t.SessionConnectionLimit
|
||||
tcpTarget.WorkerFilter = t.WorkerFilter
|
||||
return &tcpTarget, nil
|
||||
}
|
||||
return nil, errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("%s is an unknown target subtype of %s", t.PublicId, t.Type))
|
||||
func (t *targetView) Subtype() subtypes.Subtype {
|
||||
return subtypes.Subtype(t.Type)
|
||||
}
|
||||
|
||||
// targetSubtype converts the target view to the concrete subtype
|
||||
func (t *targetView) targetSubtype(ctx context.Context) (Target, error) {
|
||||
const op = "target.targetView.targetSubtype"
|
||||
|
||||
alloc, ok := subtypeRegistry.allocFunc(t.Subtype())
|
||||
if !ok {
|
||||
return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s is an unknown target subtype of %s", t.PublicId, t.Type))
|
||||
}
|
||||
|
||||
tt := alloc()
|
||||
if err := tt.SetPublicId(ctx, t.PublicId); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
tt.SetVersion(t.Version)
|
||||
tt.SetScopeId(t.ScopeId)
|
||||
tt.SetName(t.Name)
|
||||
tt.SetDescription(t.Description)
|
||||
tt.SetDefaultPort(t.DefaultPort)
|
||||
tt.SetCreateTime(t.CreateTime)
|
||||
tt.SetUpdateTime(t.UpdateTime)
|
||||
tt.SetSessionMaxSeconds(t.SessionMaxSeconds)
|
||||
tt.SetSessionConnectionLimit(t.SessionConnectionLimit)
|
||||
tt.SetWorkerFilter(t.WorkerFilter)
|
||||
return tt, nil
|
||||
}
|
||||
@@ -1,15 +1,16 @@
|
||||
package target
|
||||
package target_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestTarget_SetTableName(t *testing.T) {
|
||||
t.Parallel()
|
||||
defaultTableName := targetsViewDefaultTable
|
||||
defaultTableName := target.TargetsViewDefaultTable
|
||||
tests := []struct {
|
||||
name string
|
||||
setNameTo string
|
||||
@@ -29,9 +30,9 @@ func TestTarget_SetTableName(t *testing.T) {
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
def := allocTargetView()
|
||||
def := target.AllocTargetView()
|
||||
require.Equal(defaultTableName, def.TableName())
|
||||
s := allocTargetView()
|
||||
s := target.AllocTargetView()
|
||||
s.SetTableName(tt.setNameTo)
|
||||
assert.Equal(tt.want, s.TableName())
|
||||
})
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
package tcp
|
||||
|
||||
import "github.com/hashicorp/boundary/internal/target"
|
||||
|
||||
// Expose functions and variables for tests.
|
||||
var (
|
||||
TestId = testId
|
||||
TestTargetName = testTargetName
|
||||
DefaultTableName = defaultTableName
|
||||
)
|
||||
|
||||
// NewTestTarget is a test helper that bypasses the scopeId checks
|
||||
// performed by NewTarget, allowing tests to create Targets with
|
||||
// nil scopeIds for more robust testing.
|
||||
func NewTestTarget(scopeId string, opt ...target.Option) *Target {
|
||||
t, _ := New("testScope", opt...)
|
||||
t.ScopeId = scopeId
|
||||
return t
|
||||
}
|
||||
+35
-33
@@ -1,4 +1,4 @@
|
||||
package target
|
||||
package tcp_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
@@ -9,6 +9,8 @@ import (
|
||||
"github.com/hashicorp/boundary/internal/host/static"
|
||||
"github.com/hashicorp/boundary/internal/iam"
|
||||
"github.com/hashicorp/boundary/internal/kms"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
"github.com/hashicorp/boundary/internal/target/tcp"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"google.golang.org/protobuf/proto"
|
||||
@@ -24,17 +26,17 @@ func TestTarget_ImmutableFields(t *testing.T) {
|
||||
ts := timestamp.Timestamp{Timestamp: ×tamppb.Timestamp{Seconds: 0, Nanos: 0}}
|
||||
|
||||
_, proj := iam.TestScopes(t, iam.TestRepo(t, conn, wrapper))
|
||||
new := TestTcpTarget(t, conn, proj.PublicId, testId(t))
|
||||
new := tcp.TestTarget(t, conn, proj.PublicId, tcp.TestId(t))
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
update *TcpTarget
|
||||
update *tcp.Target
|
||||
fieldMask []string
|
||||
}{
|
||||
{
|
||||
name: "public_id",
|
||||
update: func() *TcpTarget {
|
||||
target := new.Clone().(*TcpTarget)
|
||||
update: func() *tcp.Target {
|
||||
target := new.Clone().(*tcp.Target)
|
||||
target.PublicId = "p_thisIsNotAValidId"
|
||||
return target
|
||||
}(),
|
||||
@@ -42,8 +44,8 @@ func TestTarget_ImmutableFields(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "create time",
|
||||
update: func() *TcpTarget {
|
||||
target := new.Clone().(*TcpTarget)
|
||||
update: func() *tcp.Target {
|
||||
target := new.Clone().(*tcp.Target)
|
||||
target.CreateTime = &ts
|
||||
return target
|
||||
}(),
|
||||
@@ -51,8 +53,8 @@ func TestTarget_ImmutableFields(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "scope_id",
|
||||
update: func() *TcpTarget {
|
||||
target := new.Clone().(*TcpTarget)
|
||||
update: func() *tcp.Target {
|
||||
target := new.Clone().(*tcp.Target)
|
||||
target.ScopeId = "o_thisIsNotAValidId"
|
||||
return target
|
||||
}(),
|
||||
@@ -65,7 +67,7 @@ func TestTarget_ImmutableFields(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
|
||||
orig := new.Clone()
|
||||
orig.(*TcpTarget).SetTableName("target")
|
||||
orig.(*tcp.Target).SetTableName("target")
|
||||
err := rw.LookupById(context.Background(), orig)
|
||||
require.NoError(err)
|
||||
|
||||
@@ -75,11 +77,11 @@ func TestTarget_ImmutableFields(t *testing.T) {
|
||||
assert.Equal(0, rowsUpdated)
|
||||
|
||||
after := new.Clone()
|
||||
after.(*TcpTarget).SetTableName("target")
|
||||
after.(*tcp.Target).SetTableName("target")
|
||||
err = rw.LookupById(context.Background(), after)
|
||||
require.NoError(err)
|
||||
|
||||
assert.True(proto.Equal(orig.(*TcpTarget), after.(*TcpTarget)))
|
||||
assert.True(proto.Equal(orig.(*tcp.Target), after.(*tcp.Target)))
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -93,17 +95,17 @@ func TestTcpTarget_ImmutableFields(t *testing.T) {
|
||||
ts := timestamp.Timestamp{Timestamp: ×tamppb.Timestamp{Seconds: 0, Nanos: 0}}
|
||||
|
||||
_, proj := iam.TestScopes(t, iam.TestRepo(t, conn, wrapper))
|
||||
new := TestTcpTarget(t, conn, proj.PublicId, testId(t))
|
||||
new := tcp.TestTarget(t, conn, proj.PublicId, tcp.TestId(t))
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
update *TcpTarget
|
||||
update *tcp.Target
|
||||
fieldMask []string
|
||||
}{
|
||||
{
|
||||
name: "public_id",
|
||||
update: func() *TcpTarget {
|
||||
target := new.Clone().(*TcpTarget)
|
||||
update: func() *tcp.Target {
|
||||
target := new.Clone().(*tcp.Target)
|
||||
target.PublicId = "p_thisIsNotAValidId"
|
||||
return target
|
||||
}(),
|
||||
@@ -111,8 +113,8 @@ func TestTcpTarget_ImmutableFields(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "create time",
|
||||
update: func() *TcpTarget {
|
||||
target := new.Clone().(*TcpTarget)
|
||||
update: func() *tcp.Target {
|
||||
target := new.Clone().(*tcp.Target)
|
||||
target.CreateTime = &ts
|
||||
return target
|
||||
}(),
|
||||
@@ -120,8 +122,8 @@ func TestTcpTarget_ImmutableFields(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "scope_id",
|
||||
update: func() *TcpTarget {
|
||||
target := new.Clone().(*TcpTarget)
|
||||
update: func() *tcp.Target {
|
||||
target := new.Clone().(*tcp.Target)
|
||||
target.ScopeId = "o_thisIsNotAValidId"
|
||||
return target
|
||||
}(),
|
||||
@@ -144,7 +146,7 @@ func TestTcpTarget_ImmutableFields(t *testing.T) {
|
||||
err = rw.LookupById(context.Background(), after)
|
||||
require.NoError(err)
|
||||
|
||||
assert.True(proto.Equal(orig.(*TcpTarget), after.(*TcpTarget)))
|
||||
assert.True(proto.Equal(orig.(*tcp.Target), after.(*tcp.Target)))
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -155,35 +157,35 @@ func TestTargetHostSet_ImmutableFields(t *testing.T) {
|
||||
wrapper := db.TestWrapper(t)
|
||||
testKms := kms.TestKms(t, conn, wrapper)
|
||||
rw := db.New(conn)
|
||||
repo, err := NewRepository(rw, rw, testKms)
|
||||
repo, err := target.NewRepository(rw, rw, testKms)
|
||||
require.NoError(t, err)
|
||||
|
||||
ts := timestamp.Timestamp{Timestamp: ×tamppb.Timestamp{Seconds: 0, Nanos: 0}}
|
||||
|
||||
_, proj := iam.TestScopes(t, iam.TestRepo(t, conn, wrapper))
|
||||
projTarget := TestTcpTarget(t, conn, proj.PublicId, testId(t))
|
||||
projTarget := tcp.TestTarget(t, conn, proj.PublicId, tcp.TestId(t))
|
||||
testCats := static.TestCatalogs(t, conn, proj.PublicId, 1)
|
||||
hsets := static.TestSets(t, conn, testCats[0].GetPublicId(), 2)
|
||||
require.Equal(t, 2, len(hsets))
|
||||
|
||||
updateTarget := TestTcpTarget(t, conn, proj.PublicId, testId(t))
|
||||
updateTarget := tcp.TestTarget(t, conn, proj.PublicId, tcp.TestId(t))
|
||||
updateHset := hsets[1]
|
||||
|
||||
_, gotHostSources, _, err := repo.AddTargetHostSources(context.Background(), projTarget.PublicId, 1, []string{hsets[0].PublicId})
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, 1, len(gotHostSources))
|
||||
new, err := NewTargetHostSet(projTarget.PublicId, gotHostSources[0].Id())
|
||||
new, err := target.NewTargetHostSet(projTarget.PublicId, gotHostSources[0].Id())
|
||||
require.NoError(t, err)
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
update *TargetHostSet
|
||||
update *target.TargetHostSet
|
||||
fieldMask []string
|
||||
}{
|
||||
{
|
||||
name: "target_id",
|
||||
update: func() *TargetHostSet {
|
||||
target := new.Clone().(*TargetHostSet)
|
||||
update: func() *target.TargetHostSet {
|
||||
target := new.Clone().(*target.TargetHostSet)
|
||||
target.TargetId = updateTarget.PublicId
|
||||
return target
|
||||
}(),
|
||||
@@ -191,8 +193,8 @@ func TestTargetHostSet_ImmutableFields(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "create time",
|
||||
update: func() *TargetHostSet {
|
||||
target := new.Clone().(*TargetHostSet)
|
||||
update: func() *target.TargetHostSet {
|
||||
target := new.Clone().(*target.TargetHostSet)
|
||||
target.CreateTime = &ts
|
||||
return target
|
||||
}(),
|
||||
@@ -200,8 +202,8 @@ func TestTargetHostSet_ImmutableFields(t *testing.T) {
|
||||
},
|
||||
{
|
||||
name: "host_set_id",
|
||||
update: func() *TargetHostSet {
|
||||
target := new.Clone().(*TargetHostSet)
|
||||
update: func() *target.TargetHostSet {
|
||||
target := new.Clone().(*target.TargetHostSet)
|
||||
target.HostSetId = updateHset.PublicId
|
||||
return target
|
||||
}(),
|
||||
@@ -223,7 +225,7 @@ func TestTargetHostSet_ImmutableFields(t *testing.T) {
|
||||
after := new.Clone()
|
||||
err = rw.LookupWhere(context.Background(), after, "target_id = ? and host_set_id = ?", new.TargetId, new.HostSetId)
|
||||
require.NoError(err)
|
||||
assert.True(proto.Equal(orig.(*TargetHostSet), after.(*TargetHostSet)))
|
||||
assert.True(proto.Equal(orig.(*target.TargetHostSet), after.(*target.TargetHostSet)))
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
package tcp
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/hashicorp/boundary/internal/errors"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
)
|
||||
|
||||
func init() {
|
||||
target.Register(Subtype, allocTarget, vet, TargetPrefix)
|
||||
}
|
||||
|
||||
const (
|
||||
// TargetPrefix is the prefix for public ids of a tcp.Target.
|
||||
TargetPrefix = "ttcp"
|
||||
)
|
||||
|
||||
// vet validates that the given target.Target is a tcp.Target and that it
|
||||
// has a Target store.
|
||||
func vet(ctx context.Context, t target.Target) error {
|
||||
const op = "tcp.vet"
|
||||
|
||||
tt, ok := t.(*Target)
|
||||
if !ok {
|
||||
return errors.New(ctx, errors.InvalidParameter, op, "target is not a tcp.Target")
|
||||
}
|
||||
|
||||
if tt == nil {
|
||||
return errors.New(ctx, errors.InvalidParameter, op, "missing target")
|
||||
}
|
||||
|
||||
if tt.Target == nil {
|
||||
return errors.New(ctx, errors.InvalidParameter, op, "missing target store")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
+31
-33
@@ -1,4 +1,4 @@
|
||||
package target
|
||||
package tcp_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
@@ -12,6 +12,8 @@ import (
|
||||
"github.com/hashicorp/boundary/internal/iam"
|
||||
"github.com/hashicorp/boundary/internal/kms"
|
||||
"github.com/hashicorp/boundary/internal/oplog"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
"github.com/hashicorp/boundary/internal/target/tcp"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"google.golang.org/protobuf/proto"
|
||||
@@ -25,7 +27,7 @@ func TestRepository_AddTargetCredentialSources(t *testing.T) {
|
||||
testKms := kms.TestKms(t, conn, wrapper)
|
||||
iamRepo := iam.TestRepo(t, conn, wrapper)
|
||||
_, staticProj := iam.TestScopes(t, iamRepo)
|
||||
repo, err := NewRepository(rw, rw, testKms)
|
||||
repo, err := target.NewRepository(rw, rw, testKms)
|
||||
require.NoError(t, err)
|
||||
|
||||
cs := vault.TestCredentialStores(t, conn, wrapper, staticProj.GetPublicId(), 1)[0]
|
||||
@@ -103,7 +105,7 @@ func TestRepository_AddTargetCredentialSources(t *testing.T) {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
|
||||
projTarget := TestTcpTarget(t, conn, staticProj.PublicId, tt.name)
|
||||
projTarget := tcp.TestTarget(t, conn, staticProj.PublicId, tt.name)
|
||||
gotTarget, _, gotCredSources, err := repo.AddTargetCredentialSources(context.Background(), projTarget.PublicId, tt.args.targetVersion, tt.args.credLibIds)
|
||||
if tt.wantErr {
|
||||
require.Error(err)
|
||||
@@ -112,7 +114,7 @@ func TestRepository_AddTargetCredentialSources(t *testing.T) {
|
||||
}
|
||||
require.NoError(err)
|
||||
assert.Len(gotCredSources, len(tt.wantCredLibIds))
|
||||
gotCredSourcesMap := map[string]CredentialSource{}
|
||||
gotCredSourcesMap := map[string]target.CredentialSource{}
|
||||
for _, s := range gotCredSources {
|
||||
gotCredSourcesMap[s.Id()] = s
|
||||
}
|
||||
@@ -124,26 +126,22 @@ func TestRepository_AddTargetCredentialSources(t *testing.T) {
|
||||
err = db.TestVerifyOplog(t, rw, projTarget.PublicId, db.WithOperation(oplog.OpType_OP_TYPE_UPDATE), db.WithCreateNotBefore(10*time.Second))
|
||||
assert.NoError(err)
|
||||
|
||||
foundCredSources, err := fetchCredentialSources(context.Background(), rw, projTarget.PublicId)
|
||||
tar, _, lookupCredSources, err := repo.LookupTarget(context.Background(), projTarget.PublicId)
|
||||
require.NoError(err)
|
||||
assert.Len(foundCredSources, len(gotCredSourcesMap))
|
||||
for _, s := range foundCredSources {
|
||||
assert.Equal(tt.args.targetVersion+1, tar.GetVersion())
|
||||
assert.Equal(projTarget.GetVersion(), tar.GetVersion()-1)
|
||||
assert.True(proto.Equal(gotTarget.(*tcp.Target), tar.(*tcp.Target)))
|
||||
assert.Equal(gotCredSources, lookupCredSources)
|
||||
for _, s := range lookupCredSources {
|
||||
assert.NotEmpty(gotCredSourcesMap[s.Id()])
|
||||
assert.Equal(projTarget.PublicId, s.TargetId())
|
||||
}
|
||||
|
||||
target, _, lookupCredSources, err := repo.LookupTarget(context.Background(), projTarget.PublicId)
|
||||
require.NoError(err)
|
||||
assert.Equal(tt.args.targetVersion+1, target.GetVersion())
|
||||
assert.Equal(projTarget.GetVersion(), target.GetVersion()-1)
|
||||
assert.True(proto.Equal(gotTarget.(*TcpTarget), target.(*TcpTarget)))
|
||||
assert.Equal(gotCredSources, lookupCredSources)
|
||||
})
|
||||
}
|
||||
t.Run("add-existing", func(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
|
||||
projTarget := TestTcpTarget(t, conn, staticProj.PublicId, "add-existing")
|
||||
projTarget := tcp.TestTarget(t, conn, staticProj.PublicId, "add-existing")
|
||||
_, _, gotCredSources, err := repo.AddTargetCredentialSources(context.Background(), projTarget.PublicId, 1, []string{lib1.PublicId})
|
||||
require.NoError(err)
|
||||
assert.Len(gotCredSources, 1)
|
||||
@@ -160,10 +158,10 @@ func TestRepository_AddTargetCredentialSources(t *testing.T) {
|
||||
assert.True(errors.Match(errors.T(errors.NotUnique), err))
|
||||
|
||||
// Previous transactions should have been rolled back and only lib1 should be associated
|
||||
gotCredSources, err = fetchCredentialSources(context.Background(), rw, projTarget.PublicId)
|
||||
_, _, lookupCredSources, err := repo.LookupTarget(context.Background(), projTarget.PublicId)
|
||||
require.NoError(err)
|
||||
assert.Len(gotCredSources, 1)
|
||||
assert.Equal(lib1.PublicId, gotCredSources[0].Id())
|
||||
assert.Len(lookupCredSources, 1)
|
||||
assert.Equal(lib1.PublicId, lookupCredSources[0].Id())
|
||||
})
|
||||
t.Run("target-not-found", func(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
@@ -183,7 +181,7 @@ func TestRepository_DeleteTargetCredentialSources(t *testing.T) {
|
||||
testKms := kms.TestKms(t, conn, wrapper)
|
||||
iamRepo := iam.TestRepo(t, conn, wrapper)
|
||||
_, proj := iam.TestScopes(t, iamRepo)
|
||||
repo, err := NewRepository(rw, rw, testKms)
|
||||
repo, err := target.NewRepository(rw, rw, testKms)
|
||||
require.NoError(t, err)
|
||||
|
||||
type args struct {
|
||||
@@ -229,7 +227,7 @@ func TestRepository_DeleteTargetCredentialSources(t *testing.T) {
|
||||
{
|
||||
name: "not-found",
|
||||
args: args{
|
||||
targetIdOverride: func() *string { id := testId(t); return &id }(),
|
||||
targetIdOverride: func() *string { id := tcp.TestId(t); return &id }(),
|
||||
createCnt: 5,
|
||||
deleteCnt: 5,
|
||||
},
|
||||
@@ -277,7 +275,7 @@ func TestRepository_DeleteTargetCredentialSources(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
cs := css[i]
|
||||
|
||||
target := TestTcpTarget(t, conn, proj.PublicId, tt.name)
|
||||
target := tcp.TestTarget(t, conn, proj.PublicId, tt.name)
|
||||
|
||||
clIds := make([]string, 0, tt.args.createCnt)
|
||||
if tt.args.createCnt > 0 {
|
||||
@@ -334,7 +332,7 @@ func TestRepository_DeleteTargetCredentialSources(t *testing.T) {
|
||||
lib2 := libs[1]
|
||||
lib3 := libs[2]
|
||||
|
||||
projTarget := TestTcpTarget(t, conn, proj.PublicId, "add-existing")
|
||||
projTarget := tcp.TestTarget(t, conn, proj.PublicId, "add-existing")
|
||||
_, _, gotCredSources, err := repo.AddTargetCredentialSources(context.Background(), projTarget.PublicId, 1, []string{lib1.PublicId, lib2.PublicId})
|
||||
require.NoError(err)
|
||||
assert.Len(gotCredSources, 2)
|
||||
@@ -352,9 +350,9 @@ func TestRepository_DeleteTargetCredentialSources(t *testing.T) {
|
||||
assert.Equal(0, delCount)
|
||||
|
||||
// Previous transactions should have been rolled back and only lib1 should be associated
|
||||
gotCredSources, err = fetchCredentialSources(context.Background(), rw, projTarget.PublicId)
|
||||
_, _, lookupCredSources, err := repo.LookupTarget(context.Background(), projTarget.PublicId)
|
||||
require.NoError(err)
|
||||
assert.Len(gotCredSources, 2)
|
||||
assert.Len(lookupCredSources, 2)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -364,7 +362,7 @@ func TestRepository_SetTargetCredentialSources(t *testing.T) {
|
||||
rw := db.New(conn)
|
||||
wrapper := db.TestWrapper(t)
|
||||
testKms := kms.TestKms(t, conn, wrapper)
|
||||
repo, err := NewRepository(rw, rw, testKms)
|
||||
repo, err := target.NewRepository(rw, rw, testKms)
|
||||
require.NoError(t, err)
|
||||
|
||||
iamRepo := iam.TestRepo(t, conn, wrapper)
|
||||
@@ -375,7 +373,7 @@ func TestRepository_SetTargetCredentialSources(t *testing.T) {
|
||||
lib1 := credLibs[0]
|
||||
lib2 := credLibs[1]
|
||||
|
||||
setupFn := func(target Target) []CredentialSource {
|
||||
setupFn := func(target target.Target) []target.CredentialSource {
|
||||
credLibs := vault.TestCredentialLibraries(t, conn, wrapper, cs.GetPublicId(), 10)
|
||||
clIds := make([]string, 0, len(credLibs))
|
||||
for _, cl := range credLibs {
|
||||
@@ -394,7 +392,7 @@ func TestRepository_SetTargetCredentialSources(t *testing.T) {
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
setup func(Target) []CredentialSource
|
||||
setup func(target.Target) []target.CredentialSource
|
||||
args args
|
||||
wantAffectedRows int
|
||||
wantErr bool
|
||||
@@ -470,11 +468,11 @@ func TestRepository_SetTargetCredentialSources(t *testing.T) {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
|
||||
target := TestTcpTarget(t, conn, proj.PublicId, tt.name)
|
||||
tar := tcp.TestTarget(t, conn, proj.PublicId, tt.name)
|
||||
|
||||
var origCredSources []CredentialSource
|
||||
var origCredSources []target.CredentialSource
|
||||
if tt.setup != nil {
|
||||
origCredSources = tt.setup(target)
|
||||
origCredSources = tt.setup(tar)
|
||||
}
|
||||
if tt.args.addToOrigLibs {
|
||||
origIds := make([]string, 0, len(origCredSources))
|
||||
@@ -484,11 +482,11 @@ func TestRepository_SetTargetCredentialSources(t *testing.T) {
|
||||
tt.args.clIds = append(tt.args.clIds, origIds...)
|
||||
}
|
||||
|
||||
origTarget, _, lookupCredSources, err := repo.LookupTarget(context.Background(), target.GetPublicId())
|
||||
origTarget, _, lookupCredSources, err := repo.LookupTarget(context.Background(), tar.GetPublicId())
|
||||
require.NoError(err)
|
||||
assert.Equal(origCredSources, lookupCredSources)
|
||||
|
||||
_, got, affectedRows, err := repo.SetTargetCredentialSources(context.Background(), target.GetPublicId(), tt.args.targetVersion, tt.args.clIds)
|
||||
_, got, affectedRows, err := repo.SetTargetCredentialSources(context.Background(), tar.GetPublicId(), tt.args.targetVersion, tt.args.clIds)
|
||||
if tt.wantErr {
|
||||
require.Error(err)
|
||||
assert.Equal(0, affectedRows)
|
||||
@@ -514,7 +512,7 @@ func TestRepository_SetTargetCredentialSources(t *testing.T) {
|
||||
sort.Strings(gotIds)
|
||||
assert.Equal(wantIds, gotIds)
|
||||
|
||||
foundTarget, _, _, err := repo.LookupTarget(context.Background(), target.GetPublicId())
|
||||
foundTarget, _, _, err := repo.LookupTarget(context.Background(), tar.GetPublicId())
|
||||
require.NoError(err)
|
||||
if tt.name != "no-change" {
|
||||
assert.Equalf(tt.args.targetVersion+1, foundTarget.GetVersion(), "%s unexpected version: %d/%d", tt.name, tt.args.targetVersion+1, foundTarget.GetVersion())
|
||||
+47
-41
@@ -1,4 +1,4 @@
|
||||
package target
|
||||
package tcp_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
@@ -12,11 +12,20 @@ import (
|
||||
"github.com/hashicorp/boundary/internal/iam"
|
||||
"github.com/hashicorp/boundary/internal/kms"
|
||||
"github.com/hashicorp/boundary/internal/oplog"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
targetstore "github.com/hashicorp/boundary/internal/target/store"
|
||||
"github.com/hashicorp/boundary/internal/target/tcp"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"google.golang.org/protobuf/proto"
|
||||
)
|
||||
|
||||
func allocTargetHostSet() target.TargetHostSet {
|
||||
return target.TargetHostSet{
|
||||
TargetHostSet: &targetstore.TargetHostSet{},
|
||||
}
|
||||
}
|
||||
|
||||
func TestRepository_AddTargetHostSets(t *testing.T) {
|
||||
t.Parallel()
|
||||
conn, _ := db.TestSetup(t, "postgres")
|
||||
@@ -25,7 +34,7 @@ func TestRepository_AddTargetHostSets(t *testing.T) {
|
||||
testKms := kms.TestKms(t, conn, wrapper)
|
||||
iamRepo := iam.TestRepo(t, conn, wrapper)
|
||||
staticOrg, staticProj := iam.TestScopes(t, iamRepo)
|
||||
repo, err := NewRepository(rw, rw, testKms)
|
||||
repo, err := target.NewRepository(rw, rw, testKms)
|
||||
require.NoError(t, err)
|
||||
|
||||
createHostSetsFn := func(orgs, projects []string) []string {
|
||||
@@ -46,7 +55,7 @@ func TestRepository_AddTargetHostSets(t *testing.T) {
|
||||
type args struct {
|
||||
targetVersion uint32
|
||||
wantTargetIds bool
|
||||
opt []Option
|
||||
opt []target.Option
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
@@ -90,9 +99,9 @@ func TestRepository_AddTargetHostSets(t *testing.T) {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
require.NoError(conn.Where("1=1").Delete(allocTargetHostSet()).Error)
|
||||
require.NoError(conn.Where("1=1").Delete(allocTcpTarget()).Error)
|
||||
require.NoError(conn.Where("1=1").Delete(tcp.NewTestTarget("")).Error)
|
||||
|
||||
projTarget := TestTcpTarget(t, conn, staticProj.PublicId, "static-proj")
|
||||
projTarget := tcp.TestTarget(t, conn, staticProj.PublicId, "static-proj")
|
||||
|
||||
var hostSourceIds []string
|
||||
origTarget, origHostSet, _, err := repo.LookupTarget(context.Background(), projTarget.PublicId)
|
||||
@@ -124,7 +133,7 @@ func TestRepository_AddTargetHostSets(t *testing.T) {
|
||||
return
|
||||
}
|
||||
require.NoError(err)
|
||||
gotHostSet := map[string]HostSource{}
|
||||
gotHostSet := map[string]target.HostSource{}
|
||||
for _, s := range gotHostSources {
|
||||
gotHostSet[s.Id()] = s
|
||||
}
|
||||
@@ -141,18 +150,15 @@ func TestRepository_AddTargetHostSets(t *testing.T) {
|
||||
err = db.TestVerifyOplog(t, rw, projTarget.PublicId, db.WithOperation(oplog.OpType_OP_TYPE_UPDATE), db.WithCreateNotBefore(10*time.Second))
|
||||
assert.NoError(err)
|
||||
|
||||
foundHostSources, err := fetchHostSources(context.Background(), rw, projTarget.PublicId)
|
||||
tar, ths, _, err := repo.LookupTarget(context.Background(), projTarget.PublicId)
|
||||
require.NoError(err)
|
||||
for _, s := range foundHostSources {
|
||||
assert.Equal(tt.args.targetVersion+1, tar.GetVersion())
|
||||
assert.Equal(origTarget.GetVersion(), tar.GetVersion()-1)
|
||||
assert.Equal(gotHostSources, ths)
|
||||
assert.True(proto.Equal(gotTarget.(*tcp.Target), tar.(*tcp.Target)))
|
||||
for _, s := range ths {
|
||||
assert.NotEmpty(gotHostSet[s.Id()])
|
||||
}
|
||||
|
||||
target, ths, _, err := repo.LookupTarget(context.Background(), projTarget.PublicId)
|
||||
require.NoError(err)
|
||||
assert.Equal(tt.args.targetVersion+1, target.GetVersion())
|
||||
assert.Equal(origTarget.GetVersion(), target.GetVersion()-1)
|
||||
assert.Equal(gotHostSources, ths)
|
||||
assert.True(proto.Equal(gotTarget.(*TcpTarget), target.(*TcpTarget)))
|
||||
})
|
||||
}
|
||||
t.Run("add-existing", func(t *testing.T) {
|
||||
@@ -164,7 +170,7 @@ func TestRepository_AddTargetHostSets(t *testing.T) {
|
||||
hs2 := hsets[1]
|
||||
hs3 := hsets[2]
|
||||
|
||||
projTarget := TestTcpTarget(t, conn, staticProj.PublicId, "add-existing")
|
||||
projTarget := tcp.TestTarget(t, conn, staticProj.PublicId, "add-existing")
|
||||
_, gotHostSources, _, err := repo.AddTargetHostSources(context.Background(), projTarget.PublicId, 1, []string{hs1.PublicId})
|
||||
require.NoError(err)
|
||||
assert.Len(gotHostSources, 1)
|
||||
@@ -181,7 +187,7 @@ func TestRepository_AddTargetHostSets(t *testing.T) {
|
||||
assert.True(errors.Match(errors.T(errors.NotUnique), err))
|
||||
|
||||
// Previous transactions should have been rolled back and only hs1 should be associated
|
||||
gotHostSources, err = fetchHostSources(context.Background(), rw, projTarget.PublicId)
|
||||
_, gotHostSources, _, err = repo.LookupTarget(context.Background(), projTarget.PublicId)
|
||||
require.NoError(err)
|
||||
assert.Len(gotHostSources, 1)
|
||||
assert.Equal(hs1.PublicId, gotHostSources[0].Id())
|
||||
@@ -196,16 +202,16 @@ func TestRepository_DeleteTargetHosts(t *testing.T) {
|
||||
testKms := kms.TestKms(t, conn, wrapper)
|
||||
iamRepo := iam.TestRepo(t, conn, wrapper)
|
||||
_, proj := iam.TestScopes(t, iamRepo)
|
||||
repo, err := NewRepository(rw, rw, testKms)
|
||||
repo, err := target.NewRepository(rw, rw, testKms)
|
||||
require.NoError(t, err)
|
||||
|
||||
type args struct {
|
||||
target Target
|
||||
target target.Target
|
||||
targetIdOverride *string
|
||||
targetVersionOverride *uint32
|
||||
createCnt int
|
||||
deleteCnt int
|
||||
opt []Option
|
||||
opt []target.Option
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
@@ -217,7 +223,7 @@ func TestRepository_DeleteTargetHosts(t *testing.T) {
|
||||
{
|
||||
name: "valid",
|
||||
args: args{
|
||||
target: TestTcpTarget(t, conn, proj.PublicId, "valid"),
|
||||
target: tcp.TestTarget(t, conn, proj.PublicId, "valid"),
|
||||
createCnt: 5,
|
||||
deleteCnt: 5,
|
||||
},
|
||||
@@ -227,7 +233,7 @@ func TestRepository_DeleteTargetHosts(t *testing.T) {
|
||||
{
|
||||
name: "valid-keeping-some",
|
||||
args: args{
|
||||
target: TestTcpTarget(t, conn, proj.PublicId, "valid-keeping-some"),
|
||||
target: tcp.TestTarget(t, conn, proj.PublicId, "valid-keeping-some"),
|
||||
createCnt: 5,
|
||||
deleteCnt: 2,
|
||||
},
|
||||
@@ -237,7 +243,7 @@ func TestRepository_DeleteTargetHosts(t *testing.T) {
|
||||
{
|
||||
name: "no-deletes",
|
||||
args: args{
|
||||
target: TestTcpTarget(t, conn, proj.PublicId, "no-deletes"),
|
||||
target: tcp.TestTarget(t, conn, proj.PublicId, "no-deletes"),
|
||||
createCnt: 5,
|
||||
},
|
||||
wantRowsDeleted: 0,
|
||||
@@ -247,8 +253,8 @@ func TestRepository_DeleteTargetHosts(t *testing.T) {
|
||||
{
|
||||
name: "not-found",
|
||||
args: args{
|
||||
target: TestTcpTarget(t, conn, proj.PublicId, "not-found"),
|
||||
targetIdOverride: func() *string { id := testId(t); return &id }(),
|
||||
target: tcp.TestTarget(t, conn, proj.PublicId, "not-found"),
|
||||
targetIdOverride: func() *string { id := tcp.TestId(t); return &id }(),
|
||||
createCnt: 5,
|
||||
deleteCnt: 5,
|
||||
},
|
||||
@@ -258,7 +264,7 @@ func TestRepository_DeleteTargetHosts(t *testing.T) {
|
||||
{
|
||||
name: "missing-target-id",
|
||||
args: args{
|
||||
target: TestTcpTarget(t, conn, proj.PublicId, "missing-target-id"),
|
||||
target: tcp.TestTarget(t, conn, proj.PublicId, "missing-target-id"),
|
||||
targetIdOverride: func() *string { id := ""; return &id }(),
|
||||
createCnt: 5,
|
||||
deleteCnt: 5,
|
||||
@@ -270,7 +276,7 @@ func TestRepository_DeleteTargetHosts(t *testing.T) {
|
||||
{
|
||||
name: "zero-version",
|
||||
args: args{
|
||||
target: TestTcpTarget(t, conn, proj.PublicId, "zero-version"),
|
||||
target: tcp.TestTarget(t, conn, proj.PublicId, "zero-version"),
|
||||
targetVersionOverride: func() *uint32 { v := uint32(0); return &v }(),
|
||||
createCnt: 5,
|
||||
deleteCnt: 5,
|
||||
@@ -282,7 +288,7 @@ func TestRepository_DeleteTargetHosts(t *testing.T) {
|
||||
{
|
||||
name: "bad-version",
|
||||
args: args{
|
||||
target: TestTcpTarget(t, conn, proj.PublicId, "bad-version"),
|
||||
target: tcp.TestTarget(t, conn, proj.PublicId, "bad-version"),
|
||||
targetVersionOverride: func() *uint32 { v := uint32(1000); return &v }(),
|
||||
createCnt: 5,
|
||||
deleteCnt: 5,
|
||||
@@ -367,7 +373,7 @@ func TestRepository_DeleteTargetHosts(t *testing.T) {
|
||||
hs2 := hsets[1]
|
||||
hs3 := hsets[2]
|
||||
|
||||
projTarget := TestTcpTarget(t, conn, proj.PublicId, "delete-unassociated")
|
||||
projTarget := tcp.TestTarget(t, conn, proj.PublicId, "delete-unassociated")
|
||||
_, gotHostSources, _, err := repo.AddTargetHostSources(context.Background(), projTarget.PublicId, 1, []string{hs1.PublicId, hs2.PublicId})
|
||||
require.NoError(err)
|
||||
assert.Len(gotHostSources, 2)
|
||||
@@ -386,7 +392,7 @@ func TestRepository_DeleteTargetHosts(t *testing.T) {
|
||||
assert.Equal(0, delCount)
|
||||
|
||||
// Previous transactions should have been rolled back
|
||||
gotHostSources, err = fetchHostSources(context.Background(), rw, projTarget.PublicId)
|
||||
_, gotHostSources, _, err = repo.LookupTarget(context.Background(), projTarget.PublicId)
|
||||
require.NoError(err)
|
||||
assert.Len(gotHostSources, 2)
|
||||
})
|
||||
@@ -398,7 +404,7 @@ func TestRepository_SetTargetHostSets(t *testing.T) {
|
||||
rw := db.New(conn)
|
||||
wrapper := db.TestWrapper(t)
|
||||
testKms := kms.TestKms(t, conn, wrapper)
|
||||
repo, err := NewRepository(rw, rw, testKms)
|
||||
repo, err := target.NewRepository(rw, rw, testKms)
|
||||
require.NoError(t, err)
|
||||
|
||||
iamRepo := iam.TestRepo(t, conn, wrapper)
|
||||
@@ -421,7 +427,7 @@ func TestRepository_SetTargetHostSets(t *testing.T) {
|
||||
return results
|
||||
}
|
||||
|
||||
setupFn := func(target Target) []HostSource {
|
||||
setupFn := func(target target.Target) []target.HostSource {
|
||||
hs := createHostSetsFn()
|
||||
_, created, _, err := repo.AddTargetHostSources(context.Background(), target.GetPublicId(), 1, hs)
|
||||
require.NoError(t, err)
|
||||
@@ -429,15 +435,15 @@ func TestRepository_SetTargetHostSets(t *testing.T) {
|
||||
return created
|
||||
}
|
||||
type args struct {
|
||||
target Target
|
||||
target target.Target
|
||||
targetVersion uint32
|
||||
hostSourceIds []string
|
||||
addToOrigHostSources bool
|
||||
opt []Option
|
||||
opt []target.Option
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
setup func(Target) []HostSource
|
||||
setup func(target.Target) []target.HostSource
|
||||
args args
|
||||
wantAffectedRows int
|
||||
wantErr bool
|
||||
@@ -446,7 +452,7 @@ func TestRepository_SetTargetHostSets(t *testing.T) {
|
||||
name: "clear",
|
||||
setup: setupFn,
|
||||
args: args{
|
||||
target: TestTcpTarget(t, conn, proj.PublicId, "clear"),
|
||||
target: tcp.TestTarget(t, conn, proj.PublicId, "clear"),
|
||||
targetVersion: 2, // yep, since setupFn will increment it to 2
|
||||
hostSourceIds: []string{},
|
||||
},
|
||||
@@ -457,7 +463,7 @@ func TestRepository_SetTargetHostSets(t *testing.T) {
|
||||
name: "no-change",
|
||||
setup: setupFn,
|
||||
args: args{
|
||||
target: TestTcpTarget(t, conn, proj.PublicId, "no-change"),
|
||||
target: tcp.TestTarget(t, conn, proj.PublicId, "no-change"),
|
||||
targetVersion: 2, // yep, since setupFn will increment it to 2
|
||||
hostSourceIds: []string{},
|
||||
addToOrigHostSources: true,
|
||||
@@ -469,7 +475,7 @@ func TestRepository_SetTargetHostSets(t *testing.T) {
|
||||
name: "add-sets",
|
||||
setup: setupFn,
|
||||
args: args{
|
||||
target: TestTcpTarget(t, conn, proj.PublicId, "add-sets"),
|
||||
target: tcp.TestTarget(t, conn, proj.PublicId, "add-sets"),
|
||||
targetVersion: 2, // yep, since setupFn will increment it to 2
|
||||
hostSourceIds: []string{testHostSetIds[0], testHostSetIds[1]},
|
||||
addToOrigHostSources: true,
|
||||
@@ -481,7 +487,7 @@ func TestRepository_SetTargetHostSets(t *testing.T) {
|
||||
name: "add host sets with zero version",
|
||||
setup: setupFn,
|
||||
args: args{
|
||||
target: TestTcpTarget(t, conn, proj.PublicId, "add host sets with zero version"),
|
||||
target: tcp.TestTarget(t, conn, proj.PublicId, "add host sets with zero version"),
|
||||
targetVersion: 0,
|
||||
hostSourceIds: []string{testHostSetIds[0], testHostSetIds[1]},
|
||||
addToOrigHostSources: true,
|
||||
@@ -492,7 +498,7 @@ func TestRepository_SetTargetHostSets(t *testing.T) {
|
||||
name: "remove existing and add users and grps",
|
||||
setup: setupFn,
|
||||
args: args{
|
||||
target: TestTcpTarget(t, conn, proj.PublicId, "remove existing and add host sets"),
|
||||
target: tcp.TestTarget(t, conn, proj.PublicId, "remove existing and add host sets"),
|
||||
targetVersion: 2, // yep, since setupFn will increment it to 2
|
||||
hostSourceIds: []string{testHostSetIds[0], testHostSetIds[1]},
|
||||
addToOrigHostSources: false,
|
||||
@@ -504,7 +510,7 @@ func TestRepository_SetTargetHostSets(t *testing.T) {
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
var origHostSources []HostSource
|
||||
var origHostSources []target.HostSource
|
||||
if tt.setup != nil {
|
||||
origHostSources = tt.setup(tt.args.target)
|
||||
}
|
||||
+89
-78
@@ -1,4 +1,4 @@
|
||||
package target
|
||||
package tcp_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
@@ -13,18 +13,20 @@ import (
|
||||
"github.com/hashicorp/boundary/internal/iam"
|
||||
"github.com/hashicorp/boundary/internal/kms"
|
||||
"github.com/hashicorp/boundary/internal/oplog"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
"github.com/hashicorp/boundary/internal/target/tcp"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"google.golang.org/protobuf/proto"
|
||||
)
|
||||
|
||||
func TestRepository_CreateTcpTarget(t *testing.T) {
|
||||
func TestRepository_CreateTarget(t *testing.T) {
|
||||
t.Parallel()
|
||||
conn, _ := db.TestSetup(t, "postgres")
|
||||
rw := db.New(conn)
|
||||
wrapper := db.TestWrapper(t)
|
||||
testKms := kms.TestKms(t, conn, wrapper)
|
||||
repo, err := NewRepository(rw, rw, testKms)
|
||||
repo, err := target.NewRepository(rw, rw, testKms)
|
||||
require.NoError(t, err)
|
||||
_, proj := iam.TestScopes(t, iam.TestRepo(t, conn, wrapper))
|
||||
|
||||
@@ -43,8 +45,8 @@ func TestRepository_CreateTcpTarget(t *testing.T) {
|
||||
}
|
||||
|
||||
type args struct {
|
||||
target *TcpTarget
|
||||
opt []Option
|
||||
target *tcp.Target
|
||||
opt []target.Option
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
@@ -57,11 +59,11 @@ func TestRepository_CreateTcpTarget(t *testing.T) {
|
||||
{
|
||||
name: "valid-org",
|
||||
args: args{
|
||||
target: func() *TcpTarget {
|
||||
target, err := NewTcpTarget(proj.PublicId,
|
||||
WithName("valid-org"),
|
||||
WithDescription("valid-org"),
|
||||
WithDefaultPort(uint32(22)))
|
||||
target: func() *tcp.Target {
|
||||
target, err := tcp.New(proj.PublicId,
|
||||
target.WithName("valid-org"),
|
||||
target.WithDescription("valid-org"),
|
||||
target.WithDefaultPort(uint32(22)))
|
||||
require.NoError(t, err)
|
||||
return target
|
||||
}(),
|
||||
@@ -73,15 +75,15 @@ func TestRepository_CreateTcpTarget(t *testing.T) {
|
||||
{
|
||||
name: "valid-org-with-host-sets",
|
||||
args: args{
|
||||
target: func() *TcpTarget {
|
||||
target, err := NewTcpTarget(proj.PublicId,
|
||||
WithName("valid-org-with-host-sets"),
|
||||
WithDescription("valid-org"),
|
||||
WithDefaultPort(uint32(22)))
|
||||
target: func() *tcp.Target {
|
||||
target, err := tcp.New(proj.PublicId,
|
||||
target.WithName("valid-org-with-host-sets"),
|
||||
target.WithDescription("valid-org"),
|
||||
target.WithDefaultPort(uint32(22)))
|
||||
require.NoError(t, err)
|
||||
return target
|
||||
}(),
|
||||
opt: []Option{WithHostSources(sets)},
|
||||
opt: []target.Option{target.WithHostSources(sets)},
|
||||
},
|
||||
wantErr: false,
|
||||
wantHostSources: sets,
|
||||
@@ -90,15 +92,15 @@ func TestRepository_CreateTcpTarget(t *testing.T) {
|
||||
{
|
||||
name: "valid-org-with-cred-libs",
|
||||
args: args{
|
||||
target: func() *TcpTarget {
|
||||
target, err := NewTcpTarget(proj.PublicId,
|
||||
WithName("valid-org-with-cred-libs"),
|
||||
WithDescription("valid-org"),
|
||||
WithDefaultPort(uint32(22)))
|
||||
target: func() *tcp.Target {
|
||||
target, err := tcp.New(proj.PublicId,
|
||||
target.WithName("valid-org-with-cred-libs"),
|
||||
target.WithDescription("valid-org"),
|
||||
target.WithDefaultPort(uint32(22)))
|
||||
require.NoError(t, err)
|
||||
return target
|
||||
}(),
|
||||
opt: []Option{WithCredentialSources(clIds)},
|
||||
opt: []target.Option{target.WithCredentialSources(clIds)},
|
||||
},
|
||||
wantErr: false,
|
||||
wantCredLibs: clIds,
|
||||
@@ -107,17 +109,17 @@ func TestRepository_CreateTcpTarget(t *testing.T) {
|
||||
{
|
||||
name: "valid-org-with-cred-libs-and-host-sets",
|
||||
args: args{
|
||||
target: func() *TcpTarget {
|
||||
target, err := NewTcpTarget(proj.PublicId,
|
||||
WithName("valid-org-with-cred-libs-and-host-sets"),
|
||||
WithDescription("valid-org"),
|
||||
WithDefaultPort(uint32(22)))
|
||||
target: func() *tcp.Target {
|
||||
target, err := tcp.New(proj.PublicId,
|
||||
target.WithName("valid-org-with-cred-libs-and-host-sets"),
|
||||
target.WithDescription("valid-org"),
|
||||
target.WithDefaultPort(uint32(22)))
|
||||
require.NoError(t, err)
|
||||
return target
|
||||
}(),
|
||||
opt: []Option{
|
||||
WithHostSources(sets),
|
||||
WithCredentialSources(clIds),
|
||||
opt: []target.Option{
|
||||
target.WithHostSources(sets),
|
||||
target.WithCredentialSources(clIds),
|
||||
},
|
||||
},
|
||||
wantErr: false,
|
||||
@@ -135,8 +137,8 @@ func TestRepository_CreateTcpTarget(t *testing.T) {
|
||||
{
|
||||
name: "nil-target-store",
|
||||
args: args{
|
||||
target: func() *TcpTarget {
|
||||
target := &TcpTarget{}
|
||||
target: func() *tcp.Target {
|
||||
target := &tcp.Target{}
|
||||
return target
|
||||
}(),
|
||||
},
|
||||
@@ -146,13 +148,18 @@ func TestRepository_CreateTcpTarget(t *testing.T) {
|
||||
{
|
||||
name: "public-id-not-empty",
|
||||
args: args{
|
||||
target: func() *TcpTarget {
|
||||
target, err := NewTcpTarget(proj.PublicId, WithName("valid-org"), WithDescription("valid-org"), WithDefaultPort(uint32(22)))
|
||||
target: func() *tcp.Target {
|
||||
tar, err := tcp.New(
|
||||
proj.PublicId,
|
||||
target.WithName("valid-org"),
|
||||
target.WithDescription("valid-org"),
|
||||
target.WithDefaultPort(uint32(22)),
|
||||
)
|
||||
require.NoError(t, err)
|
||||
id, err := newTcpTargetId()
|
||||
id, err := db.NewPublicId(tcp.TargetPrefix)
|
||||
require.NoError(t, err)
|
||||
target.PublicId = id
|
||||
return target
|
||||
tar.PublicId = id
|
||||
return tar
|
||||
}(),
|
||||
},
|
||||
wantErr: true,
|
||||
@@ -161,11 +168,14 @@ func TestRepository_CreateTcpTarget(t *testing.T) {
|
||||
{
|
||||
name: "empty-scope-id",
|
||||
args: args{
|
||||
target: func() *TcpTarget {
|
||||
target := allocTcpTarget()
|
||||
target.Name = "empty-scope-id"
|
||||
target: func() *tcp.Target {
|
||||
tar, err := tcp.New(
|
||||
proj.PublicId,
|
||||
target.WithName("empty-scope-id"),
|
||||
)
|
||||
require.NoError(t, err)
|
||||
return &target
|
||||
tar.ScopeId = ""
|
||||
return tar
|
||||
}(),
|
||||
},
|
||||
wantErr: true,
|
||||
@@ -175,15 +185,15 @@ func TestRepository_CreateTcpTarget(t *testing.T) {
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
target, hostSources, credSources, err := repo.CreateTcpTarget(context.Background(), tt.args.target, tt.args.opt...)
|
||||
tar, hostSources, credSources, err := repo.CreateTarget(context.Background(), tt.args.target, tt.args.opt...)
|
||||
if tt.wantErr {
|
||||
assert.Error(err)
|
||||
assert.Nil(target)
|
||||
assert.Nil(tar)
|
||||
assert.True(errors.Match(errors.T(tt.wantIsError), err))
|
||||
return
|
||||
}
|
||||
require.NoError(err)
|
||||
assert.NotNil(target.GetPublicId())
|
||||
assert.NotNil(tar.GetPublicId())
|
||||
hsIds := make([]string, 0, len(hostSources))
|
||||
for _, s := range hostSources {
|
||||
hsIds = append(hsIds, s.Id())
|
||||
@@ -196,20 +206,20 @@ func TestRepository_CreateTcpTarget(t *testing.T) {
|
||||
}
|
||||
assert.Equal(tt.wantCredLibs, clIds)
|
||||
|
||||
foundTarget, foundHostSources, foundCredLibs, err := repo.LookupTarget(context.Background(), target.GetPublicId())
|
||||
foundTarget, foundHostSources, foundCredLibs, err := repo.LookupTarget(context.Background(), tar.GetPublicId())
|
||||
assert.NoError(err)
|
||||
assert.True(proto.Equal(target.(*TcpTarget), foundTarget.(*TcpTarget)))
|
||||
assert.True(proto.Equal(tar.(*tcp.Target), foundTarget.(*tcp.Target)))
|
||||
assert.Equal(hostSources, foundHostSources)
|
||||
assert.Equal(credSources, foundCredLibs)
|
||||
|
||||
err = db.TestVerifyOplog(t, rw, target.GetPublicId(), db.WithOperation(oplog.OpType_OP_TYPE_CREATE), db.WithCreateNotBefore(10*time.Second))
|
||||
err = db.TestVerifyOplog(t, rw, tar.GetPublicId(), db.WithOperation(oplog.OpType_OP_TYPE_CREATE), db.WithCreateNotBefore(10*time.Second))
|
||||
assert.NoError(err)
|
||||
|
||||
// TODO (jimlambrt 9/2020) - unfortunately, we can currently
|
||||
// test to make sure that the oplog entry for a target host sets
|
||||
// create exist because the db.TestVerifyOplog doesn't really
|
||||
// support that level of testing and the previous call to
|
||||
// CreateTcpTarget would create an oplog entry for the
|
||||
// CreateTarget would create an oplog entry for the
|
||||
// create on the target even if no host sets were added. Once
|
||||
// TestVerifyOplog supports the appropriate granularity, we should
|
||||
// add an appropriate assert.
|
||||
@@ -225,9 +235,9 @@ func TestRepository_UpdateTcpTarget(t *testing.T) {
|
||||
wrapper := db.TestWrapper(t)
|
||||
testKms := kms.TestKms(t, conn, wrapper)
|
||||
|
||||
repo, err := NewRepository(rw, rw, testKms)
|
||||
repo, err := target.NewRepository(rw, rw, testKms)
|
||||
require.NoError(t, err)
|
||||
id := testId(t)
|
||||
id := tcp.TestId(t)
|
||||
|
||||
iamRepo := iam.TestRepo(t, conn, wrapper)
|
||||
_, proj := iam.TestScopes(t, iamRepo)
|
||||
@@ -238,7 +248,7 @@ func TestRepository_UpdateTcpTarget(t *testing.T) {
|
||||
description string
|
||||
port uint32
|
||||
fieldMaskPaths []string
|
||||
opt []Option
|
||||
opt []target.Option
|
||||
ScopeId string
|
||||
PublicId *string
|
||||
}
|
||||
@@ -246,7 +256,7 @@ func TestRepository_UpdateTcpTarget(t *testing.T) {
|
||||
name string
|
||||
newScopeId string
|
||||
newName string
|
||||
newTargetOpts []Option
|
||||
newTargetOpts []target.Option
|
||||
args args
|
||||
wantRowsUpdate int
|
||||
wantErr bool
|
||||
@@ -288,7 +298,7 @@ func TestRepository_UpdateTcpTarget(t *testing.T) {
|
||||
newScopeId: proj.PublicId,
|
||||
wantErr: true,
|
||||
wantRowsUpdate: 0,
|
||||
wantErrMsg: "target.(Repository).UpdateTcpTarget: failed for 1: db.DoTx: target.(Repository).UpdateTcpTarget: target.(Repository).update: db.DoTx: target.(Repository).update: db.Update: db.lookupAfterWrite: db.LookupById: record not found, search issue: error #1100",
|
||||
wantErrMsg: "target.(Repository).UpdateTarget: failed for 1: db.DoTx: target.(Repository).UpdateTarget: target.(Repository).update: db.DoTx: target.(Repository).update: db.Update: db.lookupAfterWrite: db.LookupById: record not found, search issue: error #1100",
|
||||
wantIsError: errors.RecordNotFound,
|
||||
},
|
||||
{
|
||||
@@ -302,7 +312,7 @@ func TestRepository_UpdateTcpTarget(t *testing.T) {
|
||||
newName: "null-name" + id,
|
||||
wantErr: true,
|
||||
wantRowsUpdate: 0,
|
||||
wantErrMsg: "db.DoTx: target.(Repository).UpdateTcpTarget: target.(Repository).update: db.DoTx: target.(Repository).update: db.Update: name must not be empty: not null constraint violated: integrity violation: error #1001",
|
||||
wantErrMsg: "db.DoTx: target.(Repository).UpdateTarget: target.(Repository).update: db.DoTx: target.(Repository).update: db.Update: name must not be empty: not null constraint violated: integrity violation: error #1001",
|
||||
},
|
||||
{
|
||||
name: "null-description",
|
||||
@@ -312,7 +322,7 @@ func TestRepository_UpdateTcpTarget(t *testing.T) {
|
||||
ScopeId: proj.PublicId,
|
||||
},
|
||||
newScopeId: proj.PublicId,
|
||||
newTargetOpts: []Option{WithDescription("null-description" + id)},
|
||||
newTargetOpts: []target.Option{target.WithDescription("null-description" + id)},
|
||||
wantErr: false,
|
||||
wantRowsUpdate: 1,
|
||||
},
|
||||
@@ -326,7 +336,7 @@ func TestRepository_UpdateTcpTarget(t *testing.T) {
|
||||
newScopeId: proj.PublicId,
|
||||
wantErr: true,
|
||||
wantRowsUpdate: 0,
|
||||
wantErrMsg: "target.(Repository).UpdateTcpTarget: empty field mask: parameter violation: error #104",
|
||||
wantErrMsg: "target.(Repository).UpdateTarget: empty field mask: parameter violation: error #104",
|
||||
wantIsError: errors.EmptyFieldMask,
|
||||
},
|
||||
{
|
||||
@@ -339,7 +349,7 @@ func TestRepository_UpdateTcpTarget(t *testing.T) {
|
||||
newScopeId: proj.PublicId,
|
||||
wantErr: true,
|
||||
wantRowsUpdate: 0,
|
||||
wantErrMsg: "target.(Repository).UpdateTcpTarget: empty field mask: parameter violation: error #104",
|
||||
wantErrMsg: "target.(Repository).UpdateTarget: empty field mask: parameter violation: error #104",
|
||||
wantIsError: errors.EmptyFieldMask,
|
||||
},
|
||||
{
|
||||
@@ -352,7 +362,7 @@ func TestRepository_UpdateTcpTarget(t *testing.T) {
|
||||
newScopeId: proj.PublicId,
|
||||
wantErr: true,
|
||||
wantRowsUpdate: 0,
|
||||
wantErrMsg: "target.(Repository).UpdateTcpTarget: invalid field mask: CreateTime: parameter violation: error #103",
|
||||
wantErrMsg: "target.(Repository).UpdateTarget: invalid field mask: CreateTime: parameter violation: error #103",
|
||||
wantIsError: errors.InvalidFieldMask,
|
||||
},
|
||||
{
|
||||
@@ -365,7 +375,7 @@ func TestRepository_UpdateTcpTarget(t *testing.T) {
|
||||
newScopeId: proj.PublicId,
|
||||
wantErr: true,
|
||||
wantRowsUpdate: 0,
|
||||
wantErrMsg: "target.(Repository).UpdateTcpTarget: invalid field mask: Alice: parameter violation: error #103",
|
||||
wantErrMsg: "target.(Repository).UpdateTarget: invalid field mask: Alice: parameter violation: error #103",
|
||||
wantIsError: errors.InvalidFieldMask,
|
||||
},
|
||||
{
|
||||
@@ -378,7 +388,7 @@ func TestRepository_UpdateTcpTarget(t *testing.T) {
|
||||
},
|
||||
newScopeId: proj.PublicId,
|
||||
wantErr: true,
|
||||
wantErrMsg: "target.(Repository).UpdateTcpTarget: missing target public id: parameter violation: error #100",
|
||||
wantErrMsg: "target.(Repository).UpdateTarget: missing target public id: parameter violation: error #100",
|
||||
wantIsError: errors.InvalidParameter,
|
||||
wantRowsUpdate: 0,
|
||||
},
|
||||
@@ -390,7 +400,7 @@ func TestRepository_UpdateTcpTarget(t *testing.T) {
|
||||
},
|
||||
newScopeId: proj.PublicId,
|
||||
wantErr: true,
|
||||
wantErrMsg: "target.(Repository).UpdateTcpTarget: empty field mask: parameter violation: error #104",
|
||||
wantErrMsg: "target.(Repository).UpdateTarget: empty field mask: parameter violation: error #104",
|
||||
wantIsError: errors.EmptyFieldMask,
|
||||
},
|
||||
{
|
||||
@@ -424,7 +434,7 @@ func TestRepository_UpdateTcpTarget(t *testing.T) {
|
||||
cs := css[i]
|
||||
require, assert := require.New(t), assert.New(t)
|
||||
if tt.wantDup {
|
||||
_ = TestTcpTarget(t, conn, proj.PublicId, tt.args.name)
|
||||
_ = tcp.TestTarget(t, conn, proj.PublicId, tt.args.name)
|
||||
}
|
||||
|
||||
testCats := static.TestCatalogs(t, conn, proj.PublicId, 1)
|
||||
@@ -440,30 +450,31 @@ func TestRepository_UpdateTcpTarget(t *testing.T) {
|
||||
testClIds = append(testClIds, cl.PublicId)
|
||||
}
|
||||
|
||||
tt.newTargetOpts = append(tt.newTargetOpts, WithHostSources(testHostSetIds), WithCredentialSources(testClIds))
|
||||
tt.newTargetOpts = append(tt.newTargetOpts, target.WithHostSources(testHostSetIds), target.WithCredentialSources(testClIds))
|
||||
name := tt.newName
|
||||
if name == "" {
|
||||
name = testId(t)
|
||||
name = tcp.TestId(t)
|
||||
}
|
||||
target := TestTcpTarget(t, conn, tt.newScopeId, name, tt.newTargetOpts...)
|
||||
updateTarget := allocTcpTarget()
|
||||
updateTarget.PublicId = target.PublicId
|
||||
tar := tcp.TestTarget(t, conn, tt.newScopeId, name, tt.newTargetOpts...)
|
||||
updateTarget := tcp.NewTestTarget(
|
||||
tt.args.ScopeId,
|
||||
target.WithName(tt.args.name),
|
||||
target.WithDescription(tt.args.description),
|
||||
target.WithDefaultPort(tt.args.port),
|
||||
)
|
||||
updateTarget.PublicId = tar.PublicId
|
||||
if tt.args.PublicId != nil {
|
||||
updateTarget.PublicId = *tt.args.PublicId
|
||||
}
|
||||
updateTarget.ScopeId = tt.args.ScopeId
|
||||
updateTarget.Name = tt.args.name
|
||||
updateTarget.Description = tt.args.description
|
||||
updateTarget.DefaultPort = tt.args.port
|
||||
|
||||
targetAfterUpdate, hostSources, credSources, updatedRows, err := repo.UpdateTcpTarget(context.Background(), &updateTarget, target.Version, tt.args.fieldMaskPaths, tt.args.opt...)
|
||||
targetAfterUpdate, hostSources, credSources, updatedRows, err := repo.UpdateTarget(context.Background(), updateTarget, tar.Version, tt.args.fieldMaskPaths, tt.args.opt...)
|
||||
if tt.wantErr {
|
||||
assert.Error(err)
|
||||
assert.True(errors.Match(errors.T(tt.wantIsError), err))
|
||||
assert.Nil(targetAfterUpdate)
|
||||
assert.Equal(0, updatedRows)
|
||||
assert.Contains(err.Error(), tt.wantErrMsg)
|
||||
err = db.TestVerifyOplog(t, rw, target.PublicId, db.WithOperation(oplog.OpType_OP_TYPE_UPDATE), db.WithCreateNotBefore(10*time.Second))
|
||||
err = db.TestVerifyOplog(t, rw, tar.PublicId, db.WithOperation(oplog.OpType_OP_TYPE_UPDATE), db.WithCreateNotBefore(10*time.Second))
|
||||
assert.Error(err)
|
||||
assert.True(errors.IsNotFoundError(err))
|
||||
return
|
||||
@@ -485,13 +496,13 @@ func TestRepository_UpdateTcpTarget(t *testing.T) {
|
||||
|
||||
switch tt.name {
|
||||
case "valid-no-op":
|
||||
assert.Equal(target.UpdateTime, targetAfterUpdate.(*TcpTarget).UpdateTime)
|
||||
assert.Equal(tar.UpdateTime, targetAfterUpdate.(*tcp.Target).UpdateTime)
|
||||
default:
|
||||
assert.NotEqual(target.UpdateTime, targetAfterUpdate.(*TcpTarget).UpdateTime)
|
||||
assert.NotEqual(tar.UpdateTime, targetAfterUpdate.(*tcp.Target).UpdateTime)
|
||||
}
|
||||
foundTarget, _, _, err := repo.LookupTarget(context.Background(), target.PublicId)
|
||||
foundTarget, _, _, err := repo.LookupTarget(context.Background(), tar.PublicId)
|
||||
assert.NoError(err)
|
||||
assert.True(proto.Equal(targetAfterUpdate.((*TcpTarget)), foundTarget.((*TcpTarget))))
|
||||
assert.True(proto.Equal(targetAfterUpdate.((*tcp.Target)), foundTarget.((*tcp.Target))))
|
||||
underlyingDB, err := conn.SqlDB(ctx)
|
||||
require.NoError(err)
|
||||
dbassert := dbassert.New(t, underlyingDB)
|
||||
@@ -499,7 +510,7 @@ func TestRepository_UpdateTcpTarget(t *testing.T) {
|
||||
assert.Equal(foundTarget.GetDescription(), "")
|
||||
dbassert.IsNull(foundTarget, "description")
|
||||
}
|
||||
err = db.TestVerifyOplog(t, rw, target.PublicId, db.WithOperation(oplog.OpType_OP_TYPE_UPDATE), db.WithCreateNotBefore(10*time.Second))
|
||||
err = db.TestVerifyOplog(t, rw, tar.PublicId, db.WithOperation(oplog.OpType_OP_TYPE_UPDATE), db.WithCreateNotBefore(10*time.Second))
|
||||
assert.NoError(err)
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,347 @@
|
||||
package tcp_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/hashicorp/boundary/internal/db"
|
||||
"github.com/hashicorp/boundary/internal/errors"
|
||||
"github.com/hashicorp/boundary/internal/iam"
|
||||
"github.com/hashicorp/boundary/internal/kms"
|
||||
"github.com/hashicorp/boundary/internal/oplog"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
"github.com/hashicorp/boundary/internal/target/tcp"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestRepository_LookupTarget(t *testing.T) {
|
||||
t.Parallel()
|
||||
conn, _ := db.TestSetup(t, "postgres")
|
||||
wrapper := db.TestWrapper(t)
|
||||
testKms := kms.TestKms(t, conn, wrapper)
|
||||
iamRepo := iam.TestRepo(t, conn, wrapper)
|
||||
_, proj := iam.TestScopes(t, iamRepo)
|
||||
proj.Name = "project-name"
|
||||
_, _, err := iamRepo.UpdateScope(context.Background(), proj, 1, []string{"name"})
|
||||
require.NoError(t, err)
|
||||
rw := db.New(conn)
|
||||
repo, err := target.NewRepository(rw, rw, testKms)
|
||||
require.NoError(t, err)
|
||||
tgt := tcp.TestTarget(t, conn, proj.PublicId, "target-name")
|
||||
|
||||
tests := []struct {
|
||||
testName string
|
||||
id string
|
||||
name string
|
||||
scopeId string
|
||||
scopeName string
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
testName: "id",
|
||||
id: tgt.PublicId,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
testName: "name only",
|
||||
name: tgt.Name,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
testName: "scope id only",
|
||||
scopeId: proj.PublicId,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
testName: "scope name only",
|
||||
scopeName: proj.Name,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
testName: "scope name and id",
|
||||
scopeId: proj.PublicId,
|
||||
scopeName: proj.Name,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
testName: "everything",
|
||||
name: tgt.Name,
|
||||
scopeId: proj.PublicId,
|
||||
scopeName: proj.Name,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
testName: "name and scope name",
|
||||
name: tgt.Name,
|
||||
scopeName: proj.Name,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
testName: "name and scope id",
|
||||
name: tgt.Name,
|
||||
scopeId: proj.PublicId,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
testName: "id and name",
|
||||
id: tgt.PublicId,
|
||||
name: tgt.Name,
|
||||
scopeId: proj.PublicId,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
testName: "id and scope name",
|
||||
id: tgt.PublicId,
|
||||
scopeName: proj.Name,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
testName: "id and scope id",
|
||||
id: tgt.PublicId,
|
||||
scopeId: proj.PublicId,
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.testName, func(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
id := tt.id
|
||||
if tt.name != "" && tt.id == "" {
|
||||
id = tt.name
|
||||
}
|
||||
var opts []target.Option
|
||||
if tt.name != "" {
|
||||
opts = append(opts, target.WithName(tt.name))
|
||||
}
|
||||
if tt.scopeId != "" {
|
||||
opts = append(opts, target.WithScopeId(tt.scopeId))
|
||||
}
|
||||
if tt.scopeName != "" {
|
||||
opts = append(opts, target.WithScopeName(tt.scopeName))
|
||||
}
|
||||
got, _, _, err := repo.LookupTarget(context.Background(), id, opts...)
|
||||
if tt.wantErr {
|
||||
require.Error(err)
|
||||
return
|
||||
}
|
||||
require.NoError(err)
|
||||
assert.Equal(tgt.PublicId, got.GetPublicId())
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestRepository_ListTargets(t *testing.T) {
|
||||
t.Parallel()
|
||||
conn, _ := db.TestSetup(t, "postgres")
|
||||
const testLimit = 10
|
||||
wrapper := db.TestWrapper(t)
|
||||
testKms := kms.TestKms(t, conn, wrapper)
|
||||
iamRepo := iam.TestRepo(t, conn, wrapper)
|
||||
_, proj := iam.TestScopes(t, iamRepo)
|
||||
rw := db.New(conn)
|
||||
repo, err := target.NewRepository(rw, rw, testKms, target.WithLimit(testLimit))
|
||||
require.NoError(t, err)
|
||||
|
||||
type args struct {
|
||||
opt []target.Option
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
createCnt int
|
||||
createScopeId string
|
||||
createScopeId2 string
|
||||
grantUserId string
|
||||
args args
|
||||
wantCnt int
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "tcp-target",
|
||||
createCnt: 5,
|
||||
createScopeId: proj.PublicId,
|
||||
args: args{
|
||||
opt: []target.Option{target.WithTargetType(target.TcpTargetType), target.WithScopeIds([]string{proj.PublicId})},
|
||||
},
|
||||
wantCnt: 5,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "no-limit",
|
||||
createCnt: testLimit + 1,
|
||||
createScopeId: proj.PublicId,
|
||||
args: args{
|
||||
opt: []target.Option{target.WithLimit(-1), target.WithScopeIds([]string{proj.PublicId})},
|
||||
},
|
||||
wantCnt: testLimit + 1,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "default-limit",
|
||||
createCnt: testLimit + 1,
|
||||
createScopeId: proj.PublicId,
|
||||
args: args{
|
||||
opt: []target.Option{target.WithScopeIds([]string{proj.PublicId})},
|
||||
},
|
||||
wantCnt: testLimit,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "custom-limit",
|
||||
createCnt: testLimit + 1,
|
||||
createScopeId: proj.PublicId,
|
||||
args: args{
|
||||
opt: []target.Option{target.WithLimit(3), target.WithScopeIds([]string{proj.PublicId})},
|
||||
},
|
||||
wantCnt: 3,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "bad-org",
|
||||
createCnt: 1,
|
||||
createScopeId: proj.PublicId,
|
||||
args: args{
|
||||
opt: []target.Option{target.WithScopeIds([]string{"bad-id"})},
|
||||
},
|
||||
wantCnt: 0,
|
||||
wantErr: false,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
require.NoError(conn.Where("1=1").Delete(tcp.NewTestTarget("")).Error)
|
||||
testGroups := []*tcp.Target{}
|
||||
for i := 0; i < tt.createCnt; i++ {
|
||||
switch {
|
||||
case tt.createScopeId2 != "" && i%2 == 0:
|
||||
testGroups = append(testGroups, tcp.TestTarget(t, conn, tt.createScopeId2, strconv.Itoa(i)))
|
||||
default:
|
||||
testGroups = append(testGroups, tcp.TestTarget(t, conn, tt.createScopeId, strconv.Itoa(i)))
|
||||
}
|
||||
}
|
||||
assert.Equal(tt.createCnt, len(testGroups))
|
||||
got, err := repo.ListTargets(context.Background(), tt.args.opt...)
|
||||
if tt.wantErr {
|
||||
require.Error(err)
|
||||
return
|
||||
}
|
||||
require.NoError(err)
|
||||
assert.Equal(tt.wantCnt, len(got))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestRepository_ListRoles_Multiple_Scopes(t *testing.T) {
|
||||
t.Parallel()
|
||||
conn, _ := db.TestSetup(t, "postgres")
|
||||
wrapper := db.TestWrapper(t)
|
||||
testKms := kms.TestKms(t, conn, wrapper)
|
||||
iamRepo := iam.TestRepo(t, conn, wrapper)
|
||||
_, proj1 := iam.TestScopes(t, iamRepo)
|
||||
_, proj2 := iam.TestScopes(t, iamRepo)
|
||||
rw := db.New(conn)
|
||||
repo, err := target.NewRepository(rw, rw, testKms)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.NoError(t, conn.Where("1=1").Delete(tcp.NewTestTarget("")).Error)
|
||||
|
||||
const numPerScope = 10
|
||||
var total int
|
||||
for i := 0; i < numPerScope; i++ {
|
||||
tcp.TestTarget(t, conn, proj1.GetPublicId(), fmt.Sprintf("proj1-%d", i))
|
||||
total++
|
||||
tcp.TestTarget(t, conn, proj2.GetPublicId(), fmt.Sprintf("proj2-%d", i))
|
||||
total++
|
||||
}
|
||||
|
||||
got, err := repo.ListTargets(context.Background(), target.WithScopeIds([]string{"global", proj1.GetPublicId(), proj2.GetPublicId()}))
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, total, len(got))
|
||||
}
|
||||
|
||||
func TestRepository_DeleteTarget(t *testing.T) {
|
||||
t.Parallel()
|
||||
conn, _ := db.TestSetup(t, "postgres")
|
||||
rw := db.New(conn)
|
||||
wrapper := db.TestWrapper(t)
|
||||
testKms := kms.TestKms(t, conn, wrapper)
|
||||
iamRepo := iam.TestRepo(t, conn, wrapper)
|
||||
_, proj := iam.TestScopes(t, iamRepo)
|
||||
repo, err := target.NewRepository(rw, rw, testKms)
|
||||
require.NoError(t, err)
|
||||
|
||||
type args struct {
|
||||
target target.Target
|
||||
opt []target.Option
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
wantRowsDeleted int
|
||||
wantErr bool
|
||||
wantErrMsg string
|
||||
}{
|
||||
{
|
||||
name: "valid",
|
||||
args: args{
|
||||
target: tcp.TestTarget(t, conn, proj.PublicId, "valid"),
|
||||
},
|
||||
wantRowsDeleted: 1,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "no-public-id",
|
||||
args: args{
|
||||
target: func() target.Target {
|
||||
tar, _ := tcp.New(proj.PublicId)
|
||||
return tar
|
||||
}(),
|
||||
},
|
||||
wantRowsDeleted: 0,
|
||||
wantErr: true,
|
||||
wantErrMsg: "target.(Repository).DeleteTarget: missing public id: parameter violation: error #100",
|
||||
},
|
||||
{
|
||||
name: "not-found",
|
||||
args: args{
|
||||
target: func() target.Target {
|
||||
id, err := db.NewPublicId(tcp.TargetPrefix)
|
||||
require.NoError(t, err)
|
||||
tar, _ := tcp.New(proj.PublicId)
|
||||
tar.PublicId = id
|
||||
return tar
|
||||
}(),
|
||||
},
|
||||
wantRowsDeleted: 0,
|
||||
wantErr: true,
|
||||
wantErrMsg: "db.LookupById: record not found, search issue: error #1100",
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
deletedRows, err := repo.DeleteTarget(context.Background(), tt.args.target.GetPublicId(), tt.args.opt...)
|
||||
if tt.wantErr {
|
||||
assert.Error(err)
|
||||
assert.Equal(0, deletedRows)
|
||||
assert.Contains(err.Error(), tt.wantErrMsg)
|
||||
err = db.TestVerifyOplog(t, rw, tt.args.target.GetPublicId(), db.WithOperation(oplog.OpType_OP_TYPE_DELETE), db.WithCreateNotBefore(10*time.Second))
|
||||
assert.Error(err)
|
||||
assert.True(errors.IsNotFoundError(err))
|
||||
return
|
||||
}
|
||||
assert.NoError(err)
|
||||
assert.Equal(tt.wantRowsDeleted, deletedRows)
|
||||
foundGroup, _, _, err := repo.LookupTarget(context.Background(), tt.args.target.GetPublicId())
|
||||
assert.NoError(err)
|
||||
assert.Nil(foundGroup)
|
||||
|
||||
err = db.TestVerifyOplog(t, rw, tt.args.target.GetPublicId(), db.WithOperation(oplog.OpType_OP_TYPE_DELETE), db.WithCreateNotBefore(10*time.Second))
|
||||
assert.NoError(err)
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,306 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.27.1
|
||||
// protoc v3.17.3
|
||||
// source: controller/storage/target/tcp/store/v1/target.proto
|
||||
|
||||
package store
|
||||
|
||||
import (
|
||||
timestamp "github.com/hashicorp/boundary/internal/db/timestamp"
|
||||
_ "github.com/hashicorp/boundary/sdk/pbs/controller/protooptions"
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
)
|
||||
|
||||
const (
|
||||
// Verify that this generated code is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||
)
|
||||
|
||||
type Target struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
// public_id is used to access the tcp.Target via an API
|
||||
// @inject_tag: gorm:"primary_key"
|
||||
PublicId string `protobuf:"bytes,10,opt,name=public_id,json=publicId,proto3" json:"public_id,omitempty" gorm:"primary_key"`
|
||||
// scope id for the tcp.Target
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
ScopeId string `protobuf:"bytes,20,opt,name=scope_id,json=scopeId,proto3" json:"scope_id,omitempty" gorm:"default:null"`
|
||||
// name is the optional friendly name used to
|
||||
// access the tcp.Target via an API
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
Name string `protobuf:"bytes,30,opt,name=name,proto3" json:"name,omitempty" gorm:"default:null"`
|
||||
// description of the tcp.Target
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
Description string `protobuf:"bytes,40,opt,name=description,proto3" json:"description,omitempty" gorm:"default:null"`
|
||||
// create_time from the RDBMS
|
||||
// @inject_tag: `gorm:"default:current_timestamp"`
|
||||
CreateTime *timestamp.Timestamp `protobuf:"bytes,50,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty" gorm:"default:current_timestamp"`
|
||||
// update_time from the RDBMS
|
||||
// @inject_tag: `gorm:"default:current_timestamp"`
|
||||
UpdateTime *timestamp.Timestamp `protobuf:"bytes,60,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty" gorm:"default:current_timestamp"`
|
||||
// version allows optimistic locking of the tcp.Target when modifying the
|
||||
// tcp.Target
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
Version uint32 `protobuf:"varint,70,opt,name=version,proto3" json:"version,omitempty" gorm:"default:null"`
|
||||
// default port of the tcp.Target
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
DefaultPort uint32 `protobuf:"varint,80,opt,name=default_port,json=defaultPort,proto3" json:"default_port,omitempty" gorm:"default:null"`
|
||||
// Maximum total lifetime of a created session, in seconds
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
SessionMaxSeconds uint32 `protobuf:"varint,100,opt,name=session_max_seconds,json=sessionMaxSeconds,proto3" json:"session_max_seconds,omitempty" gorm:"default:null"`
|
||||
// Maximum number of connections in a session
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
SessionConnectionLimit int32 `protobuf:"varint,110,opt,name=session_connection_limit,json=sessionConnectionLimit,proto3" json:"session_connection_limit,omitempty" gorm:"default:null"`
|
||||
// A boolean expression that allows filtering the workers that can handle a session
|
||||
// @inject_tag: `gorm:"default:null"`
|
||||
WorkerFilter string `protobuf:"bytes,120,opt,name=worker_filter,json=workerFilter,proto3" json:"worker_filter,omitempty" gorm:"default:null"`
|
||||
}
|
||||
|
||||
func (x *Target) Reset() {
|
||||
*x = Target{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_controller_storage_target_tcp_store_v1_target_proto_msgTypes[0]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *Target) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*Target) ProtoMessage() {}
|
||||
|
||||
func (x *Target) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_controller_storage_target_tcp_store_v1_target_proto_msgTypes[0]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use Target.ProtoReflect.Descriptor instead.
|
||||
func (*Target) Descriptor() ([]byte, []int) {
|
||||
return file_controller_storage_target_tcp_store_v1_target_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
func (x *Target) GetPublicId() string {
|
||||
if x != nil {
|
||||
return x.PublicId
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *Target) GetScopeId() string {
|
||||
if x != nil {
|
||||
return x.ScopeId
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *Target) GetName() string {
|
||||
if x != nil {
|
||||
return x.Name
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *Target) GetDescription() string {
|
||||
if x != nil {
|
||||
return x.Description
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *Target) GetCreateTime() *timestamp.Timestamp {
|
||||
if x != nil {
|
||||
return x.CreateTime
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *Target) GetUpdateTime() *timestamp.Timestamp {
|
||||
if x != nil {
|
||||
return x.UpdateTime
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *Target) GetVersion() uint32 {
|
||||
if x != nil {
|
||||
return x.Version
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *Target) GetDefaultPort() uint32 {
|
||||
if x != nil {
|
||||
return x.DefaultPort
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *Target) GetSessionMaxSeconds() uint32 {
|
||||
if x != nil {
|
||||
return x.SessionMaxSeconds
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *Target) GetSessionConnectionLimit() int32 {
|
||||
if x != nil {
|
||||
return x.SessionConnectionLimit
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *Target) GetWorkerFilter() string {
|
||||
if x != nil {
|
||||
return x.WorkerFilter
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
var File_controller_storage_target_tcp_store_v1_target_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_controller_storage_target_tcp_store_v1_target_proto_rawDesc = []byte{
|
||||
0x0a, 0x33, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x73, 0x74, 0x6f,
|
||||
0x72, 0x61, 0x67, 0x65, 0x2f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2f, 0x74, 0x63, 0x70, 0x2f,
|
||||
0x73, 0x74, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2e,
|
||||
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x26, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65,
|
||||
0x72, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74,
|
||||
0x2e, 0x74, 0x63, 0x70, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x2f, 0x63,
|
||||
0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67,
|
||||
0x65, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2f, 0x76, 0x31, 0x2f, 0x74,
|
||||
0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2a,
|
||||
0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f,
|
||||
0x6d, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x70, 0x74,
|
||||
0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc3, 0x05, 0x0a, 0x06, 0x54,
|
||||
0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f,
|
||||
0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63,
|
||||
0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x14,
|
||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a,
|
||||
0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x42, 0x10, 0xc2, 0xdd, 0x29,
|
||||
0x0c, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x04, 0x6e,
|
||||
0x61, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
|
||||
0x6f, 0x6e, 0x18, 0x28, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1e, 0xc2, 0xdd, 0x29, 0x1a, 0x0a, 0x0b,
|
||||
0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x64, 0x65, 0x73,
|
||||
0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
|
||||
0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f,
|
||||
0x74, 0x69, 0x6d, 0x65, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x63, 0x6f, 0x6e,
|
||||
0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
|
||||
0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d,
|
||||
0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69,
|
||||
0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d,
|
||||
0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f,
|
||||
0x6c, 0x6c, 0x65, 0x72, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x74, 0x69, 0x6d,
|
||||
0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74,
|
||||
0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12,
|
||||
0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x46, 0x20, 0x01, 0x28, 0x0d,
|
||||
0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x0c, 0x64, 0x65, 0x66,
|
||||
0x61, 0x75, 0x6c, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x50, 0x20, 0x01, 0x28, 0x0d, 0x42,
|
||||
0x2a, 0xc2, 0xdd, 0x29, 0x26, 0x0a, 0x0b, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x6f,
|
||||
0x72, 0x74, 0x12, 0x17, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x64,
|
||||
0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x0b, 0x64, 0x65, 0x66,
|
||||
0x61, 0x75, 0x6c, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x5c, 0x0a, 0x13, 0x73, 0x65, 0x73, 0x73,
|
||||
0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18,
|
||||
0x64, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x2c, 0xc2, 0xdd, 0x29, 0x28, 0x0a, 0x11, 0x53, 0x65, 0x73,
|
||||
0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x13,
|
||||
0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x65, 0x63, 0x6f,
|
||||
0x6e, 0x64, 0x73, 0x52, 0x11, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x53,
|
||||
0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x70, 0x0a, 0x18, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f,
|
||||
0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x69, 0x6d,
|
||||
0x69, 0x74, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x05, 0x42, 0x36, 0xc2, 0xdd, 0x29, 0x32, 0x0a, 0x16,
|
||||
0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f,
|
||||
0x6e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x18, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f,
|
||||
0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74,
|
||||
0x52, 0x16, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74,
|
||||
0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x46, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b,
|
||||
0x65, 0x72, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x78, 0x20, 0x01, 0x28, 0x09, 0x42,
|
||||
0x21, 0xc2, 0xdd, 0x29, 0x1d, 0x0a, 0x0c, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x46, 0x69, 0x6c,
|
||||
0x74, 0x65, 0x72, 0x12, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x69, 0x6c, 0x74,
|
||||
0x65, 0x72, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72,
|
||||
0x42, 0x3f, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68,
|
||||
0x61, 0x73, 0x68, 0x69, 0x63, 0x6f, 0x72, 0x70, 0x2f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72,
|
||||
0x79, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x61, 0x72, 0x67, 0x65,
|
||||
0x74, 0x2f, 0x74, 0x63, 0x70, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x3b, 0x73, 0x74, 0x6f, 0x72,
|
||||
0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
file_controller_storage_target_tcp_store_v1_target_proto_rawDescOnce sync.Once
|
||||
file_controller_storage_target_tcp_store_v1_target_proto_rawDescData = file_controller_storage_target_tcp_store_v1_target_proto_rawDesc
|
||||
)
|
||||
|
||||
func file_controller_storage_target_tcp_store_v1_target_proto_rawDescGZIP() []byte {
|
||||
file_controller_storage_target_tcp_store_v1_target_proto_rawDescOnce.Do(func() {
|
||||
file_controller_storage_target_tcp_store_v1_target_proto_rawDescData = protoimpl.X.CompressGZIP(file_controller_storage_target_tcp_store_v1_target_proto_rawDescData)
|
||||
})
|
||||
return file_controller_storage_target_tcp_store_v1_target_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_controller_storage_target_tcp_store_v1_target_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
|
||||
var file_controller_storage_target_tcp_store_v1_target_proto_goTypes = []interface{}{
|
||||
(*Target)(nil), // 0: controller.storage.target.tcp.store.v1.Target
|
||||
(*timestamp.Timestamp)(nil), // 1: controller.storage.timestamp.v1.Timestamp
|
||||
}
|
||||
var file_controller_storage_target_tcp_store_v1_target_proto_depIdxs = []int32{
|
||||
1, // 0: controller.storage.target.tcp.store.v1.Target.create_time:type_name -> controller.storage.timestamp.v1.Timestamp
|
||||
1, // 1: controller.storage.target.tcp.store.v1.Target.update_time:type_name -> controller.storage.timestamp.v1.Timestamp
|
||||
2, // [2:2] is the sub-list for method output_type
|
||||
2, // [2:2] is the sub-list for method input_type
|
||||
2, // [2:2] is the sub-list for extension type_name
|
||||
2, // [2:2] is the sub-list for extension extendee
|
||||
0, // [0:2] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_controller_storage_target_tcp_store_v1_target_proto_init() }
|
||||
func file_controller_storage_target_tcp_store_v1_target_proto_init() {
|
||||
if File_controller_storage_target_tcp_store_v1_target_proto != nil {
|
||||
return
|
||||
}
|
||||
if !protoimpl.UnsafeEnabled {
|
||||
file_controller_storage_target_tcp_store_v1_target_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*Target); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
type x struct{}
|
||||
out := protoimpl.TypeBuilder{
|
||||
File: protoimpl.DescBuilder{
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_controller_storage_target_tcp_store_v1_target_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 1,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
GoTypes: file_controller_storage_target_tcp_store_v1_target_proto_goTypes,
|
||||
DependencyIndexes: file_controller_storage_target_tcp_store_v1_target_proto_depIdxs,
|
||||
MessageInfos: file_controller_storage_target_tcp_store_v1_target_proto_msgTypes,
|
||||
}.Build()
|
||||
File_controller_storage_target_tcp_store_v1_target_proto = out.File
|
||||
file_controller_storage_target_tcp_store_v1_target_proto_rawDesc = nil
|
||||
file_controller_storage_target_tcp_store_v1_target_proto_goTypes = nil
|
||||
file_controller_storage_target_tcp_store_v1_target_proto_depIdxs = nil
|
||||
}
|
||||
@@ -0,0 +1,173 @@
|
||||
// Package tcp provides a Target subtype for a TCP Target.
|
||||
// Importing this package will register it with the target package and
|
||||
// allow the target.Repository to support tcp.Targets.
|
||||
package tcp
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/hashicorp/boundary/internal/db"
|
||||
"github.com/hashicorp/boundary/internal/db/timestamp"
|
||||
"github.com/hashicorp/boundary/internal/errors"
|
||||
"github.com/hashicorp/boundary/internal/oplog"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
"github.com/hashicorp/boundary/internal/target/tcp/store"
|
||||
"github.com/hashicorp/boundary/internal/types/subtypes"
|
||||
"google.golang.org/protobuf/proto"
|
||||
)
|
||||
|
||||
const (
|
||||
defaultTableName = "target_tcp"
|
||||
Subtype = subtypes.Subtype("tcp")
|
||||
)
|
||||
|
||||
// Target is a resources that represets a networked service
|
||||
// that can be accessed via TCP. It is a subtype of target.Target.
|
||||
type Target struct {
|
||||
*store.Target
|
||||
tableName string `gorm:"-"`
|
||||
}
|
||||
|
||||
// Ensure Target implements interfaces
|
||||
var (
|
||||
_ target.Target = (*Target)(nil)
|
||||
_ db.VetForWriter = (*Target)(nil)
|
||||
_ oplog.ReplayableMessage = (*Target)(nil)
|
||||
)
|
||||
|
||||
// New creates a new in memory tcp target. WithName, WithDescription and
|
||||
// WithDefaultPort options are supported
|
||||
func New(scopeId string, opt ...target.Option) (*Target, error) {
|
||||
const op = "tcp.NewTarget"
|
||||
opts := target.GetOpts(opt...)
|
||||
if scopeId == "" {
|
||||
return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing scope id")
|
||||
}
|
||||
t := &Target{
|
||||
Target: &store.Target{
|
||||
ScopeId: scopeId,
|
||||
Name: opts.WithName,
|
||||
Description: opts.WithDescription,
|
||||
DefaultPort: opts.WithDefaultPort,
|
||||
SessionConnectionLimit: opts.WithSessionConnectionLimit,
|
||||
SessionMaxSeconds: opts.WithSessionMaxSeconds,
|
||||
WorkerFilter: opts.WithWorkerFilter,
|
||||
},
|
||||
}
|
||||
return t, nil
|
||||
}
|
||||
|
||||
// allocTarget will allocate a tcp target
|
||||
func allocTarget() target.Target {
|
||||
return &Target{
|
||||
Target: &store.Target{},
|
||||
}
|
||||
}
|
||||
|
||||
// Clone creates a clone of the Target
|
||||
func (t *Target) Clone() target.Target {
|
||||
cp := proto.Clone(t.Target)
|
||||
return &Target{
|
||||
Target: cp.(*store.Target),
|
||||
}
|
||||
}
|
||||
|
||||
// VetForWrite implements db.VetForWrite() interface and validates the tcp target
|
||||
// before it's written.
|
||||
func (t *Target) VetForWrite(ctx context.Context, _ db.Reader, opType db.OpType, _ ...db.Option) error {
|
||||
const op = "tcp.(Target).VetForWrite"
|
||||
if t.PublicId == "" {
|
||||
return errors.New(ctx, errors.InvalidParameter, op, "missing public id")
|
||||
}
|
||||
if opType == db.CreateOp {
|
||||
if t.ScopeId == "" {
|
||||
return errors.New(ctx, errors.InvalidParameter, op, "missing scope id")
|
||||
}
|
||||
if t.Name == "" {
|
||||
return errors.New(ctx, errors.InvalidParameter, op, "missing name")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// TableName returns the tablename to override the default gorm table name
|
||||
func (t *Target) TableName() string {
|
||||
if t.tableName != "" {
|
||||
return t.tableName
|
||||
}
|
||||
return defaultTableName
|
||||
}
|
||||
|
||||
// SetTableName sets the tablename and satisfies the ReplayableMessage
|
||||
// interface. If the caller attempts to set the name to "" the name will be
|
||||
// reset to the default name.
|
||||
func (t *Target) SetTableName(n string) {
|
||||
t.tableName = n
|
||||
}
|
||||
|
||||
// Oplog provides the oplog.Metadata for recording operations taken on a Target.
|
||||
func (t *Target) Oplog(op oplog.OpType) oplog.Metadata {
|
||||
metadata := oplog.Metadata{
|
||||
"resource-public-id": []string{t.PublicId},
|
||||
"resource-type": []string{"tcp target"},
|
||||
"op-type": []string{op.String()},
|
||||
"scope-id": []string{t.ScopeId},
|
||||
}
|
||||
return metadata
|
||||
}
|
||||
|
||||
func (t *Target) GetType() subtypes.Subtype {
|
||||
return Subtype
|
||||
}
|
||||
|
||||
func (t *Target) SetPublicId(ctx context.Context, publicId string) error {
|
||||
const op = "tcp.(Target).SetPublicId"
|
||||
if !strings.HasPrefix(publicId, TargetPrefix+"_") {
|
||||
return errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("passed-in public ID %q has wrong prefix, should be %q", publicId, TargetPrefix))
|
||||
}
|
||||
|
||||
t.PublicId = publicId
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *Target) SetScopeId(scopeId string) {
|
||||
t.ScopeId = scopeId
|
||||
}
|
||||
|
||||
func (t *Target) SetName(name string) {
|
||||
t.Name = name
|
||||
}
|
||||
|
||||
func (t *Target) SetDescription(description string) {
|
||||
t.Description = description
|
||||
}
|
||||
|
||||
func (t *Target) SetVersion(v uint32) {
|
||||
t.Version = v
|
||||
}
|
||||
|
||||
func (t *Target) SetDefaultPort(port uint32) {
|
||||
t.DefaultPort = port
|
||||
}
|
||||
|
||||
func (t *Target) SetCreateTime(ts *timestamp.Timestamp) {
|
||||
t.CreateTime = ts
|
||||
}
|
||||
|
||||
func (t *Target) SetUpdateTime(ts *timestamp.Timestamp) {
|
||||
t.UpdateTime = ts
|
||||
}
|
||||
|
||||
func (t *Target) SetSessionMaxSeconds(s uint32) {
|
||||
t.SessionMaxSeconds = s
|
||||
}
|
||||
|
||||
func (t *Target) SetSessionConnectionLimit(limit int32) {
|
||||
t.SessionConnectionLimit = limit
|
||||
}
|
||||
|
||||
func (t *Target) SetWorkerFilter(filter string) {
|
||||
t.WorkerFilter = filter
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package target
|
||||
package tcp_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
@@ -10,24 +10,26 @@ import (
|
||||
"github.com/hashicorp/boundary/internal/errors"
|
||||
"github.com/hashicorp/boundary/internal/iam"
|
||||
"github.com/hashicorp/boundary/internal/oplog"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
"github.com/hashicorp/boundary/internal/target/tcp"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"google.golang.org/protobuf/proto"
|
||||
)
|
||||
|
||||
func TestTcpTarget_Create(t *testing.T) {
|
||||
func TestTarget_Create(t *testing.T) {
|
||||
t.Parallel()
|
||||
conn, _ := db.TestSetup(t, "postgres")
|
||||
wrapper := db.TestWrapper(t)
|
||||
_, prj := iam.TestScopes(t, iam.TestRepo(t, conn, wrapper))
|
||||
type args struct {
|
||||
scopeId string
|
||||
opt []Option
|
||||
opt []target.Option
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
want *TcpTarget
|
||||
want *tcp.Target
|
||||
wantErr bool
|
||||
wantIsErr errors.Code
|
||||
create bool
|
||||
@@ -43,15 +45,16 @@ func TestTcpTarget_Create(t *testing.T) {
|
||||
name: "valid-proj-scope",
|
||||
args: args{
|
||||
scopeId: prj.PublicId,
|
||||
opt: []Option{WithName("valid-proj-scope")},
|
||||
opt: []target.Option{target.WithName("valid-proj-scope")},
|
||||
},
|
||||
want: func() *TcpTarget {
|
||||
t := allocTcpTarget()
|
||||
t.ScopeId = prj.PublicId
|
||||
t.Name = "valid-proj-scope"
|
||||
t.SessionMaxSeconds = uint32((8 * time.Hour).Seconds())
|
||||
t.SessionConnectionLimit = 1
|
||||
return &t
|
||||
want: func() *tcp.Target {
|
||||
t, _ := tcp.New(
|
||||
prj.PublicId,
|
||||
target.WithName("valid-proj-scope"),
|
||||
target.WithSessionMaxSeconds(uint32((8 * time.Hour).Seconds())),
|
||||
target.WithSessionConnectionLimit(1),
|
||||
)
|
||||
return t
|
||||
}(),
|
||||
create: true,
|
||||
},
|
||||
@@ -59,7 +62,7 @@ func TestTcpTarget_Create(t *testing.T) {
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
got, err := NewTcpTarget(tt.args.scopeId, tt.args.opt...)
|
||||
got, err := tcp.New(tt.args.scopeId, tt.args.opt...)
|
||||
if tt.wantErr {
|
||||
require.Error(err)
|
||||
assert.True(errors.Match(errors.T(tt.wantIsErr), err))
|
||||
@@ -68,22 +71,22 @@ func TestTcpTarget_Create(t *testing.T) {
|
||||
require.NoError(err)
|
||||
assert.Equal(tt.want, got)
|
||||
if tt.create {
|
||||
id, err := newTcpTargetId()
|
||||
id, err := db.NewPublicId(tcp.TargetPrefix)
|
||||
require.NoError(err)
|
||||
got.PublicId = id
|
||||
err = db.New(conn).Create(context.Background(), got)
|
||||
if tt.wantCreateErr {
|
||||
assert.Error(err)
|
||||
return
|
||||
} else {
|
||||
assert.NoError(err)
|
||||
}
|
||||
|
||||
assert.NoError(err)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestTcpTarget_Delete(t *testing.T) {
|
||||
func TestTarget_Delete(t *testing.T) {
|
||||
t.Parallel()
|
||||
conn, _ := db.TestSetup(t, "postgres")
|
||||
rw := db.New(conn)
|
||||
@@ -92,27 +95,27 @@ func TestTcpTarget_Delete(t *testing.T) {
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
target *TcpTarget
|
||||
target *tcp.Target
|
||||
wantRowsDeleted int
|
||||
wantErr bool
|
||||
wantErrMsg string
|
||||
}{
|
||||
{
|
||||
name: "valid",
|
||||
target: TestTcpTarget(t, conn, proj.PublicId, testTargetName(t, proj.PublicId)),
|
||||
target: tcp.TestTarget(t, conn, proj.PublicId, tcp.TestTargetName(t, proj.PublicId)),
|
||||
wantErr: false,
|
||||
wantRowsDeleted: 1,
|
||||
},
|
||||
{
|
||||
name: "bad-id",
|
||||
target: func() *TcpTarget {
|
||||
target := allocTcpTarget()
|
||||
id, err := newTcpTargetId()
|
||||
target: func() *tcp.Target {
|
||||
tar, _ := tcp.New(proj.PublicId)
|
||||
|
||||
id, err := db.NewPublicId(tcp.TargetPrefix)
|
||||
require.NoError(t, err)
|
||||
target.PublicId = id
|
||||
target.ScopeId = proj.PublicId
|
||||
target.Name = testTargetName(t, proj.PublicId)
|
||||
return &target
|
||||
tar.PublicId = id
|
||||
tar.Name = tcp.TestTargetName(t, proj.PublicId)
|
||||
return tar
|
||||
}(),
|
||||
wantErr: false,
|
||||
wantRowsDeleted: 0,
|
||||
@@ -121,9 +124,9 @@ func TestTcpTarget_Delete(t *testing.T) {
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
deleteTarget := allocTcpTarget()
|
||||
deleteTarget := tcp.NewTestTarget("")
|
||||
deleteTarget.PublicId = tt.target.PublicId
|
||||
deletedRows, err := rw.Delete(context.Background(), &deleteTarget)
|
||||
deletedRows, err := rw.Delete(context.Background(), deleteTarget)
|
||||
if tt.wantErr {
|
||||
require.Error(err)
|
||||
return
|
||||
@@ -134,18 +137,18 @@ func TestTcpTarget_Delete(t *testing.T) {
|
||||
return
|
||||
}
|
||||
assert.Equal(tt.wantRowsDeleted, deletedRows)
|
||||
foundTarget := allocTcpTarget()
|
||||
foundTarget := tcp.NewTestTarget("")
|
||||
foundTarget.PublicId = tt.target.PublicId
|
||||
err = rw.LookupById(context.Background(), &foundTarget)
|
||||
err = rw.LookupById(context.Background(), foundTarget)
|
||||
require.Error(err)
|
||||
assert.True(errors.IsNotFoundError(err))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestTcpTarget_Update(t *testing.T) {
|
||||
func TestTarget_Update(t *testing.T) {
|
||||
t.Parallel()
|
||||
id := testId(t)
|
||||
id := tcp.TestId(t)
|
||||
ctx := context.Background()
|
||||
conn, _ := db.TestSetup(t, "postgres")
|
||||
rw := db.New(conn)
|
||||
@@ -246,37 +249,36 @@ func TestTcpTarget_Update(t *testing.T) {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
if tt.wantDup {
|
||||
target := TestTcpTarget(t, conn, proj.PublicId, testTargetName(t, proj.PublicId))
|
||||
target := tcp.TestTarget(t, conn, proj.PublicId, tcp.TestTargetName(t, proj.PublicId))
|
||||
target.Name = tt.args.name
|
||||
_, err := rw.Update(context.Background(), target, tt.args.fieldMaskPaths, tt.args.nullPaths)
|
||||
require.NoError(err)
|
||||
}
|
||||
|
||||
id := testId(t)
|
||||
target := TestTcpTarget(t, conn, proj.PublicId, id, WithDescription(id))
|
||||
id := tcp.TestId(t)
|
||||
tar := tcp.TestTarget(t, conn, proj.PublicId, id, target.WithDescription(id))
|
||||
|
||||
updateTarget := allocTcpTarget()
|
||||
updateTarget.PublicId = target.PublicId
|
||||
updateTarget.ScopeId = tt.args.ScopeId
|
||||
updateTarget := tcp.NewTestTarget(tt.args.ScopeId)
|
||||
updateTarget.PublicId = tar.PublicId
|
||||
updateTarget.Name = tt.args.name
|
||||
updateTarget.Description = tt.args.description
|
||||
|
||||
updatedRows, err := rw.Update(context.Background(), &updateTarget, tt.args.fieldMaskPaths, tt.args.nullPaths)
|
||||
updatedRows, err := rw.Update(context.Background(), updateTarget, tt.args.fieldMaskPaths, tt.args.nullPaths)
|
||||
if tt.wantErr {
|
||||
require.Error(err)
|
||||
assert.Equal(0, updatedRows)
|
||||
assert.Equal(tt.wantErrMsg, err.Error())
|
||||
err = db.TestVerifyOplog(t, rw, target.PublicId, db.WithOperation(oplog.OpType_OP_TYPE_UPDATE), db.WithCreateNotBefore(10*time.Second))
|
||||
err = db.TestVerifyOplog(t, rw, tar.PublicId, db.WithOperation(oplog.OpType_OP_TYPE_UPDATE), db.WithCreateNotBefore(10*time.Second))
|
||||
require.Error(err)
|
||||
assert.Contains(err.Error(), "record not found")
|
||||
return
|
||||
}
|
||||
require.NoError(err)
|
||||
assert.Equal(tt.wantRowsUpdate, updatedRows)
|
||||
assert.NotEqual(target.UpdateTime, updateTarget.UpdateTime)
|
||||
foundTarget := allocTcpTarget()
|
||||
foundTarget.PublicId = target.GetPublicId()
|
||||
err = rw.LookupByPublicId(context.Background(), &foundTarget)
|
||||
assert.NotEqual(tar.UpdateTime, updateTarget.UpdateTime)
|
||||
foundTarget := tcp.NewTestTarget(tt.args.ScopeId)
|
||||
foundTarget.PublicId = tar.GetPublicId()
|
||||
err = rw.LookupByPublicId(context.Background(), foundTarget)
|
||||
require.NoError(err)
|
||||
assert.True(proto.Equal(updateTarget, foundTarget))
|
||||
if len(tt.args.nullPaths) != 0 {
|
||||
@@ -291,49 +293,49 @@ func TestTcpTarget_Update(t *testing.T) {
|
||||
}
|
||||
t.Run("update dup names in diff scopes", func(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
id := testId(t)
|
||||
id := tcp.TestId(t)
|
||||
_, proj2 := iam.TestScopes(t, iam.TestRepo(t, conn, wrapper))
|
||||
_ = TestTcpTarget(t, conn, proj2.PublicId, id, WithDescription(id))
|
||||
projTarget := TestTcpTarget(t, conn, proj.PublicId, id)
|
||||
_ = tcp.TestTarget(t, conn, proj2.PublicId, id, target.WithDescription(id))
|
||||
projTarget := tcp.TestTarget(t, conn, proj.PublicId, id)
|
||||
projTarget.Name = id
|
||||
updatedRows, err := rw.Update(context.Background(), projTarget, []string{"Name"}, nil)
|
||||
require.NoError(err)
|
||||
assert.Equal(1, updatedRows)
|
||||
|
||||
foundTarget := allocTcpTarget()
|
||||
foundTarget, _ := tcp.New(proj2.PublicId)
|
||||
foundTarget.PublicId = projTarget.GetPublicId()
|
||||
err = rw.LookupByPublicId(context.Background(), &foundTarget)
|
||||
err = rw.LookupByPublicId(context.Background(), foundTarget)
|
||||
require.NoError(err)
|
||||
assert.Equal(id, projTarget.Name)
|
||||
})
|
||||
}
|
||||
|
||||
func TestTcpTarget_Clone(t *testing.T) {
|
||||
func TestTarget_Clone(t *testing.T) {
|
||||
t.Parallel()
|
||||
conn, _ := db.TestSetup(t, "postgres")
|
||||
wrapper := db.TestWrapper(t)
|
||||
t.Run("valid", func(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
_, proj := iam.TestScopes(t, iam.TestRepo(t, conn, wrapper))
|
||||
target := TestTcpTarget(t, conn, proj.PublicId, testTargetName(t, proj.PublicId))
|
||||
cp := target.Clone()
|
||||
assert.True(proto.Equal(cp.(*TcpTarget).TcpTarget, target.TcpTarget))
|
||||
tar := tcp.TestTarget(t, conn, proj.PublicId, tcp.TestTargetName(t, proj.PublicId))
|
||||
cp := tar.Clone()
|
||||
assert.True(proto.Equal(cp.(*tcp.Target).Target, tar.Target))
|
||||
})
|
||||
t.Run("not-equal", func(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
_, proj := iam.TestScopes(t, iam.TestRepo(t, conn, wrapper))
|
||||
_, proj2 := iam.TestScopes(t, iam.TestRepo(t, conn, wrapper))
|
||||
target := TestTcpTarget(t, conn, proj.PublicId, testTargetName(t, proj.PublicId))
|
||||
target2 := TestTcpTarget(t, conn, proj2.PublicId, testTargetName(t, proj2.PublicId))
|
||||
target1 := tcp.TestTarget(t, conn, proj.PublicId, tcp.TestTargetName(t, proj.PublicId))
|
||||
target2 := tcp.TestTarget(t, conn, proj2.PublicId, tcp.TestTargetName(t, proj2.PublicId))
|
||||
|
||||
cp := target.Clone()
|
||||
assert.True(!proto.Equal(cp.(*TcpTarget).TcpTarget, target2.TcpTarget))
|
||||
cp := target1.Clone()
|
||||
assert.True(!proto.Equal(cp.(*tcp.Target).Target, target2.Target))
|
||||
})
|
||||
}
|
||||
|
||||
func TestTcpTable_SetTableName(t *testing.T) {
|
||||
func TestTable_SetTableName(t *testing.T) {
|
||||
t.Parallel()
|
||||
defaultTableName := DefaultTcpTableName
|
||||
defaultTableName := tcp.DefaultTableName
|
||||
tests := []struct {
|
||||
name string
|
||||
setNameTo string
|
||||
@@ -353,30 +355,29 @@ func TestTcpTable_SetTableName(t *testing.T) {
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
def := allocTcpTarget()
|
||||
def, _ := tcp.New("testScope")
|
||||
require.Equal(defaultTableName, def.TableName())
|
||||
s := allocTcpTarget()
|
||||
s, _ := tcp.New("testScope")
|
||||
s.SetTableName(tt.setNameTo)
|
||||
assert.Equal(tt.want, s.TableName())
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestTcpTarget_oplog(t *testing.T) {
|
||||
id := testId(t)
|
||||
func TestTarget_oplog(t *testing.T) {
|
||||
id := tcp.TestId(t)
|
||||
tests := []struct {
|
||||
name string
|
||||
target *TcpTarget
|
||||
target *tcp.Target
|
||||
op oplog.OpType
|
||||
want oplog.Metadata
|
||||
}{
|
||||
{
|
||||
name: "simple",
|
||||
target: func() *TcpTarget {
|
||||
t := allocTcpTarget()
|
||||
target: func() *tcp.Target {
|
||||
t, _ := tcp.New(id)
|
||||
t.PublicId = id
|
||||
t.ScopeId = id
|
||||
return &t
|
||||
return t
|
||||
}(),
|
||||
op: oplog.OpType_OP_TYPE_CREATE,
|
||||
want: oplog.Metadata{
|
||||
@@ -390,7 +391,7 @@ func TestTcpTarget_oplog(t *testing.T) {
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
got := tt.target.oplog(tt.op)
|
||||
got := tt.target.Oplog(tt.op)
|
||||
assert.Equal(got, tt.want)
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
package tcp
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/boundary/internal/db"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
"github.com/hashicorp/go-uuid"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
// TestTarget is used to create a Target that can be used by tests in other packages.
|
||||
func TestTarget(t *testing.T, conn *db.DB, scopeId, name string, opt ...target.Option) *Target {
|
||||
t.Helper()
|
||||
opt = append(opt, target.WithName(name))
|
||||
opts := target.GetOpts(opt...)
|
||||
require := require.New(t)
|
||||
rw := db.New(conn)
|
||||
tar, err := New(scopeId, opt...)
|
||||
require.NoError(err)
|
||||
id, err := db.NewPublicId(TargetPrefix)
|
||||
require.NoError(err)
|
||||
tar.PublicId = id
|
||||
err = rw.Create(context.Background(), tar)
|
||||
require.NoError(err)
|
||||
|
||||
if len(opts.WithHostSources) > 0 {
|
||||
newHostSets := make([]interface{}, 0, len(opts.WithHostSources))
|
||||
for _, s := range opts.WithHostSources {
|
||||
hostSet, err := target.NewTargetHostSet(tar.PublicId, s)
|
||||
require.NoError(err)
|
||||
newHostSets = append(newHostSets, hostSet)
|
||||
}
|
||||
err := rw.CreateItems(context.Background(), newHostSets)
|
||||
require.NoError(err)
|
||||
}
|
||||
if len(opts.WithCredentialSources) > 0 {
|
||||
newCredLibs := make([]interface{}, 0, len(opts.WithCredentialSources))
|
||||
for _, cl := range opts.WithCredentialSources {
|
||||
newCl, err := target.NewCredentialLibrary(tar.PublicId, cl)
|
||||
require.NoError(err)
|
||||
newCredLibs = append(newCredLibs, newCl)
|
||||
}
|
||||
err := rw.CreateItems(context.Background(), newCredLibs)
|
||||
require.NoError(err)
|
||||
}
|
||||
return tar
|
||||
}
|
||||
|
||||
func testTargetName(t *testing.T, scopeId string) string {
|
||||
t.Helper()
|
||||
return fmt.Sprintf("%s-%s", scopeId, testId(t))
|
||||
}
|
||||
|
||||
func testId(t *testing.T) string {
|
||||
t.Helper()
|
||||
id, err := uuid.GenerateUUID()
|
||||
require.NoError(t, err)
|
||||
return id
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package target
|
||||
package tcp_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
@@ -8,6 +8,9 @@ import (
|
||||
"github.com/hashicorp/boundary/internal/db"
|
||||
"github.com/hashicorp/boundary/internal/host/static"
|
||||
"github.com/hashicorp/boundary/internal/iam"
|
||||
"github.com/hashicorp/boundary/internal/kms"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
"github.com/hashicorp/boundary/internal/target/tcp"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
@@ -15,22 +18,27 @@ import (
|
||||
func Test_TestTcpTarget(t *testing.T) {
|
||||
require := require.New(t)
|
||||
conn, _ := db.TestSetup(t, "postgres")
|
||||
rw := db.New(conn)
|
||||
wrapper := db.TestWrapper(t)
|
||||
_, proj := iam.TestScopes(t, iam.TestRepo(t, conn, wrapper))
|
||||
testKms := kms.TestKms(t, conn, wrapper)
|
||||
iamRepo := iam.TestRepo(t, conn, wrapper)
|
||||
_, proj := iam.TestScopes(t, iamRepo)
|
||||
repo, err := target.NewRepository(rw, rw, testKms)
|
||||
require.NoError(err)
|
||||
|
||||
cats := static.TestCatalogs(t, conn, proj.PublicId, 1)
|
||||
hsets := static.TestSets(t, conn, cats[0].GetPublicId(), 2)
|
||||
var sets []string
|
||||
for _, s := range hsets {
|
||||
sets = append(sets, s.PublicId)
|
||||
}
|
||||
name := testTargetName(t, proj.PublicId)
|
||||
target := TestTcpTarget(t, conn, proj.PublicId, name, WithHostSources(sets))
|
||||
name := tcp.TestTargetName(t, proj.PublicId)
|
||||
tar := tcp.TestTarget(t, conn, proj.PublicId, name, target.WithHostSources(sets))
|
||||
require.NotNil(t)
|
||||
require.NotEmpty(target.PublicId)
|
||||
require.Equal(name, target.Name)
|
||||
require.NotEmpty(tar.PublicId)
|
||||
require.Equal(name, tar.Name)
|
||||
|
||||
rw := db.New(conn)
|
||||
foundSources, err := fetchHostSources(context.Background(), rw, target.PublicId)
|
||||
_, foundSources, _, err := repo.LookupTarget(context.Background(), tar.PublicId)
|
||||
require.NoError(err)
|
||||
foundIds := make([]string, 0, len(foundSources))
|
||||
for _, s := range foundSources {
|
||||
@@ -42,25 +50,29 @@ func Test_TestTcpTarget(t *testing.T) {
|
||||
func Test_TestCredentialLibrary(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
conn, _ := db.TestSetup(t, "postgres")
|
||||
rw := db.New(conn)
|
||||
wrapper := db.TestWrapper(t)
|
||||
_, proj := iam.TestScopes(t, iam.TestRepo(t, conn, wrapper))
|
||||
testKms := kms.TestKms(t, conn, wrapper)
|
||||
iamRepo := iam.TestRepo(t, conn, wrapper)
|
||||
_, proj := iam.TestScopes(t, iamRepo)
|
||||
repo, err := target.NewRepository(rw, rw, testKms)
|
||||
require.NoError(err)
|
||||
|
||||
target := TestTcpTarget(t, conn, proj.PublicId, t.Name())
|
||||
tar := tcp.TestTarget(t, conn, proj.PublicId, t.Name())
|
||||
store := vault.TestCredentialStores(t, conn, wrapper, proj.GetPublicId(), 1)[0]
|
||||
vlibs := vault.TestCredentialLibraries(t, conn, wrapper, store.GetPublicId(), 2)
|
||||
var libIds []string
|
||||
var libs []*CredentialLibrary
|
||||
var libs []*target.CredentialLibrary
|
||||
for _, v := range vlibs {
|
||||
libIds = append(libIds, v.GetPublicId())
|
||||
lib := TestCredentialLibrary(t, conn, target.GetPublicId(), v.GetPublicId())
|
||||
lib := target.TestCredentialLibrary(t, conn, tar.GetPublicId(), v.GetPublicId())
|
||||
require.NotNil(lib)
|
||||
libs = append(libs, lib)
|
||||
}
|
||||
|
||||
assert.Len(libs, 2)
|
||||
|
||||
rw := db.New(conn)
|
||||
foundSources, err := fetchCredentialSources(context.Background(), rw, target.PublicId)
|
||||
_, _, foundSources, err := repo.LookupTarget(context.Background(), tar.PublicId)
|
||||
require.NoError(err)
|
||||
foundIds := make([]string, 0, len(foundSources))
|
||||
for _, s := range foundSources {
|
||||
@@ -1,110 +0,0 @@
|
||||
package target
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/hashicorp/boundary/internal/db"
|
||||
"github.com/hashicorp/boundary/internal/errors"
|
||||
"github.com/hashicorp/boundary/internal/oplog"
|
||||
"github.com/hashicorp/boundary/internal/target/store"
|
||||
"google.golang.org/protobuf/proto"
|
||||
)
|
||||
|
||||
const (
|
||||
DefaultTcpTableName = "target_tcp"
|
||||
)
|
||||
|
||||
type TcpTarget struct {
|
||||
*store.TcpTarget
|
||||
tableName string `gorm:"-"`
|
||||
}
|
||||
|
||||
var (
|
||||
_ Target = (*TcpTarget)(nil)
|
||||
_ db.VetForWriter = (*TcpTarget)(nil)
|
||||
_ oplog.ReplayableMessage = (*TcpTarget)(nil)
|
||||
)
|
||||
|
||||
// NewTcpTarget creates a new in memory tcp target. WithName, WithDescription and
|
||||
// WithDefaultPort options are supported
|
||||
func NewTcpTarget(scopeId string, opt ...Option) (*TcpTarget, error) {
|
||||
const op = "target.NewTcpTarget"
|
||||
opts := getOpts(opt...)
|
||||
if scopeId == "" {
|
||||
return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing scope id")
|
||||
}
|
||||
t := &TcpTarget{
|
||||
TcpTarget: &store.TcpTarget{
|
||||
ScopeId: scopeId,
|
||||
Name: opts.withName,
|
||||
Description: opts.withDescription,
|
||||
DefaultPort: opts.withDefaultPort,
|
||||
SessionConnectionLimit: opts.withSessionConnectionLimit,
|
||||
SessionMaxSeconds: opts.withSessionMaxSeconds,
|
||||
WorkerFilter: opts.withWorkerFilter,
|
||||
},
|
||||
}
|
||||
return t, nil
|
||||
}
|
||||
|
||||
// allocTcpTarget will allocate a tcp target
|
||||
func allocTcpTarget() TcpTarget {
|
||||
return TcpTarget{
|
||||
TcpTarget: &store.TcpTarget{},
|
||||
}
|
||||
}
|
||||
|
||||
// Clone creates a clone of the TcpTarget
|
||||
func (t *TcpTarget) Clone() interface{} {
|
||||
cp := proto.Clone(t.TcpTarget)
|
||||
return &TcpTarget{
|
||||
TcpTarget: cp.(*store.TcpTarget),
|
||||
}
|
||||
}
|
||||
|
||||
// VetForWrite implements db.VetForWrite() interface and validates the tcp target
|
||||
// before it's written.
|
||||
func (t *TcpTarget) VetForWrite(ctx context.Context, _ db.Reader, opType db.OpType, _ ...db.Option) error {
|
||||
const op = "target.(TcpTarget).VetForWrite"
|
||||
if t.PublicId == "" {
|
||||
return errors.New(ctx, errors.InvalidParameter, op, "missing public id")
|
||||
}
|
||||
if opType == db.CreateOp {
|
||||
if t.ScopeId == "" {
|
||||
return errors.New(ctx, errors.InvalidParameter, op, "missing scope id")
|
||||
}
|
||||
if t.Name == "" {
|
||||
return errors.New(ctx, errors.InvalidParameter, op, "missing name")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// TableName returns the tablename to override the default gorm table name
|
||||
func (t *TcpTarget) TableName() string {
|
||||
if t.tableName != "" {
|
||||
return t.tableName
|
||||
}
|
||||
return DefaultTcpTableName
|
||||
}
|
||||
|
||||
// SetTableName sets the tablename and satisfies the ReplayableMessage
|
||||
// interface. If the caller attempts to set the name to "" the name will be
|
||||
// reset to the default name.
|
||||
func (t *TcpTarget) SetTableName(n string) {
|
||||
t.tableName = n
|
||||
}
|
||||
|
||||
func (t *TcpTarget) oplog(op oplog.OpType) oplog.Metadata {
|
||||
metadata := oplog.Metadata{
|
||||
"resource-public-id": []string{t.PublicId},
|
||||
"resource-type": []string{"tcp target"},
|
||||
"op-type": []string{op.String()},
|
||||
"scope-id": []string{t.ScopeId},
|
||||
}
|
||||
return metadata
|
||||
}
|
||||
|
||||
func (t TcpTarget) GetType() string {
|
||||
return "tcp"
|
||||
}
|
||||
@@ -2,63 +2,12 @@ package target
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/boundary/internal/db"
|
||||
"github.com/hashicorp/go-uuid"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestTcpTarget(t *testing.T, conn *db.DB, scopeId, name string, opt ...Option) *TcpTarget {
|
||||
t.Helper()
|
||||
opt = append(opt, WithName(name))
|
||||
opts := getOpts(opt...)
|
||||
require := require.New(t)
|
||||
rw := db.New(conn)
|
||||
target, err := NewTcpTarget(scopeId, opt...)
|
||||
require.NoError(err)
|
||||
id, err := newTcpTargetId()
|
||||
require.NoError(err)
|
||||
target.PublicId = id
|
||||
err = rw.Create(context.Background(), target)
|
||||
require.NoError(err)
|
||||
|
||||
if len(opts.withHostSources) > 0 {
|
||||
newHostSets := make([]interface{}, 0, len(opts.withHostSources))
|
||||
for _, s := range opts.withHostSources {
|
||||
hostSet, err := NewTargetHostSet(target.PublicId, s)
|
||||
require.NoError(err)
|
||||
newHostSets = append(newHostSets, hostSet)
|
||||
}
|
||||
err := rw.CreateItems(context.Background(), newHostSets)
|
||||
require.NoError(err)
|
||||
}
|
||||
if len(opts.withCredentialSources) > 0 {
|
||||
newCredLibs := make([]interface{}, 0, len(opts.withCredentialSources))
|
||||
for _, cl := range opts.withCredentialSources {
|
||||
newCl, err := NewCredentialLibrary(target.PublicId, cl)
|
||||
require.NoError(err)
|
||||
newCredLibs = append(newCredLibs, newCl)
|
||||
}
|
||||
err := rw.CreateItems(context.Background(), newCredLibs)
|
||||
require.NoError(err)
|
||||
}
|
||||
return target
|
||||
}
|
||||
|
||||
func testTargetName(t *testing.T, scopeId string) string {
|
||||
t.Helper()
|
||||
return fmt.Sprintf("%s-%s", scopeId, testId(t))
|
||||
}
|
||||
|
||||
func testId(t *testing.T) string {
|
||||
t.Helper()
|
||||
id, err := uuid.GenerateUUID()
|
||||
require.NoError(t, err)
|
||||
return id
|
||||
}
|
||||
|
||||
// TestCredentialLibrary creates a CredentialLibrary for targetId and
|
||||
// libraryId.
|
||||
func TestCredentialLibrary(t *testing.T, conn *db.DB, targetId, libraryId string) *CredentialLibrary {
|
||||
|
||||
@@ -14,7 +14,7 @@ import (
|
||||
"github.com/hashicorp/boundary/internal/credential/vault"
|
||||
"github.com/hashicorp/boundary/internal/iam"
|
||||
"github.com/hashicorp/boundary/internal/servers/controller"
|
||||
"github.com/hashicorp/boundary/internal/target"
|
||||
"github.com/hashicorp/boundary/internal/target/tcp"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
@@ -250,7 +250,7 @@ func TestSet_Errors(t *testing.T) {
|
||||
assert.NotNil(apiErr)
|
||||
assert.Nil(tar)
|
||||
|
||||
_, err = tarClient.Read(tc.Context(), target.TcpTargetPrefix+"_doesntexis")
|
||||
_, err = tarClient.Read(tc.Context(), tcp.TargetPrefix+"_doesntexis")
|
||||
require.Error(err)
|
||||
apiErr = api.AsServerError(err)
|
||||
assert.NotNil(apiErr)
|
||||
|
||||
@@ -4,6 +4,7 @@ package subtypes
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/hashicorp/boundary/internal/errors"
|
||||
)
|
||||
@@ -22,13 +23,14 @@ func (t Subtype) String() string {
|
||||
|
||||
// Registry stores a collection of boundary resource subtypes along with their
|
||||
// prefixes and allows for translating prefixes back to registered subtypes.
|
||||
// Registry is not thread safe.
|
||||
type Registry struct {
|
||||
subtypesPrefixes map[string]Subtype
|
||||
knownSubtypes map[Subtype]interface{}
|
||||
|
||||
sync.RWMutex
|
||||
}
|
||||
|
||||
// New Registry creates a new boundary resource subtype registry.
|
||||
// NewRegistry creates a new boundary resource subtype registry.
|
||||
func NewRegistry() *Registry {
|
||||
return &Registry{
|
||||
subtypesPrefixes: make(map[string]Subtype),
|
||||
@@ -39,6 +41,9 @@ func NewRegistry() *Registry {
|
||||
// SubtypeFromType returns the Subtype from the provided string or if
|
||||
// no Subtype was registered with that string Unknown is returned.
|
||||
func (r *Registry) SubtypeFromType(t string) Subtype {
|
||||
r.RLock()
|
||||
defer r.RUnlock()
|
||||
|
||||
st := Subtype(t)
|
||||
if _, ok := r.knownSubtypes[st]; !ok {
|
||||
return UnknownSubtype
|
||||
@@ -49,6 +54,9 @@ func (r *Registry) SubtypeFromType(t string) Subtype {
|
||||
// SubtypeFromId returns the Subtype from the provided id if the id's prefix
|
||||
// was registered with a Subtype. Otherwise Unknown is returned.
|
||||
func (r *Registry) SubtypeFromId(id string) Subtype {
|
||||
r.RLock()
|
||||
defer r.RUnlock()
|
||||
|
||||
i := strings.Index(id, "_")
|
||||
if i == -1 {
|
||||
return UnknownSubtype
|
||||
@@ -66,6 +74,9 @@ func (r *Registry) SubtypeFromId(id string) Subtype {
|
||||
// an error if the subtype has already been registered or if any of the
|
||||
// prefixes are associated with another subtype.
|
||||
func (r *Registry) Register(subtype Subtype, prefixes ...string) error {
|
||||
r.Lock()
|
||||
defer r.Unlock()
|
||||
|
||||
const op = "subtypes.(Registry).Register"
|
||||
if _, present := r.knownSubtypes[subtype]; present {
|
||||
return errors.NewDeprecated(errors.SubtypeAlreadyRegistered, op, fmt.Sprintf("subtype %q already registered", subtype))
|
||||
|
||||
Reference in new issue
Block a user