mirror of
https://github.com/andwati/zitadel.git
synced 2026-11-11 00:25:12 +00:00
feat: extend DeleteProvider to include Zitadel IdP (#12396)
# Which Problems Are Solved This PR extends `DeleteProvider` to include Zitadel provider enabling the deletion of Zitadel IdP. # How the Problems Are Solved - Extend org/instance IDP remove write models to include `ZitadelIDPAddedEvent` in event appends and queries. - Extend command-side IDP reduction/type handling for Zitadel IDP add events. - Add management/admin integration tests for deleting Zitadel providers - Add error translation key in all language locales for org-level “IDP config not existing”. # Additional Changes N/A # Additional Context. Closes https://github.com/zitadel/zitadel/issues/12397 --------- Co-authored-by: Copilot Autofix powered by AI <[email protected]> Co-authored-by: Livio Spring <[email protected]>
This commit is contained in:
co-authored by
Copilot Autofix powered by AI
Livio Spring
parent
a97999e5ca
commit
5bdfd96be5
@@ -223,6 +223,10 @@ func Test_AddZitadelProvider(t *testing.T) {
|
|||||||
assert.NotEmpty(t, got.GetId())
|
assert.NotEmpty(t, got.GetId())
|
||||||
assert.WithinRange(t, got.GetDetails().GetCreationDate().AsTime(), before, after)
|
assert.WithinRange(t, got.GetDetails().GetCreationDate().AsTime(), before, after)
|
||||||
assert.Equal(t, tt.wantResponse.GetDetails().GetResourceOwner(), got.GetDetails().GetResourceOwner())
|
assert.Equal(t, tt.wantResponse.GetDetails().GetResourceOwner(), got.GetDetails().GetResourceOwner())
|
||||||
|
t.Cleanup(func() {
|
||||||
|
_, err := Client.DeleteProvider(AdminCTX, &admin_pb.DeleteProviderRequest{Id: got.GetId()})
|
||||||
|
require.NoError(t, err)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -414,7 +418,10 @@ func Test_UpdateZitadelProvider(t *testing.T) {
|
|||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
// create a new provider per subtest
|
// create a new provider per subtest
|
||||||
existingProvider := Instance.AddZitadelProvider(AdminCTX, integration.IDPName())
|
existingProvider := Instance.AddZitadelProvider(AdminCTX, integration.IDPName())
|
||||||
|
t.Cleanup(func() {
|
||||||
|
_, err := Client.DeleteProvider(AdminCTX, &admin_pb.DeleteProviderRequest{Id: existingProvider.GetId()})
|
||||||
|
require.NoError(t, err)
|
||||||
|
})
|
||||||
// build request using this provider ID
|
// build request using this provider ID
|
||||||
tt.args.req.Id = existingProvider.GetId()
|
tt.args.req.Id = existingProvider.GetId()
|
||||||
|
|
||||||
@@ -445,7 +452,11 @@ func Test_UpdateZitadelProvider(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func Test_UpdateZitadelProvider_MissingID(t *testing.T) {
|
func Test_UpdateZitadelProvider_MissingID(t *testing.T) {
|
||||||
_ = Instance.AddZitadelProvider(AdminCTX, integration.IDPName())
|
existingProvider := Instance.AddZitadelProvider(AdminCTX, integration.IDPName())
|
||||||
|
t.Cleanup(func() {
|
||||||
|
_, err := Client.DeleteProvider(AdminCTX, &admin_pb.DeleteProviderRequest{Id: existingProvider.GetId()})
|
||||||
|
require.NoError(t, err)
|
||||||
|
})
|
||||||
// Attempt to update the provider without specifying the ID
|
// Attempt to update the provider without specifying the ID
|
||||||
updateResp, err := Client.UpdateZitadelProvider(AdminCTX, &admin_pb.UpdateZitadelProviderRequest{})
|
updateResp, err := Client.UpdateZitadelProvider(AdminCTX, &admin_pb.UpdateZitadelProviderRequest{})
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
@@ -459,6 +470,10 @@ func Test_UpdateZitadelProvider_MissingID(t *testing.T) {
|
|||||||
func Test_GetProviderByID(t *testing.T) {
|
func Test_GetProviderByID(t *testing.T) {
|
||||||
providerName := integration.IDPName()
|
providerName := integration.IDPName()
|
||||||
existingProvider := Instance.AddZitadelProvider(AdminCTX, providerName)
|
existingProvider := Instance.AddZitadelProvider(AdminCTX, providerName)
|
||||||
|
t.Cleanup(func() {
|
||||||
|
_, err := Client.DeleteProvider(AdminCTX, &admin_pb.DeleteProviderRequest{Id: existingProvider.GetId()})
|
||||||
|
require.NoError(t, err)
|
||||||
|
})
|
||||||
|
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
@@ -557,6 +572,12 @@ func Test_ListProviders(t *testing.T) {
|
|||||||
|
|
||||||
provider2Name := integration.IDPName()
|
provider2Name := integration.IDPName()
|
||||||
provider2 := Instance.AddZitadelProvider(AdminCTX, provider2Name)
|
provider2 := Instance.AddZitadelProvider(AdminCTX, provider2Name)
|
||||||
|
t.Cleanup(func() {
|
||||||
|
_, err := Client.DeleteProvider(AdminCTX, &admin_pb.DeleteProviderRequest{Id: provider1.GetId()})
|
||||||
|
require.NoError(t, err)
|
||||||
|
_, err = Client.DeleteProvider(AdminCTX, &admin_pb.DeleteProviderRequest{Id: provider2.GetId()})
|
||||||
|
require.NoError(t, err)
|
||||||
|
})
|
||||||
|
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
@@ -577,6 +598,82 @@ func Test_ListProviders(t *testing.T) {
|
|||||||
req: &admin_pb.ListProvidersRequest{},
|
req: &admin_pb.ListProvidersRequest{},
|
||||||
wantErr: status.Error(codes.PermissionDenied, "No matching permissions found (AUTH-5mWD2)"),
|
wantErr: status.Error(codes.PermissionDenied, "No matching permissions found (AUTH-5mWD2)"),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "list all providers",
|
||||||
|
ctx: AdminCTX,
|
||||||
|
req: &admin_pb.ListProvidersRequest{
|
||||||
|
Query: &object_pb.ListQuery{
|
||||||
|
Asc: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
wantResp: &admin_pb.ListProvidersResponse{
|
||||||
|
Details: &object_pb.ListDetails{
|
||||||
|
TotalResult: 2,
|
||||||
|
},
|
||||||
|
Result: []*idp_pb.Provider{
|
||||||
|
{
|
||||||
|
Id: provider1.GetId(),
|
||||||
|
Details: &object_pb.ObjectDetails{
|
||||||
|
CreationDate: provider1.GetDetails().GetCreationDate(),
|
||||||
|
ChangeDate: provider1.GetDetails().GetChangeDate(),
|
||||||
|
ResourceOwner: provider1.GetDetails().GetResourceOwner(),
|
||||||
|
},
|
||||||
|
State: idp_pb.IDPState_IDP_STATE_ACTIVE,
|
||||||
|
Name: provider1Name,
|
||||||
|
Owner: idp_pb.IDPOwnerType_IDP_OWNER_TYPE_SYSTEM,
|
||||||
|
Type: idp_pb.ProviderType_PROVIDER_TYPE_ZITADEL,
|
||||||
|
Config: &idp_pb.ProviderConfig{
|
||||||
|
Options: &idp_pb.Options{
|
||||||
|
IsCreationAllowed: true,
|
||||||
|
},
|
||||||
|
Config: &idp_pb.ProviderConfig_Zitadel{
|
||||||
|
Zitadel: &idp_pb.ZitadelConfig{
|
||||||
|
Issuer: "zitadel.example.com",
|
||||||
|
ClientId: "test-client",
|
||||||
|
Scopes: []string{"email", "profile"},
|
||||||
|
InstanceRolesInfo: []*idp_pb.InstanceRolesInfo{
|
||||||
|
{
|
||||||
|
OrganizationId: "org1",
|
||||||
|
OrganizationDomain: "org1.com",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Id: provider2.GetId(),
|
||||||
|
Details: &object_pb.ObjectDetails{
|
||||||
|
CreationDate: provider2.GetDetails().GetCreationDate(),
|
||||||
|
ChangeDate: provider2.GetDetails().GetChangeDate(),
|
||||||
|
ResourceOwner: provider2.GetDetails().GetResourceOwner(),
|
||||||
|
},
|
||||||
|
State: idp_pb.IDPState_IDP_STATE_ACTIVE,
|
||||||
|
Name: provider2Name,
|
||||||
|
Owner: idp_pb.IDPOwnerType_IDP_OWNER_TYPE_SYSTEM,
|
||||||
|
Type: idp_pb.ProviderType_PROVIDER_TYPE_ZITADEL,
|
||||||
|
Config: &idp_pb.ProviderConfig{
|
||||||
|
Options: &idp_pb.Options{
|
||||||
|
IsCreationAllowed: true,
|
||||||
|
},
|
||||||
|
Config: &idp_pb.ProviderConfig_Zitadel{
|
||||||
|
Zitadel: &idp_pb.ZitadelConfig{
|
||||||
|
Issuer: "zitadel.example.com",
|
||||||
|
ClientId: "test-client",
|
||||||
|
Scopes: []string{"email", "profile"},
|
||||||
|
InstanceRolesInfo: []*idp_pb.InstanceRolesInfo{
|
||||||
|
{
|
||||||
|
OrganizationId: "org1",
|
||||||
|
OrganizationDomain: "org1.com",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "list by id",
|
name: "list by id",
|
||||||
ctx: AdminCTX,
|
ctx: AdminCTX,
|
||||||
@@ -702,11 +799,82 @@ func Test_ListProviders(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.NotNil(t, got)
|
assert.NotNil(t, got)
|
||||||
assert.Equal(t, tt.wantResp.GetDetails().GetTotalResult(), got.GetDetails().GetTotalResult())
|
assert.Equal(t, tt.wantResp.GetDetails().GetTotalResult(), got.GetDetails().GetTotalResult())
|
||||||
for i, want := range tt.wantResp.GetResult() {
|
gotByID := make(map[string]*idp_pb.Provider)
|
||||||
assert.Equal(t, want.GetDetails().GetCreationDate().AsTime(), got.GetResult()[i].GetDetails().GetCreationDate().AsTime())
|
for _, p := range got.GetResult() {
|
||||||
assert.Equal(t, Instance.ID(), got.GetResult()[i].GetDetails().GetResourceOwner())
|
gotByID[p.GetId()] = p
|
||||||
assertProvider(t, want, got.GetResult()[i])
|
|
||||||
}
|
}
|
||||||
|
for _, want := range tt.wantResp.GetResult() {
|
||||||
|
actual, ok := gotByID[want.GetId()]
|
||||||
|
require.True(t, ok, "expected provider %s not found in results", want.GetId())
|
||||||
|
assert.Equal(t, want.GetDetails().GetCreationDate().AsTime(), actual.GetDetails().GetCreationDate().AsTime())
|
||||||
|
assert.Equal(t, Instance.ID(), actual.GetDetails().GetResourceOwner())
|
||||||
|
assertProvider(t, want, actual)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_DeleteZitadelProvider(t *testing.T) {
|
||||||
|
existingProvider := Instance.AddZitadelProvider(AdminCTX, integration.IDPName())
|
||||||
|
t.Cleanup(func() {
|
||||||
|
_, err := Client.DeleteProvider(AdminCTX, &admin_pb.DeleteProviderRequest{Id: existingProvider.GetId()})
|
||||||
|
if err != nil && status.Code(err) != codes.NotFound {
|
||||||
|
require.NoError(t, err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
ctx context.Context
|
||||||
|
req *admin_pb.DeleteProviderRequest
|
||||||
|
wantResponse *admin_pb.DeleteProviderResponse
|
||||||
|
wantErr error
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "no permissions, error",
|
||||||
|
ctx: Instance.WithAuthorizationToken(CTX, integration.UserTypeNoPermission),
|
||||||
|
req: &admin_pb.DeleteProviderRequest{Id: "idp-id"},
|
||||||
|
wantErr: status.Error(codes.NotFound, "membership not found (AUTHZ-cdgFk)"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "insufficient permissions, error", // no iam.idp.write permission
|
||||||
|
ctx: integration.WithSystemUserWithNoPermissionsAuthorization(CTX),
|
||||||
|
req: &admin_pb.DeleteProviderRequest{Id: "idp-id"},
|
||||||
|
wantErr: status.Error(codes.PermissionDenied, "No matching permissions found (AUTH-5mWD2)"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "not found, error",
|
||||||
|
ctx: AdminCTX,
|
||||||
|
req: &admin_pb.DeleteProviderRequest{Id: "idp-id"},
|
||||||
|
wantErr: status.Error(codes.NotFound, "Identity Provider Configuration doesn't exist (INST-Se3tg)"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "delete, ok",
|
||||||
|
ctx: AdminCTX,
|
||||||
|
req: &admin_pb.DeleteProviderRequest{Id: existingProvider.GetId()},
|
||||||
|
wantResponse: &admin_pb.DeleteProviderResponse{
|
||||||
|
Details: &object_pb.ObjectDetails{
|
||||||
|
ResourceOwner: Instance.Instance.Id,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
got, err := Client.DeleteProvider(tt.ctx, tt.req)
|
||||||
|
after := time.Now()
|
||||||
|
if tt.wantErr != nil {
|
||||||
|
require.Error(t, err)
|
||||||
|
grpcStatus, ok := status.FromError(err)
|
||||||
|
require.True(t, ok)
|
||||||
|
assert.Equal(t, status.Code(tt.wantErr), grpcStatus.Code())
|
||||||
|
assert.Equal(t, status.Convert(tt.wantErr).Message(), grpcStatus.Message())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.NotNil(t, got)
|
||||||
|
assert.Equal(t, tt.wantResponse.GetDetails().GetResourceOwner(), got.GetDetails().GetResourceOwner())
|
||||||
|
assert.WithinRange(t, got.GetDetails().GetChangeDate().AsTime(), existingProvider.GetDetails().GetCreationDate().AsTime(), after)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -229,6 +229,10 @@ func Test_AddZitadelProvider(t *testing.T) {
|
|||||||
assert.NotEmpty(t, got.GetId())
|
assert.NotEmpty(t, got.GetId())
|
||||||
assert.WithinRange(t, got.GetDetails().GetCreationDate().AsTime(), before, after)
|
assert.WithinRange(t, got.GetDetails().GetCreationDate().AsTime(), before, after)
|
||||||
assert.Equal(t, tt.wantResponse.GetDetails().GetResourceOwner(), got.GetDetails().GetResourceOwner())
|
assert.Equal(t, tt.wantResponse.GetDetails().GetResourceOwner(), got.GetDetails().GetResourceOwner())
|
||||||
|
t.Cleanup(func() {
|
||||||
|
_, err := Client.DeleteProvider(OrgCTX, &mgmt_pb.DeleteProviderRequest{Id: got.GetId()})
|
||||||
|
require.NoError(t, err)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -454,6 +458,10 @@ func Test_UpdateZitadelProvider(t *testing.T) {
|
|||||||
// create a new provider per subtest and set the ID in the request
|
// create a new provider per subtest and set the ID in the request
|
||||||
zitadelProvider := Instance.AddOrgZitadelProvider(OrgCTX, integration.IDPName())
|
zitadelProvider := Instance.AddOrgZitadelProvider(OrgCTX, integration.IDPName())
|
||||||
tt.args.req.Id = zitadelProvider.Id
|
tt.args.req.Id = zitadelProvider.Id
|
||||||
|
t.Cleanup(func() {
|
||||||
|
_, err := Client.DeleteProvider(OrgCTX, &mgmt_pb.DeleteProviderRequest{Id: zitadelProvider.GetId()})
|
||||||
|
require.NoError(t, err)
|
||||||
|
})
|
||||||
|
|
||||||
before := time.Now()
|
before := time.Now()
|
||||||
updateResp, err := Client.UpdateZitadelProvider(tt.args.ctx, tt.args.req)
|
updateResp, err := Client.UpdateZitadelProvider(tt.args.ctx, tt.args.req)
|
||||||
@@ -482,7 +490,11 @@ func Test_UpdateZitadelProvider(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func Test_UpdateZitadelProvider_MissingID(t *testing.T) {
|
func Test_UpdateZitadelProvider_MissingID(t *testing.T) {
|
||||||
_ = Instance.AddOrgZitadelProvider(OrgCTX, integration.IDPName())
|
existingProvider := Instance.AddOrgZitadelProvider(OrgCTX, integration.IDPName())
|
||||||
|
t.Cleanup(func() {
|
||||||
|
_, err := Client.DeleteProvider(OrgCTX, &mgmt_pb.DeleteProviderRequest{Id: existingProvider.GetId()})
|
||||||
|
require.NoError(t, err)
|
||||||
|
})
|
||||||
// Attempt to update the provider without specifying the ID
|
// Attempt to update the provider without specifying the ID
|
||||||
updateResp, err := Client.UpdateZitadelProvider(OrgCTX, &mgmt_pb.UpdateZitadelProviderRequest{})
|
updateResp, err := Client.UpdateZitadelProvider(OrgCTX, &mgmt_pb.UpdateZitadelProviderRequest{})
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
@@ -597,7 +609,12 @@ func Test_ListProviders(t *testing.T) {
|
|||||||
provider1 := Instance.AddOrgZitadelProvider(orgCtx, provider1Name)
|
provider1 := Instance.AddOrgZitadelProvider(orgCtx, provider1Name)
|
||||||
provider2Name := integration.IDPName()
|
provider2Name := integration.IDPName()
|
||||||
provider2 := Instance.AddOrgZitadelProvider(orgCtx, provider2Name)
|
provider2 := Instance.AddOrgZitadelProvider(orgCtx, provider2Name)
|
||||||
|
t.Cleanup(func() {
|
||||||
|
_, err := Client.DeleteProvider(orgCtx, &mgmt_pb.DeleteProviderRequest{Id: provider1.GetId()})
|
||||||
|
require.NoError(t, err)
|
||||||
|
_, err = Client.DeleteProvider(orgCtx, &mgmt_pb.DeleteProviderRequest{Id: provider2.GetId()})
|
||||||
|
require.NoError(t, err)
|
||||||
|
})
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
@@ -818,11 +835,82 @@ func Test_ListProviders(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.NotNil(t, got)
|
assert.NotNil(t, got)
|
||||||
assert.Equal(t, tt.wantResp.GetDetails().GetTotalResult(), got.GetDetails().GetTotalResult())
|
assert.Equal(t, tt.wantResp.GetDetails().GetTotalResult(), got.GetDetails().GetTotalResult())
|
||||||
for i, want := range tt.wantResp.GetResult() {
|
gotByID := make(map[string]*idp_pb.Provider)
|
||||||
assert.Equal(t, want.GetDetails().GetCreationDate().AsTime(), got.GetResult()[i].GetDetails().GetCreationDate().AsTime())
|
for _, p := range got.GetResult() {
|
||||||
assert.Equal(t, org.GetOrganizationId(), got.GetResult()[i].GetDetails().GetResourceOwner())
|
gotByID[p.GetId()] = p
|
||||||
assertProvider(t, want, got.GetResult()[i])
|
|
||||||
}
|
}
|
||||||
|
for _, want := range tt.wantResp.GetResult() {
|
||||||
|
actual, ok := gotByID[want.GetId()]
|
||||||
|
require.True(t, ok, "expected provider %s not found in results", want.GetId())
|
||||||
|
assert.Equal(t, want.GetDetails().GetCreationDate().AsTime(), actual.GetDetails().GetCreationDate().AsTime())
|
||||||
|
assert.Equal(t, org.GetOrganizationId(), actual.GetDetails().GetResourceOwner())
|
||||||
|
assertProvider(t, want, actual)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Test_DeleteZitadelProvider(t *testing.T) {
|
||||||
|
existingProvider := Instance.AddOrgZitadelProvider(OrgCTX, integration.IDPName())
|
||||||
|
t.Cleanup(func() {
|
||||||
|
_, err := Client.DeleteProvider(OrgCTX, &mgmt_pb.DeleteProviderRequest{Id: existingProvider.GetId()})
|
||||||
|
if err != nil && status.Code(err) != codes.NotFound {
|
||||||
|
require.NoError(t, err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
ctx context.Context
|
||||||
|
req *mgmt_pb.DeleteProviderRequest
|
||||||
|
wantResponse *mgmt_pb.DeleteProviderResponse
|
||||||
|
wantErr error
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "no permissions, error",
|
||||||
|
ctx: Instance.WithAuthorizationToken(CTX, integration.UserTypeNoPermission),
|
||||||
|
req: &mgmt_pb.DeleteProviderRequest{Id: "idp-id"},
|
||||||
|
wantErr: status.Error(codes.NotFound, "membership not found (AUTHZ-cdgFk)"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "insufficient permissions, error", // no iam.idp.write permission
|
||||||
|
ctx: integration.WithSystemUserWithNoPermissionsAuthorization(CTX),
|
||||||
|
req: &mgmt_pb.DeleteProviderRequest{Id: "idp-id"},
|
||||||
|
wantErr: status.Error(codes.PermissionDenied, "No matching permissions found (AUTH-5mWD2)"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "not found, error",
|
||||||
|
ctx: OrgCTX,
|
||||||
|
req: &mgmt_pb.DeleteProviderRequest{Id: "idp-id"},
|
||||||
|
wantErr: status.Error(codes.NotFound, "Identity Provider Configuration doesn't exist (ORG-Se3tg)"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "delete, ok",
|
||||||
|
ctx: OrgCTX,
|
||||||
|
req: &mgmt_pb.DeleteProviderRequest{Id: existingProvider.GetId()},
|
||||||
|
wantResponse: &mgmt_pb.DeleteProviderResponse{
|
||||||
|
Details: &object_pb.ObjectDetails{
|
||||||
|
ResourceOwner: Instance.DefaultOrg.Id,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
got, err := Client.DeleteProvider(tt.ctx, tt.req)
|
||||||
|
after := time.Now()
|
||||||
|
if tt.wantErr != nil {
|
||||||
|
require.Error(t, err)
|
||||||
|
grpcStatus, ok := status.FromError(err)
|
||||||
|
require.True(t, ok)
|
||||||
|
assert.Equal(t, status.Code(tt.wantErr), grpcStatus.Code())
|
||||||
|
assert.Equal(t, status.Convert(tt.wantErr).Message(), grpcStatus.Message())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.NotNil(t, got)
|
||||||
|
assert.Equal(t, tt.wantResponse.GetDetails().GetResourceOwner(), got.GetDetails().GetResourceOwner())
|
||||||
|
assert.WithinRange(t, got.GetDetails().GetChangeDate().AsTime(), existingProvider.GetDetails().GetCreationDate().AsTime(), after)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2014,6 +2014,8 @@ func (wm *IDPRemoveWriteModel) Reduce() error {
|
|||||||
wm.reduceAdded(e.ConfigID)
|
wm.reduceAdded(e.ConfigID)
|
||||||
case *idpconfig.IDPConfigRemovedEvent:
|
case *idpconfig.IDPConfigRemovedEvent:
|
||||||
wm.reduceRemoved(e.ConfigID)
|
wm.reduceRemoved(e.ConfigID)
|
||||||
|
case *idp.ZitadelIDPAddedEvent:
|
||||||
|
wm.reduceAdded(e.ID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return wm.WriteModel.Reduce()
|
return wm.WriteModel.Reduce()
|
||||||
@@ -2126,6 +2128,10 @@ func (wm *IDPTypeWriteModel) Reduce() error {
|
|||||||
wm.reduceRemoved(e.ConfigID)
|
wm.reduceRemoved(e.ConfigID)
|
||||||
case *org.IDPConfigRemovedEvent:
|
case *org.IDPConfigRemovedEvent:
|
||||||
wm.reduceRemoved(e.ConfigID)
|
wm.reduceRemoved(e.ConfigID)
|
||||||
|
case *instance.ZitadelIDPAddedEvent:
|
||||||
|
wm.reduceAdded(e.ID, domain.IDPTypeZitadel, e.Aggregate())
|
||||||
|
case *org.ZitadelIDPAddedEvent:
|
||||||
|
wm.reduceAdded(e.ID, domain.IDPTypeZitadel, e.Aggregate())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return wm.WriteModel.Reduce()
|
return wm.WriteModel.Reduce()
|
||||||
@@ -2177,6 +2183,7 @@ func (wm *IDPTypeWriteModel) Query() *eventstore.SearchQueryBuilder {
|
|||||||
instance.SAMLIDPAddedEventType,
|
instance.SAMLIDPAddedEventType,
|
||||||
instance.OIDCIDPMigratedAzureADEventType,
|
instance.OIDCIDPMigratedAzureADEventType,
|
||||||
instance.OIDCIDPMigratedGoogleEventType,
|
instance.OIDCIDPMigratedGoogleEventType,
|
||||||
|
instance.ZitadelIDPAddedEventType,
|
||||||
instance.IDPRemovedEventType,
|
instance.IDPRemovedEventType,
|
||||||
).
|
).
|
||||||
EventData(map[string]interface{}{"id": wm.ID}).
|
EventData(map[string]interface{}{"id": wm.ID}).
|
||||||
@@ -2197,6 +2204,7 @@ func (wm *IDPTypeWriteModel) Query() *eventstore.SearchQueryBuilder {
|
|||||||
org.SAMLIDPAddedEventType,
|
org.SAMLIDPAddedEventType,
|
||||||
org.OIDCIDPMigratedAzureADEventType,
|
org.OIDCIDPMigratedAzureADEventType,
|
||||||
org.OIDCIDPMigratedGoogleEventType,
|
org.OIDCIDPMigratedGoogleEventType,
|
||||||
|
org.ZitadelIDPAddedEventType,
|
||||||
org.IDPRemovedEventType,
|
org.IDPRemovedEventType,
|
||||||
).
|
).
|
||||||
EventData(map[string]interface{}{"id": wm.ID}).
|
EventData(map[string]interface{}{"id": wm.ID}).
|
||||||
|
|||||||
@@ -998,6 +998,8 @@ func (wm *InstanceIDPRemoveWriteModel) AppendEvents(events ...eventstore.Event)
|
|||||||
wm.IDPRemoveWriteModel.AppendEvents(&e.IDPConfigAddedEvent)
|
wm.IDPRemoveWriteModel.AppendEvents(&e.IDPConfigAddedEvent)
|
||||||
case *instance.IDPConfigRemovedEvent:
|
case *instance.IDPConfigRemovedEvent:
|
||||||
wm.IDPRemoveWriteModel.AppendEvents(&e.IDPConfigRemovedEvent)
|
wm.IDPRemoveWriteModel.AppendEvents(&e.IDPConfigRemovedEvent)
|
||||||
|
case *instance.ZitadelIDPAddedEvent:
|
||||||
|
wm.IDPRemoveWriteModel.AppendEvents(&e.ZitadelIDPAddedEvent)
|
||||||
default:
|
default:
|
||||||
wm.IDPRemoveWriteModel.AppendEvents(e)
|
wm.IDPRemoveWriteModel.AppendEvents(e)
|
||||||
}
|
}
|
||||||
@@ -1023,6 +1025,7 @@ func (wm *InstanceIDPRemoveWriteModel) Query() *eventstore.SearchQueryBuilder {
|
|||||||
instance.LDAPIDPAddedEventType,
|
instance.LDAPIDPAddedEventType,
|
||||||
instance.AppleIDPAddedEventType,
|
instance.AppleIDPAddedEventType,
|
||||||
instance.SAMLIDPAddedEventType,
|
instance.SAMLIDPAddedEventType,
|
||||||
|
instance.ZitadelIDPAddedEventType,
|
||||||
instance.IDPRemovedEventType,
|
instance.IDPRemovedEventType,
|
||||||
).
|
).
|
||||||
EventData(map[string]interface{}{"id": wm.ID}).
|
EventData(map[string]interface{}{"id": wm.ID}).
|
||||||
|
|||||||
@@ -1010,6 +1010,8 @@ func (wm *OrgIDPRemoveWriteModel) AppendEvents(events ...eventstore.Event) {
|
|||||||
wm.IDPRemoveWriteModel.AppendEvents(&e.IDPConfigAddedEvent)
|
wm.IDPRemoveWriteModel.AppendEvents(&e.IDPConfigAddedEvent)
|
||||||
case *org.IDPConfigRemovedEvent:
|
case *org.IDPConfigRemovedEvent:
|
||||||
wm.IDPRemoveWriteModel.AppendEvents(&e.IDPConfigRemovedEvent)
|
wm.IDPRemoveWriteModel.AppendEvents(&e.IDPConfigRemovedEvent)
|
||||||
|
case *org.ZitadelIDPAddedEvent:
|
||||||
|
wm.IDPRemoveWriteModel.AppendEvents(&e.ZitadelIDPAddedEvent)
|
||||||
default:
|
default:
|
||||||
wm.IDPRemoveWriteModel.AppendEvents(e)
|
wm.IDPRemoveWriteModel.AppendEvents(e)
|
||||||
}
|
}
|
||||||
@@ -1035,6 +1037,7 @@ func (wm *OrgIDPRemoveWriteModel) Query() *eventstore.SearchQueryBuilder {
|
|||||||
org.LDAPIDPAddedEventType,
|
org.LDAPIDPAddedEventType,
|
||||||
org.AppleIDPAddedEventType,
|
org.AppleIDPAddedEventType,
|
||||||
org.SAMLIDPAddedEventType,
|
org.SAMLIDPAddedEventType,
|
||||||
|
org.ZitadelIDPAddedEventType,
|
||||||
org.IDPRemovedEventType,
|
org.IDPRemovedEventType,
|
||||||
).
|
).
|
||||||
EventData(map[string]interface{}{"id": wm.ID}).
|
EventData(map[string]interface{}{"id": wm.ID}).
|
||||||
|
|||||||
@@ -283,6 +283,8 @@ Errors:
|
|||||||
LabelPolicy:
|
LabelPolicy:
|
||||||
NotFound: "سياسة العلامة الخاصة غير موجودة"
|
NotFound: "سياسة العلامة الخاصة غير موجودة"
|
||||||
NotChanged: "سياسة العلامة الخاصة لم تتغير"
|
NotChanged: "سياسة العلامة الخاصة لم تتغير"
|
||||||
|
IDPConfig:
|
||||||
|
NotExisting: "تكوين مزود الهوية غير موجود"
|
||||||
Project:
|
Project:
|
||||||
ProjectIDMissing: "معرف المشروع مفقود"
|
ProjectIDMissing: "معرف المشروع مفقود"
|
||||||
AlreadyExists: "المشروع موجود بالفعل في المنظمة"
|
AlreadyExists: "المشروع موجود بالفعل في المنظمة"
|
||||||
|
|||||||
@@ -282,6 +282,8 @@ Errors:
|
|||||||
LabelPolicy:
|
LabelPolicy:
|
||||||
NotFound: "Правилата за лични етикети не са намерени"
|
NotFound: "Правилата за лични етикети не са намерени"
|
||||||
NotChanged: "Политиката на частния етикет не е променена"
|
NotChanged: "Политиката на частния етикет не е променена"
|
||||||
|
IDPConfig:
|
||||||
|
NotExisting: "Конфигурацията на доставчик на самоличност не съществува"
|
||||||
Project:
|
Project:
|
||||||
ProjectIDMissing: "Липсва ID на проекта"
|
ProjectIDMissing: "Липсва ID на проекта"
|
||||||
AlreadyExists: "Проектът вече съществува в организацията"
|
AlreadyExists: "Проектът вече съществува в организацията"
|
||||||
|
|||||||
@@ -282,6 +282,8 @@ Errors:
|
|||||||
LabelPolicy:
|
LabelPolicy:
|
||||||
NotFound: "Politika privátních štítků nenalezena"
|
NotFound: "Politika privátních štítků nenalezena"
|
||||||
NotChanged: "Politika privátních štítků nebyla změněna"
|
NotChanged: "Politika privátních štítků nebyla změněna"
|
||||||
|
IDPConfig:
|
||||||
|
NotExisting: "Konfigurace poskytovatele identity neexistuje"
|
||||||
Project:
|
Project:
|
||||||
ProjectIDMissing: "Chybí ID projektu"
|
ProjectIDMissing: "Chybí ID projektu"
|
||||||
AlreadyExists: "Projekt již v organizaci existuje"
|
AlreadyExists: "Projekt již v organizaci existuje"
|
||||||
|
|||||||
@@ -282,6 +282,8 @@ Errors:
|
|||||||
LabelPolicy:
|
LabelPolicy:
|
||||||
NotFound: "Private Label Policy konnte nicht gefunden"
|
NotFound: "Private Label Policy konnte nicht gefunden"
|
||||||
NotChanged: "Private Label Policy wurde nicht verändert"
|
NotChanged: "Private Label Policy wurde nicht verändert"
|
||||||
|
IDPConfig:
|
||||||
|
NotExisting: "Identitätsprovider Konfiguration existiert nicht"
|
||||||
Project:
|
Project:
|
||||||
ProjectIDMissing: "Project ID fehlt"
|
ProjectIDMissing: "Project ID fehlt"
|
||||||
AlreadyExists: "Project existiert bereits auf der Organisation"
|
AlreadyExists: "Project existiert bereits auf der Organisation"
|
||||||
|
|||||||
@@ -285,6 +285,8 @@ Errors:
|
|||||||
LabelPolicy:
|
LabelPolicy:
|
||||||
NotFound: "Private Label Policy not found"
|
NotFound: "Private Label Policy not found"
|
||||||
NotChanged: "Private Label Policy has not been changed"
|
NotChanged: "Private Label Policy has not been changed"
|
||||||
|
IDPConfig:
|
||||||
|
NotExisting: "Identity Provider Configuration doesn't exist"
|
||||||
Project:
|
Project:
|
||||||
ProjectIDMissing: "Project Id missing"
|
ProjectIDMissing: "Project Id missing"
|
||||||
AlreadyExists: "Project already exists on organization"
|
AlreadyExists: "Project already exists on organization"
|
||||||
|
|||||||
@@ -282,6 +282,8 @@ Errors:
|
|||||||
LabelPolicy:
|
LabelPolicy:
|
||||||
NotFound: "Política de etiqueta privada no encontrada"
|
NotFound: "Política de etiqueta privada no encontrada"
|
||||||
NotChanged: "La política de etiqueta privada no ha cambiado"
|
NotChanged: "La política de etiqueta privada no ha cambiado"
|
||||||
|
IDPConfig:
|
||||||
|
NotExisting: "La configuración de proveedor de identidad (IDP) no existe"
|
||||||
Project:
|
Project:
|
||||||
ProjectIDMissing: "Falta el Id del proyecto"
|
ProjectIDMissing: "Falta el Id del proyecto"
|
||||||
AlreadyExists: "El proyecto ya existe en la organización"
|
AlreadyExists: "El proyecto ya existe en la organización"
|
||||||
|
|||||||
@@ -282,6 +282,8 @@ Errors:
|
|||||||
LabelPolicy:
|
LabelPolicy:
|
||||||
NotFound: "La politique d'étiquetage privé n'a pas été trouvée"
|
NotFound: "La politique d'étiquetage privé n'a pas été trouvée"
|
||||||
NotChanged: "La politique en matière de marques privées n'a pas été modifiée"
|
NotChanged: "La politique en matière de marques privées n'a pas été modifiée"
|
||||||
|
IDPConfig:
|
||||||
|
NotExisting: "La configuration du fournisseur d'identité n'existe pas"
|
||||||
Project:
|
Project:
|
||||||
ProjectIDMissing: "Id de projet manquant"
|
ProjectIDMissing: "Id de projet manquant"
|
||||||
AlreadyExists: "Le projet existe déjà dans l'organisation"
|
AlreadyExists: "Le projet existe déjà dans l'organisation"
|
||||||
|
|||||||
@@ -282,6 +282,8 @@ Errors:
|
|||||||
LabelPolicy:
|
LabelPolicy:
|
||||||
NotFound: "A Private Label Policy nem található"
|
NotFound: "A Private Label Policy nem található"
|
||||||
NotChanged: "A Private Label Policy nem lett megváltoztatva"
|
NotChanged: "A Private Label Policy nem lett megváltoztatva"
|
||||||
|
IDPConfig:
|
||||||
|
NotExisting: "Az identitásszolgáltató konfiguráció nem létezik"
|
||||||
Project:
|
Project:
|
||||||
ProjectIDMissing: "Hiányzó Project Id"
|
ProjectIDMissing: "Hiányzó Project Id"
|
||||||
AlreadyExists: "A projekt már létezik a szervezetben"
|
AlreadyExists: "A projekt már létezik a szervezetben"
|
||||||
|
|||||||
@@ -282,6 +282,8 @@ Errors:
|
|||||||
LabelPolicy:
|
LabelPolicy:
|
||||||
NotFound: "Kebijakan Label Pribadi tidak ditemukan"
|
NotFound: "Kebijakan Label Pribadi tidak ditemukan"
|
||||||
NotChanged: "Kebijakan Label Pribadi belum diubah"
|
NotChanged: "Kebijakan Label Pribadi belum diubah"
|
||||||
|
IDPConfig:
|
||||||
|
NotExisting: "Konfigurasi Penyedia Identitas tidak ada"
|
||||||
Project:
|
Project:
|
||||||
ProjectIDMissing: "Id Proyek tidak ada"
|
ProjectIDMissing: "Id Proyek tidak ada"
|
||||||
AlreadyExists: "Proyek sudah ada di organisasi"
|
AlreadyExists: "Proyek sudah ada di organisasi"
|
||||||
|
|||||||
@@ -282,6 +282,8 @@ Errors:
|
|||||||
LabelPolicy:
|
LabelPolicy:
|
||||||
NotFound: "Etichettatura privata non trovata"
|
NotFound: "Etichettatura privata non trovata"
|
||||||
NotChanged: "Private Labelling non è stata cambiata"
|
NotChanged: "Private Labelling non è stata cambiata"
|
||||||
|
IDPConfig:
|
||||||
|
NotExisting: "La configurazione del IDP non esiste"
|
||||||
Project:
|
Project:
|
||||||
ProjectIDMissing: "ID del progetto mancante"
|
ProjectIDMissing: "ID del progetto mancante"
|
||||||
AlreadyExists: "Il progetto è già stato creato nell'organizzazione"
|
AlreadyExists: "Il progetto è già stato creato nell'organizzazione"
|
||||||
|
|||||||
@@ -283,6 +283,8 @@ Errors:
|
|||||||
LabelPolicy:
|
LabelPolicy:
|
||||||
NotFound: "プライベートラベルポリシーが見つかりません"
|
NotFound: "プライベートラベルポリシーが見つかりません"
|
||||||
NotChanged: "プライベートラベルポリシーが変更されていません"
|
NotChanged: "プライベートラベルポリシーが変更されていません"
|
||||||
|
IDPConfig:
|
||||||
|
NotExisting: "IDプロバイダーの構成は存在しません"
|
||||||
Project:
|
Project:
|
||||||
ProjectIDMissing: "プロジェクトIDがありません"
|
ProjectIDMissing: "プロジェクトIDがありません"
|
||||||
AlreadyExists: "プロジェクトはすでに組織に存在しています"
|
AlreadyExists: "プロジェクトはすでに組織に存在しています"
|
||||||
|
|||||||
@@ -283,6 +283,8 @@ Errors:
|
|||||||
LabelPolicy:
|
LabelPolicy:
|
||||||
NotFound: "개인 라벨 정책을 찾을 수 없습니다"
|
NotFound: "개인 라벨 정책을 찾을 수 없습니다"
|
||||||
NotChanged: "개인 라벨 정책이 변경되지 않았습니다"
|
NotChanged: "개인 라벨 정책이 변경되지 않았습니다"
|
||||||
|
IDPConfig:
|
||||||
|
NotExisting: "IDP 설정이 존재하지 않습니다"
|
||||||
Project:
|
Project:
|
||||||
ProjectIDMissing: "프로젝트 ID가 누락되었습니다"
|
ProjectIDMissing: "프로젝트 ID가 누락되었습니다"
|
||||||
AlreadyExists: "조직에 프로젝트가 이미 존재합니다"
|
AlreadyExists: "조직에 프로젝트가 이미 존재합니다"
|
||||||
|
|||||||
@@ -281,6 +281,8 @@ Errors:
|
|||||||
LabelPolicy:
|
LabelPolicy:
|
||||||
NotFound: "Приватната политика за ознаките не е пронајдена"
|
NotFound: "Приватната политика за ознаките не е пронајдена"
|
||||||
NotChanged: "Приватната политика за ознаките не е променета"
|
NotChanged: "Приватната политика за ознаките не е променета"
|
||||||
|
IDPConfig:
|
||||||
|
NotExisting: "Конфигурацијата на IDP не постои"
|
||||||
Project:
|
Project:
|
||||||
ProjectIDMissing: "Недостасува ID на проектот"
|
ProjectIDMissing: "Недостасува ID на проектот"
|
||||||
AlreadyExists: "Проектот веќе постои во организацијата"
|
AlreadyExists: "Проектот веќе постои во организацијата"
|
||||||
|
|||||||
@@ -282,6 +282,8 @@ Errors:
|
|||||||
LabelPolicy:
|
LabelPolicy:
|
||||||
NotFound: "Privé Label Beleid niet gevonden"
|
NotFound: "Privé Label Beleid niet gevonden"
|
||||||
NotChanged: "Privé Label Beleid is niet veranderd"
|
NotChanged: "Privé Label Beleid is niet veranderd"
|
||||||
|
IDPConfig:
|
||||||
|
NotExisting: "Identiteitsprovider-configuratie bestaat niet"
|
||||||
Project:
|
Project:
|
||||||
ProjectIDMissing: "Project ID ontbreekt"
|
ProjectIDMissing: "Project ID ontbreekt"
|
||||||
AlreadyExists: "Project bestaat al op organisatie"
|
AlreadyExists: "Project bestaat al op organisatie"
|
||||||
|
|||||||
@@ -282,6 +282,8 @@ Errors:
|
|||||||
LabelPolicy:
|
LabelPolicy:
|
||||||
NotFound: "Nie znaleziono polityki marki własnej"
|
NotFound: "Nie znaleziono polityki marki własnej"
|
||||||
NotChanged: "Polityka dotycząca marek własnych nie została zmieniona"
|
NotChanged: "Polityka dotycząca marek własnych nie została zmieniona"
|
||||||
|
IDPConfig:
|
||||||
|
NotExisting: "Konfiguracja dostawcy tożsamości nie istnieje"
|
||||||
Project:
|
Project:
|
||||||
ProjectIDMissing: "Identyfikator projektu brak"
|
ProjectIDMissing: "Identyfikator projektu brak"
|
||||||
AlreadyExists: "Projekt już istnieje w organizacji"
|
AlreadyExists: "Projekt już istnieje w organizacji"
|
||||||
|
|||||||
@@ -281,6 +281,8 @@ Errors:
|
|||||||
LabelPolicy:
|
LabelPolicy:
|
||||||
NotFound: "Política de Rótulo Privado não encontrada"
|
NotFound: "Política de Rótulo Privado não encontrada"
|
||||||
NotChanged: "Política de Rótulo Privado não foi alterada"
|
NotChanged: "Política de Rótulo Privado não foi alterada"
|
||||||
|
IDPConfig:
|
||||||
|
NotExisting: "A Configuração do Provedor de Identidade não existe"
|
||||||
Project:
|
Project:
|
||||||
ProjectIDMissing: "ID do Projeto ausente"
|
ProjectIDMissing: "ID do Projeto ausente"
|
||||||
AlreadyExists: "Projeto já existe na organização"
|
AlreadyExists: "Projeto já existe na organização"
|
||||||
|
|||||||
@@ -283,6 +283,8 @@ Errors:
|
|||||||
LabelPolicy:
|
LabelPolicy:
|
||||||
NotFound: "Politica de etichete private nu a fost găsită"
|
NotFound: "Politica de etichete private nu a fost găsită"
|
||||||
NotChanged: "Politica de etichete private nu a fost schimbată"
|
NotChanged: "Politica de etichete private nu a fost schimbată"
|
||||||
|
IDPConfig:
|
||||||
|
NotExisting: "Configurația furnizorului de identitate nu există"
|
||||||
Project:
|
Project:
|
||||||
ProjectIDMissing: "ID-ul proiectului lipsește"
|
ProjectIDMissing: "ID-ul proiectului lipsește"
|
||||||
AlreadyExists: "Proiectul există deja în organizație"
|
AlreadyExists: "Proiectul există deja în organizație"
|
||||||
|
|||||||
@@ -276,6 +276,8 @@ Errors:
|
|||||||
LabelPolicy:
|
LabelPolicy:
|
||||||
NotFound: "Политика частных торговых марок не найдена"
|
NotFound: "Политика частных торговых марок не найдена"
|
||||||
NotChanged: "Политика использования частных торговых марок не изменилась."
|
NotChanged: "Политика использования частных торговых марок не изменилась."
|
||||||
|
IDPConfig:
|
||||||
|
NotExisting: "Конфигурация поставщика идентификационных данных не существует"
|
||||||
Project:
|
Project:
|
||||||
ProjectIDMissing: "ID Проекта отсутствует"
|
ProjectIDMissing: "ID Проекта отсутствует"
|
||||||
AlreadyExists: "Проект уже существует в организации"
|
AlreadyExists: "Проект уже существует в организации"
|
||||||
|
|||||||
@@ -282,6 +282,8 @@ Errors:
|
|||||||
LabelPolicy:
|
LabelPolicy:
|
||||||
NotFound: "Privat etikettpolicy hittades inte"
|
NotFound: "Privat etikettpolicy hittades inte"
|
||||||
NotChanged: "Privat etikettpolicy har inte ändrats"
|
NotChanged: "Privat etikettpolicy har inte ändrats"
|
||||||
|
IDPConfig:
|
||||||
|
NotExisting: "Identitetsleverantörskonfigurationen existerar inte"
|
||||||
Project:
|
Project:
|
||||||
ProjectIDMissing: "Projekt-ID saknas"
|
ProjectIDMissing: "Projekt-ID saknas"
|
||||||
AlreadyExists: "Projekt finns redan på organisationen"
|
AlreadyExists: "Projekt finns redan på organisationen"
|
||||||
|
|||||||
@@ -283,6 +283,8 @@ Errors:
|
|||||||
LabelPolicy:
|
LabelPolicy:
|
||||||
NotFound: "Özel Etiket Politikası bulunamadı"
|
NotFound: "Özel Etiket Politikası bulunamadı"
|
||||||
NotChanged: "Özel Etiket Politikası değişmedi"
|
NotChanged: "Özel Etiket Politikası değişmedi"
|
||||||
|
IDPConfig:
|
||||||
|
NotExisting: "Kimlik Sağlayıcısı Yapılandırması mevcut değil"
|
||||||
Project:
|
Project:
|
||||||
ProjectIDMissing: "Proje Id eksik"
|
ProjectIDMissing: "Proje Id eksik"
|
||||||
AlreadyExists: "Proje organizasyonda zaten mevcut"
|
AlreadyExists: "Proje organizasyonda zaten mevcut"
|
||||||
|
|||||||
@@ -277,6 +277,8 @@ Errors:
|
|||||||
LabelPolicy:
|
LabelPolicy:
|
||||||
NotFound: "Політика приватного бренду не знайдена"
|
NotFound: "Політика приватного бренду не знайдена"
|
||||||
NotChanged: "Політика приватного бренду не була змінена"
|
NotChanged: "Політика приватного бренду не була змінена"
|
||||||
|
IDPConfig:
|
||||||
|
NotExisting: "Конфігурація провайдера ідентичності не існує"
|
||||||
Project:
|
Project:
|
||||||
ProjectIDMissing: "Відсутній ідентифікатор проекту"
|
ProjectIDMissing: "Відсутній ідентифікатор проекту"
|
||||||
AlreadyExists: "Проект вже існує в організації"
|
AlreadyExists: "Проект вже існує в організації"
|
||||||
|
|||||||
@@ -283,6 +283,8 @@ Errors:
|
|||||||
LabelPolicy:
|
LabelPolicy:
|
||||||
NotFound: "不存在私人政策"
|
NotFound: "不存在私人政策"
|
||||||
NotChanged: "私人政策不改变"
|
NotChanged: "私人政策不改变"
|
||||||
|
IDPConfig:
|
||||||
|
NotExisting: "身份提供者配置不存在"
|
||||||
Project:
|
Project:
|
||||||
ProjectIDMissing: "P缺少项目 ID"
|
ProjectIDMissing: "P缺少项目 ID"
|
||||||
AlreadyExists: "项目以存在于组织中"
|
AlreadyExists: "项目以存在于组织中"
|
||||||
|
|||||||
Reference in New Issue
Block a user