diff --git a/pkg/api/index.go b/pkg/api/index.go index 2358fa61821..25565347c10 100644 --- a/pkg/api/index.go +++ b/pkg/api/index.go @@ -144,9 +144,8 @@ func (hs *HTTPServer) getAppLinks(c *models.ReqContext) ([]*dtos.NavLink, error) } func enableServiceAccount(hs *HTTPServer, c *models.ReqContext) bool { - return c.OrgRole == models.ROLE_ADMIN && - hs.Features.IsEnabled(featuremgmt.FlagServiceAccounts) && - hs.serviceAccountsService.Migrated(c.Req.Context(), c.OrgId) + return (c.OrgRole == models.ROLE_ADMIN || (hs.Cfg.EditorsCanAdmin && c.OrgRole == models.ROLE_EDITOR)) && + hs.Features.IsEnabled(featuremgmt.FlagServiceAccounts) } func enableTeams(hs *HTTPServer, c *models.ReqContext) bool { diff --git a/pkg/services/featuremgmt/registry.go b/pkg/services/featuremgmt/registry.go index 651ed0f3009..3763a03f094 100644 --- a/pkg/services/featuremgmt/registry.go +++ b/pkg/services/featuremgmt/registry.go @@ -13,19 +13,16 @@ var ( Description: "encrypt secrets", State: FeatureStateBeta, }, - { Name: "httpclientprovider_azure_auth", Description: "use http client for azure auth", State: FeatureStateBeta, }, { - Name: "service-accounts", - Description: "support service accounts", - State: FeatureStateBeta, - RequiresLicense: true, + Name: "service-accounts", + Description: "support service accounts", + State: FeatureStateBeta, }, - { Name: "database_metrics", Description: "Add prometheus metrics for database tables", diff --git a/pkg/services/serviceaccounts/api/api.go b/pkg/services/serviceaccounts/api/api.go index 985ad0f5637..c9891da1d75 100644 --- a/pkg/services/serviceaccounts/api/api.go +++ b/pkg/services/serviceaccounts/api/api.go @@ -47,7 +47,7 @@ func (api *ServiceAccountsAPI) RegisterAPIEndpoints( } auth := acmiddleware.Middleware(api.accesscontrol) - api.RouterRegister.Group("/api/org/serviceaccounts", func(serviceAccountsRoute routing.RouteRegister) { + api.RouterRegister.Group("/api/serviceaccounts", func(serviceAccountsRoute routing.RouteRegister) { serviceAccountsRoute.Get("/", auth(middleware.ReqOrgAdmin, accesscontrol.EvalPermission(serviceaccounts.ActionRead, serviceaccounts.ScopeAll)), routing.Wrap(api.ListServiceAccounts)) serviceAccountsRoute.Get("/:serviceAccountId", auth(middleware.ReqOrgAdmin, accesscontrol.EvalPermission(serviceaccounts.ActionRead, serviceaccounts.ScopeID)), routing.Wrap(api.RetrieveServiceAccount)) serviceAccountsRoute.Delete("/:serviceAccountId", auth(middleware.ReqOrgAdmin, accesscontrol.EvalPermission(serviceaccounts.ActionDelete, serviceaccounts.ScopeID)), routing.Wrap(api.DeleteServiceAccount)) diff --git a/pkg/services/serviceaccounts/api/api_test.go b/pkg/services/serviceaccounts/api/api_test.go index c02c7a815a2..4749974901a 100644 --- a/pkg/services/serviceaccounts/api/api_test.go +++ b/pkg/services/serviceaccounts/api/api_test.go @@ -24,7 +24,7 @@ import ( ) var ( - serviceaccountIDPath = "/api/org/serviceaccounts/%v" + serviceaccountIDPath = "/api/serviceaccounts/%v" ) // test the accesscontrol endpoints diff --git a/pkg/services/serviceaccounts/manager/service.go b/pkg/services/serviceaccounts/manager/service.go index a48576097cf..747a3ee3c2e 100644 --- a/pkg/services/serviceaccounts/manager/service.go +++ b/pkg/services/serviceaccounts/manager/service.go @@ -61,9 +61,3 @@ func (sa *ServiceAccountsService) DeleteServiceAccount(ctx context.Context, orgI } return sa.store.DeleteServiceAccount(ctx, orgID, serviceAccountID) } - -func (sa *ServiceAccountsService) Migrated(ctx context.Context, orgID int64) bool { - // TODO: implement migration logic - // change this to return true for development of service accounts page - return false -} diff --git a/pkg/services/serviceaccounts/serviceaccounts.go b/pkg/services/serviceaccounts/serviceaccounts.go index a5718ff9043..c1452e7d416 100644 --- a/pkg/services/serviceaccounts/serviceaccounts.go +++ b/pkg/services/serviceaccounts/serviceaccounts.go @@ -9,7 +9,6 @@ import ( type Service interface { CreateServiceAccount(ctx context.Context, saForm *CreateServiceaccountForm) (*models.User, error) DeleteServiceAccount(ctx context.Context, orgID, serviceAccountID int64) error - Migrated(ctx context.Context, orgID int64) bool } type Store interface { diff --git a/public/app/features/serviceaccounts/ServiceAccountsListPage.tsx b/public/app/features/serviceaccounts/ServiceAccountsListPage.tsx index cb73a7bc920..beb743f7da7 100644 --- a/public/app/features/serviceaccounts/ServiceAccountsListPage.tsx +++ b/public/app/features/serviceaccounts/ServiceAccountsListPage.tsx @@ -32,7 +32,7 @@ const mapDispatchToProps = { const connector = connect(mapStateToProps, mapDispatchToProps); -const ServiceAccountsListPage2: React.FC = ({ loadServiceAccounts, navModel, serviceAccounts, isLoading }) => { +const ServiceAccountsListPage: React.FC = ({ loadServiceAccounts, navModel, serviceAccounts, isLoading }) => { const styles = useStyles2(getStyles); useEffect(() => { @@ -184,4 +184,4 @@ const getStyles = (theme: GrafanaTheme2) => { }; }; -export default connector(ServiceAccountsListPage2); +export default connector(ServiceAccountsListPage); diff --git a/public/app/features/serviceaccounts/state/actions.ts b/public/app/features/serviceaccounts/state/actions.ts index 7066eb750f3..0e8be3f5f3e 100644 --- a/public/app/features/serviceaccounts/state/actions.ts +++ b/public/app/features/serviceaccounts/state/actions.ts @@ -3,7 +3,7 @@ import { getBackendSrv } from '@grafana/runtime'; import { ServiceAccountDTO } from 'app/types'; import { serviceAccountLoaded, serviceAccountsLoaded } from './reducers'; -const BASE_URL = `/api/org/serviceaccounts`; +const BASE_URL = `/api/serviceaccounts`; export function loadServiceAccount(id: number): ThunkResult { return async (dispatch) => {