mirror of https://github.com/portainer/portainer
fix(swagger): fix swagger api docs endpoint(s) rename to environment(s) EE-1661 (#5629)
* fix swagger api docs endpoint(s) rename to environment(s)pull/5680/head
parent
d911c50f1b
commit
dd808bb7bd
|
@ -4,7 +4,7 @@ You can find out more about Portainer at [http://portainer.io](http://portainer.
|
||||||
|
|
||||||
# Authentication
|
# Authentication
|
||||||
|
|
||||||
Most of the API endpoints require to be authenticated as well as some level of authorization to be used.
|
Most of the API environments(endpoints) require to be authenticated as well as some level of authorization to be used.
|
||||||
Portainer API uses JSON Web Token to manage authentication and thus requires you to provide a token in the **Authorization** header of each request
|
Portainer API uses JSON Web Token to manage authentication and thus requires you to provide a token in the **Authorization** header of each request
|
||||||
with the **Bearer** authentication mechanism.
|
with the **Bearer** authentication mechanism.
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIs
|
||||||
|
|
||||||
# Security
|
# Security
|
||||||
|
|
||||||
Each API endpoint has an associated access policy, it is documented in the description of each endpoint.
|
Each API environment(endpoint) has an associated access policy, it is documented in the description of each environment(endpoint).
|
||||||
|
|
||||||
Different access policies are available:
|
Different access policies are available:
|
||||||
|
|
||||||
|
@ -27,27 +27,27 @@ Different access policies are available:
|
||||||
|
|
||||||
### Public access
|
### Public access
|
||||||
|
|
||||||
No authentication is required to access the endpoints with this access policy.
|
No authentication is required to access the environments(endpoints) with this access policy.
|
||||||
|
|
||||||
### Authenticated access
|
### Authenticated access
|
||||||
|
|
||||||
Authentication is required to access the endpoints with this access policy.
|
Authentication is required to access the environments(endpoints) with this access policy.
|
||||||
|
|
||||||
### Restricted access
|
### Restricted access
|
||||||
|
|
||||||
Authentication is required to access the endpoints with this access policy.
|
Authentication is required to access the environments(endpoints) with this access policy.
|
||||||
Extra-checks might be added to ensure access to the resource is granted. Returned data might also be filtered.
|
Extra-checks might be added to ensure access to the resource is granted. Returned data might also be filtered.
|
||||||
|
|
||||||
### Administrator access
|
### Administrator access
|
||||||
|
|
||||||
Authentication as well as an administrator role are required to access the endpoints with this access policy.
|
Authentication as well as an administrator role are required to access the environments(endpoints) with this access policy.
|
||||||
|
|
||||||
# Execute Docker requests
|
# Execute Docker requests
|
||||||
|
|
||||||
Portainer **DO NOT** expose specific endpoints to manage your Docker resources (create a container, remove a volume, etc...).
|
Portainer **DO NOT** expose specific environments(endpoints) to manage your Docker resources (create a container, remove a volume, etc...).
|
||||||
|
|
||||||
Instead, it acts as a reverse-proxy to the Docker HTTP API. This means that you can execute Docker requests **via** the Portainer HTTP API.
|
Instead, it acts as a reverse-proxy to the Docker HTTP API. This means that you can execute Docker requests **via** the Portainer HTTP API.
|
||||||
|
|
||||||
To do so, you can use the `/endpoints/{id}/docker` Portainer API endpoint (which is not documented below due to Swagger limitations). This endpoint has a restricted access policy so you still need to be authenticated to be able to query this endpoint. Any query on this endpoint will be proxied to the Docker API of the associated endpoint (requests and responses objects are the same as documented in the Docker API).
|
To do so, you can use the `/endpoints/{id}/docker` Portainer API environment(endpoint) (which is not documented below due to Swagger limitations). This environment(endpoint) has a restricted access policy so you still need to be authenticated to be able to query this environment(endpoint). Any query on this environment(endpoint) will be proxied to the Docker API of the associated environment(endpoint) (requests and responses objects are the same as documented in the Docker API).
|
||||||
|
|
||||||
**NOTE**: You can find more information on how to query the Docker API in the [Docker official documentation](https://docs.docker.com/engine/api/v1.30/) as well as in [this Portainer example](https://documentation.portainer.io/api/api-examples/).
|
**NOTE**: You can find more information on how to query the Docker API in the [Docker official documentation](https://docs.docker.com/engine/api/v1.30/) as well as in [this Portainer example](https://documentation.portainer.io/api/api-examples/).
|
||||||
|
|
|
@ -95,7 +95,7 @@ func (service *Service) DeleteEdgeJob(ID portainer.EdgeJobID) error {
|
||||||
return internal.DeleteObject(service.connection, BucketName, identifier)
|
return internal.DeleteObject(service.connection, BucketName, identifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetNextIdentifier returns the next identifier for an endpoint.
|
// GetNextIdentifier returns the next identifier for an environment(endpoint).
|
||||||
func (service *Service) GetNextIdentifier() int {
|
func (service *Service) GetNextIdentifier() int {
|
||||||
return internal.GetNextIdentifier(service.connection, BucketName)
|
return internal.GetNextIdentifier(service.connection, BucketName)
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,7 +95,7 @@ func (service *Service) DeleteEdgeStack(ID portainer.EdgeStackID) error {
|
||||||
return internal.DeleteObject(service.connection, BucketName, identifier)
|
return internal.DeleteObject(service.connection, BucketName, identifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetNextIdentifier returns the next identifier for an endpoint.
|
// GetNextIdentifier returns the next identifier for an environment(endpoint).
|
||||||
func (service *Service) GetNextIdentifier() int {
|
func (service *Service) GetNextIdentifier() int {
|
||||||
return internal.GetNextIdentifier(service.connection, BucketName)
|
return internal.GetNextIdentifier(service.connection, BucketName)
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ const (
|
||||||
BucketName = "endpoints"
|
BucketName = "endpoints"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Service represents a service for managing endpoint data.
|
// Service represents a service for managing environment(endpoint) data.
|
||||||
type Service struct {
|
type Service struct {
|
||||||
connection *internal.DbConnection
|
connection *internal.DbConnection
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,7 @@ func NewService(connection *internal.DbConnection) (*Service, error) {
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Endpoint returns an endpoint by ID.
|
// Endpoint returns an environment(endpoint) by ID.
|
||||||
func (service *Service) Endpoint(ID portainer.EndpointID) (*portainer.Endpoint, error) {
|
func (service *Service) Endpoint(ID portainer.EndpointID) (*portainer.Endpoint, error) {
|
||||||
var endpoint portainer.Endpoint
|
var endpoint portainer.Endpoint
|
||||||
identifier := internal.Itob(int(ID))
|
identifier := internal.Itob(int(ID))
|
||||||
|
@ -41,19 +41,19 @@ func (service *Service) Endpoint(ID portainer.EndpointID) (*portainer.Endpoint,
|
||||||
return &endpoint, nil
|
return &endpoint, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdateEndpoint updates an endpoint.
|
// UpdateEndpoint updates an environment(endpoint).
|
||||||
func (service *Service) UpdateEndpoint(ID portainer.EndpointID, endpoint *portainer.Endpoint) error {
|
func (service *Service) UpdateEndpoint(ID portainer.EndpointID, endpoint *portainer.Endpoint) error {
|
||||||
identifier := internal.Itob(int(ID))
|
identifier := internal.Itob(int(ID))
|
||||||
return internal.UpdateObject(service.connection, BucketName, identifier, endpoint)
|
return internal.UpdateObject(service.connection, BucketName, identifier, endpoint)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteEndpoint deletes an endpoint.
|
// DeleteEndpoint deletes an environment(endpoint).
|
||||||
func (service *Service) DeleteEndpoint(ID portainer.EndpointID) error {
|
func (service *Service) DeleteEndpoint(ID portainer.EndpointID) error {
|
||||||
identifier := internal.Itob(int(ID))
|
identifier := internal.Itob(int(ID))
|
||||||
return internal.DeleteObject(service.connection, BucketName, identifier)
|
return internal.DeleteObject(service.connection, BucketName, identifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Endpoints return an array containing all the endpoints.
|
// Endpoints return an array containing all the environments(endpoints).
|
||||||
func (service *Service) Endpoints() ([]portainer.Endpoint, error) {
|
func (service *Service) Endpoints() ([]portainer.Endpoint, error) {
|
||||||
var endpoints = make([]portainer.Endpoint, 0)
|
var endpoints = make([]portainer.Endpoint, 0)
|
||||||
|
|
||||||
|
@ -76,12 +76,12 @@ func (service *Service) Endpoints() ([]portainer.Endpoint, error) {
|
||||||
return endpoints, err
|
return endpoints, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateEndpoint assign an ID to a new endpoint and saves it.
|
// CreateEndpoint assign an ID to a new environment(endpoint) and saves it.
|
||||||
func (service *Service) CreateEndpoint(endpoint *portainer.Endpoint) error {
|
func (service *Service) CreateEndpoint(endpoint *portainer.Endpoint) error {
|
||||||
return service.connection.Update(func(tx *bolt.Tx) error {
|
return service.connection.Update(func(tx *bolt.Tx) error {
|
||||||
bucket := tx.Bucket([]byte(BucketName))
|
bucket := tx.Bucket([]byte(BucketName))
|
||||||
|
|
||||||
// We manually manage sequences for endpoints
|
// We manually manage sequences for environments(endpoints)
|
||||||
err := bucket.SetSequence(uint64(endpoint.ID))
|
err := bucket.SetSequence(uint64(endpoint.ID))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -96,12 +96,12 @@ func (service *Service) CreateEndpoint(endpoint *portainer.Endpoint) error {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetNextIdentifier returns the next identifier for an endpoint.
|
// GetNextIdentifier returns the next identifier for an environment(endpoint).
|
||||||
func (service *Service) GetNextIdentifier() int {
|
func (service *Service) GetNextIdentifier() int {
|
||||||
return internal.GetNextIdentifier(service.connection, BucketName)
|
return internal.GetNextIdentifier(service.connection, BucketName)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Synchronize creates, updates and deletes endpoints inside a single transaction.
|
// Synchronize creates, updates and deletes environments(endpoints) inside a single transaction.
|
||||||
func (service *Service) Synchronize(toCreate, toUpdate, toDelete []*portainer.Endpoint) error {
|
func (service *Service) Synchronize(toCreate, toUpdate, toDelete []*portainer.Endpoint) error {
|
||||||
return service.connection.Update(func(tx *bolt.Tx) error {
|
return service.connection.Update(func(tx *bolt.Tx) error {
|
||||||
bucket := tx.Bucket([]byte(BucketName))
|
bucket := tx.Bucket([]byte(BucketName))
|
||||||
|
|
|
@ -12,7 +12,7 @@ const (
|
||||||
BucketName = "endpoint_groups"
|
BucketName = "endpoint_groups"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Service represents a service for managing endpoint data.
|
// Service represents a service for managing environment(endpoint) data.
|
||||||
type Service struct {
|
type Service struct {
|
||||||
connection *internal.DbConnection
|
connection *internal.DbConnection
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ func NewService(connection *internal.DbConnection) (*Service, error) {
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// EndpointGroup returns an endpoint group by ID.
|
// EndpointGroup returns an environment(endpoint) group by ID.
|
||||||
func (service *Service) EndpointGroup(ID portainer.EndpointGroupID) (*portainer.EndpointGroup, error) {
|
func (service *Service) EndpointGroup(ID portainer.EndpointGroupID) (*portainer.EndpointGroup, error) {
|
||||||
var endpointGroup portainer.EndpointGroup
|
var endpointGroup portainer.EndpointGroup
|
||||||
identifier := internal.Itob(int(ID))
|
identifier := internal.Itob(int(ID))
|
||||||
|
@ -42,19 +42,19 @@ func (service *Service) EndpointGroup(ID portainer.EndpointGroupID) (*portainer.
|
||||||
return &endpointGroup, nil
|
return &endpointGroup, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdateEndpointGroup updates an endpoint group.
|
// UpdateEndpointGroup updates an environment(endpoint) group.
|
||||||
func (service *Service) UpdateEndpointGroup(ID portainer.EndpointGroupID, endpointGroup *portainer.EndpointGroup) error {
|
func (service *Service) UpdateEndpointGroup(ID portainer.EndpointGroupID, endpointGroup *portainer.EndpointGroup) error {
|
||||||
identifier := internal.Itob(int(ID))
|
identifier := internal.Itob(int(ID))
|
||||||
return internal.UpdateObject(service.connection, BucketName, identifier, endpointGroup)
|
return internal.UpdateObject(service.connection, BucketName, identifier, endpointGroup)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteEndpointGroup deletes an endpoint group.
|
// DeleteEndpointGroup deletes an environment(endpoint) group.
|
||||||
func (service *Service) DeleteEndpointGroup(ID portainer.EndpointGroupID) error {
|
func (service *Service) DeleteEndpointGroup(ID portainer.EndpointGroupID) error {
|
||||||
identifier := internal.Itob(int(ID))
|
identifier := internal.Itob(int(ID))
|
||||||
return internal.DeleteObject(service.connection, BucketName, identifier)
|
return internal.DeleteObject(service.connection, BucketName, identifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
// EndpointGroups return an array containing all the endpoint groups.
|
// EndpointGroups return an array containing all the environment(endpoint) groups.
|
||||||
func (service *Service) EndpointGroups() ([]portainer.EndpointGroup, error) {
|
func (service *Service) EndpointGroups() ([]portainer.EndpointGroup, error) {
|
||||||
var endpointGroups = make([]portainer.EndpointGroup, 0)
|
var endpointGroups = make([]portainer.EndpointGroup, 0)
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ func (service *Service) EndpointGroups() ([]portainer.EndpointGroup, error) {
|
||||||
return endpointGroups, err
|
return endpointGroups, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateEndpointGroup assign an ID to a new endpoint group and saves it.
|
// CreateEndpointGroup assign an ID to a new environment(endpoint) group and saves it.
|
||||||
func (service *Service) CreateEndpointGroup(endpointGroup *portainer.EndpointGroup) error {
|
func (service *Service) CreateEndpointGroup(endpointGroup *portainer.EndpointGroup) error {
|
||||||
return service.connection.Update(func(tx *bolt.Tx) error {
|
return service.connection.Update(func(tx *bolt.Tx) error {
|
||||||
bucket := tx.Bucket([]byte(BucketName))
|
bucket := tx.Bucket([]byte(BucketName))
|
||||||
|
|
|
@ -11,7 +11,7 @@ const (
|
||||||
BucketName = "endpoint_relations"
|
BucketName = "endpoint_relations"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Service represents a service for managing endpoint relation data.
|
// Service represents a service for managing environment(endpoint) relation data.
|
||||||
type Service struct {
|
type Service struct {
|
||||||
connection *internal.DbConnection
|
connection *internal.DbConnection
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,7 @@ func NewService(connection *internal.DbConnection) (*Service, error) {
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// EndpointRelation returns a Endpoint relation object by EndpointID
|
// EndpointRelation returns a Environment(Endpoint) relation object by EndpointID
|
||||||
func (service *Service) EndpointRelation(endpointID portainer.EndpointID) (*portainer.EndpointRelation, error) {
|
func (service *Service) EndpointRelation(endpointID portainer.EndpointID) (*portainer.EndpointRelation, error) {
|
||||||
var endpointRelation portainer.EndpointRelation
|
var endpointRelation portainer.EndpointRelation
|
||||||
identifier := internal.Itob(int(endpointID))
|
identifier := internal.Itob(int(endpointID))
|
||||||
|
@ -55,13 +55,13 @@ func (service *Service) CreateEndpointRelation(endpointRelation *portainer.Endpo
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdateEndpointRelation updates an Endpoint relation object
|
// UpdateEndpointRelation updates an Environment(Endpoint) relation object
|
||||||
func (service *Service) UpdateEndpointRelation(EndpointID portainer.EndpointID, endpointRelation *portainer.EndpointRelation) error {
|
func (service *Service) UpdateEndpointRelation(EndpointID portainer.EndpointID, endpointRelation *portainer.EndpointRelation) error {
|
||||||
identifier := internal.Itob(int(EndpointID))
|
identifier := internal.Itob(int(EndpointID))
|
||||||
return internal.UpdateObject(service.connection, BucketName, identifier, endpointRelation)
|
return internal.UpdateObject(service.connection, BucketName, identifier, endpointRelation)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteEndpointRelation deletes an Endpoint relation object
|
// DeleteEndpointRelation deletes an Environment(Endpoint) relation object
|
||||||
func (service *Service) DeleteEndpointRelation(EndpointID portainer.EndpointID) error {
|
func (service *Service) DeleteEndpointRelation(EndpointID portainer.EndpointID) error {
|
||||||
identifier := internal.Itob(int(EndpointID))
|
identifier := internal.Itob(int(EndpointID))
|
||||||
return internal.DeleteObject(service.connection, BucketName, identifier)
|
return internal.DeleteObject(service.connection, BucketName, identifier)
|
||||||
|
|
|
@ -12,7 +12,7 @@ const (
|
||||||
BucketName = "extension"
|
BucketName = "extension"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Service represents a service for managing endpoint data.
|
// Service represents a service for managing environment(endpoint) data.
|
||||||
type Service struct {
|
type Service struct {
|
||||||
connection *internal.DbConnection
|
connection *internal.DbConnection
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ const (
|
||||||
BucketName = "helm_user_repository"
|
BucketName = "helm_user_repository"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Service represents a service for managing endpoint data.
|
// Service represents a service for managing environment(endpoint) data.
|
||||||
type Service struct {
|
type Service struct {
|
||||||
connection *internal.DbConnection
|
connection *internal.DbConnection
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ func UnmarshalObject(data []byte, object interface{}) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalObjectWithJsoniter decodes an object from binary data
|
// UnmarshalObjectWithJsoniter decodes an object from binary data
|
||||||
// using the jsoniter library. It is mainly used to accelerate endpoint
|
// using the jsoniter library. It is mainly used to accelerate environment(endpoint)
|
||||||
// decoding at the moment.
|
// decoding at the moment.
|
||||||
func UnmarshalObjectWithJsoniter(data []byte, object interface{}) error {
|
func UnmarshalObjectWithJsoniter(data []byte, object interface{}) error {
|
||||||
var jsoni = jsoniter.ConfigCompatibleWithStandardLibrary
|
var jsoni = jsoniter.ConfigCompatibleWithStandardLibrary
|
||||||
|
|
|
@ -12,7 +12,7 @@ const (
|
||||||
BucketName = "registries"
|
BucketName = "registries"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Service represents a service for managing endpoint data.
|
// Service represents a service for managing environment(endpoint) data.
|
||||||
type Service struct {
|
type Service struct {
|
||||||
connection *internal.DbConnection
|
connection *internal.DbConnection
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ const (
|
||||||
BucketName = "resource_control"
|
BucketName = "resource_control"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Service represents a service for managing endpoint data.
|
// Service represents a service for managing environment(endpoint) data.
|
||||||
type Service struct {
|
type Service struct {
|
||||||
connection *internal.DbConnection
|
connection *internal.DbConnection
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ const (
|
||||||
BucketName = "roles"
|
BucketName = "roles"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Service represents a service for managing endpoint data.
|
// Service represents a service for managing environment(endpoint) data.
|
||||||
type Service struct {
|
type Service struct {
|
||||||
connection *internal.DbConnection
|
connection *internal.DbConnection
|
||||||
}
|
}
|
||||||
|
|
|
@ -196,7 +196,7 @@ func (store *Store) EdgeStack() portainer.EdgeStackService {
|
||||||
return store.EdgeStackService
|
return store.EdgeStackService
|
||||||
}
|
}
|
||||||
|
|
||||||
// Endpoint gives access to the Endpoint data management layer
|
// Environment(Endpoint) gives access to the Environment(Endpoint) data management layer
|
||||||
func (store *Store) Endpoint() portainer.EndpointService {
|
func (store *Store) Endpoint() portainer.EndpointService {
|
||||||
return store.EndpointService
|
return store.EndpointService
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ const (
|
||||||
settingsKey = "SETTINGS"
|
settingsKey = "SETTINGS"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Service represents a service for managing endpoint data.
|
// Service represents a service for managing environment(endpoint) data.
|
||||||
type Service struct {
|
type Service struct {
|
||||||
connection *internal.DbConnection
|
connection *internal.DbConnection
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ const (
|
||||||
BucketName = "stacks"
|
BucketName = "stacks"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Service represents a service for managing endpoint data.
|
// Service represents a service for managing environment(endpoint) data.
|
||||||
type Service struct {
|
type Service struct {
|
||||||
connection *internal.DbConnection
|
connection *internal.DbConnection
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ const (
|
||||||
BucketName = "tags"
|
BucketName = "tags"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Service represents a service for managing endpoint data.
|
// Service represents a service for managing environment(endpoint) data.
|
||||||
type Service struct {
|
type Service struct {
|
||||||
connection *internal.DbConnection
|
connection *internal.DbConnection
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@ const (
|
||||||
BucketName = "teams"
|
BucketName = "teams"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Service represents a service for managing endpoint data.
|
// Service represents a service for managing environment(endpoint) data.
|
||||||
type Service struct {
|
type Service struct {
|
||||||
connection *internal.DbConnection
|
connection *internal.DbConnection
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ const (
|
||||||
BucketName = "team_membership"
|
BucketName = "team_membership"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Service represents a service for managing endpoint data.
|
// Service represents a service for managing environment(endpoint) data.
|
||||||
type Service struct {
|
type Service struct {
|
||||||
connection *internal.DbConnection
|
connection *internal.DbConnection
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ const (
|
||||||
infoKey = "INFO"
|
infoKey = "INFO"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Service represents a service for managing endpoint data.
|
// Service represents a service for managing environment(endpoint) data.
|
||||||
type Service struct {
|
type Service struct {
|
||||||
connection *internal.DbConnection
|
connection *internal.DbConnection
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@ const (
|
||||||
BucketName = "users"
|
BucketName = "users"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Service represents a service for managing endpoint data.
|
// Service represents a service for managing environment(endpoint) data.
|
||||||
type Service struct {
|
type Service struct {
|
||||||
connection *internal.DbConnection
|
connection *internal.DbConnection
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ import (
|
||||||
portainer "github.com/portainer/portainer/api"
|
portainer "github.com/portainer/portainer/api"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AddEdgeJob register an EdgeJob inside the tunnel details associated to an endpoint.
|
// AddEdgeJob register an EdgeJob inside the tunnel details associated to an environment(endpoint).
|
||||||
func (service *Service) AddEdgeJob(endpointID portainer.EndpointID, edgeJob *portainer.EdgeJob) {
|
func (service *Service) AddEdgeJob(endpointID portainer.EndpointID, edgeJob *portainer.EdgeJob) {
|
||||||
tunnel := service.GetTunnelDetails(endpointID)
|
tunnel := service.GetTunnelDetails(endpointID)
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ func randomInt(min, max int) int {
|
||||||
return min + rand.Intn(max-min)
|
return min + rand.Intn(max-min)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetTunnelDetails returns information about the tunnel associated to an endpoint.
|
// GetTunnelDetails returns information about the tunnel associated to an environment(endpoint).
|
||||||
func (service *Service) GetTunnelDetails(endpointID portainer.EndpointID) *portainer.TunnelDetails {
|
func (service *Service) GetTunnelDetails(endpointID portainer.EndpointID) *portainer.TunnelDetails {
|
||||||
key := strconv.Itoa(int(endpointID))
|
key := strconv.Itoa(int(endpointID))
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ func (service *Service) GetTunnelDetails(endpointID portainer.EndpointID) *porta
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetTunnelStatusToActive update the status of the tunnel associated to the specified endpoint.
|
// SetTunnelStatusToActive update the status of the tunnel associated to the specified environment(endpoint).
|
||||||
// It sets the status to ACTIVE.
|
// It sets the status to ACTIVE.
|
||||||
func (service *Service) SetTunnelStatusToActive(endpointID portainer.EndpointID) {
|
func (service *Service) SetTunnelStatusToActive(endpointID portainer.EndpointID) {
|
||||||
tunnel := service.GetTunnelDetails(endpointID)
|
tunnel := service.GetTunnelDetails(endpointID)
|
||||||
|
@ -68,7 +68,7 @@ func (service *Service) SetTunnelStatusToActive(endpointID portainer.EndpointID)
|
||||||
service.tunnelDetailsMap.Set(key, tunnel)
|
service.tunnelDetailsMap.Set(key, tunnel)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetTunnelStatusToIdle update the status of the tunnel associated to the specified endpoint.
|
// SetTunnelStatusToIdle update the status of the tunnel associated to the specified environment(endpoint).
|
||||||
// It sets the status to IDLE.
|
// It sets the status to IDLE.
|
||||||
// It removes any existing credentials associated to the tunnel.
|
// It removes any existing credentials associated to the tunnel.
|
||||||
func (service *Service) SetTunnelStatusToIdle(endpointID portainer.EndpointID) {
|
func (service *Service) SetTunnelStatusToIdle(endpointID portainer.EndpointID) {
|
||||||
|
@ -88,11 +88,11 @@ func (service *Service) SetTunnelStatusToIdle(endpointID portainer.EndpointID) {
|
||||||
service.tunnelDetailsMap.Set(key, tunnel)
|
service.tunnelDetailsMap.Set(key, tunnel)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetTunnelStatusToRequired update the status of the tunnel associated to the specified endpoint.
|
// SetTunnelStatusToRequired update the status of the tunnel associated to the specified environment(endpoint).
|
||||||
// It sets the status to REQUIRED.
|
// It sets the status to REQUIRED.
|
||||||
// If no port is currently associated to the tunnel, it will associate a random unused port to the tunnel
|
// If no port is currently associated to the tunnel, it will associate a random unused port to the tunnel
|
||||||
// and generate temporary credentials that can be used to establish a reverse tunnel on that port.
|
// and generate temporary credentials that can be used to establish a reverse tunnel on that port.
|
||||||
// Credentials are encrypted using the Edge ID associated to the endpoint.
|
// Credentials are encrypted using the Edge ID associated to the environment(endpoint).
|
||||||
func (service *Service) SetTunnelStatusToRequired(endpointID portainer.EndpointID) error {
|
func (service *Service) SetTunnelStatusToRequired(endpointID portainer.EndpointID) error {
|
||||||
tunnel := service.GetTunnelDetails(endpointID)
|
tunnel := service.GetTunnelDetails(endpointID)
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
// ECDSAService is a service used to create digital signatures when communicating with
|
// ECDSAService is a service used to create digital signatures when communicating with
|
||||||
// an agent based environment. It will automatically generates a key pair using ECDSA or
|
// an agent based environment(endpoint). It will automatically generates a key pair using ECDSA or
|
||||||
// can also reuse an existing ECDSA key pair.
|
// can also reuse an existing ECDSA key pair.
|
||||||
type ECDSAService struct {
|
type ECDSAService struct {
|
||||||
privateKey *ecdsa.PrivateKey
|
privateKey *ecdsa.PrivateKey
|
||||||
|
|
|
@ -34,8 +34,8 @@ func NewClientFactory(signatureService portainer.DigitalSignatureService, revers
|
||||||
}
|
}
|
||||||
|
|
||||||
// createClient is a generic function to create a Docker client based on
|
// createClient is a generic function to create a Docker client based on
|
||||||
// a specific endpoint configuration. The nodeName parameter can be used
|
// a specific environment(endpoint) configuration. The nodeName parameter can be used
|
||||||
// with an agent enabled endpoint to target a specific node in an agent cluster.
|
// with an agent enabled environment(endpoint) to target a specific node in an agent cluster.
|
||||||
func (factory *ClientFactory) CreateClient(endpoint *portainer.Endpoint, nodeName string) (*client.Client, error) {
|
func (factory *ClientFactory) CreateClient(endpoint *portainer.Endpoint, nodeName string) (*client.Client, error) {
|
||||||
if endpoint.Type == portainer.AzureEnvironment {
|
if endpoint.Type == portainer.AzureEnvironment {
|
||||||
return nil, errUnsupportedEnvironmentType
|
return nil, errUnsupportedEnvironmentType
|
||||||
|
|
|
@ -12,7 +12,7 @@ import (
|
||||||
"github.com/portainer/portainer/api"
|
"github.com/portainer/portainer/api"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Snapshotter represents a service used to create endpoint snapshots
|
// Snapshotter represents a service used to create environment(endpoint) snapshots
|
||||||
type Snapshotter struct {
|
type Snapshotter struct {
|
||||||
clientFactory *ClientFactory
|
clientFactory *ClientFactory
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ func NewSnapshotter(clientFactory *ClientFactory) *Snapshotter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateSnapshot creates a snapshot of a specific Docker endpoint
|
// CreateSnapshot creates a snapshot of a specific Docker environment(endpoint)
|
||||||
func (snapshotter *Snapshotter) CreateSnapshot(endpoint *portainer.Endpoint) (*portainer.DockerSnapshot, error) {
|
func (snapshotter *Snapshotter) CreateSnapshot(endpoint *portainer.Endpoint) (*portainer.DockerSnapshot, error) {
|
||||||
cli, err := snapshotter.clientFactory.CreateClient(endpoint, "")
|
cli, err := snapshotter.clientFactory.CreateClient(endpoint, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -22,7 +22,7 @@ import (
|
||||||
"github.com/portainer/portainer/api/crypto"
|
"github.com/portainer/portainer/api/crypto"
|
||||||
)
|
)
|
||||||
|
|
||||||
// KubernetesDeployer represents a service to deploy resources inside a Kubernetes environment.
|
// KubernetesDeployer represents a service to deploy resources inside a Kubernetes environment(endpoint).
|
||||||
type KubernetesDeployer struct {
|
type KubernetesDeployer struct {
|
||||||
binaryPath string
|
binaryPath string
|
||||||
dataStore portainer.DataStore
|
dataStore portainer.DataStore
|
||||||
|
@ -77,7 +77,7 @@ func (deployer *KubernetesDeployer) getToken(request *http.Request, endpoint *po
|
||||||
return token, nil
|
return token, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deploy will deploy a Kubernetes manifest inside a specific namespace in a Kubernetes endpoint.
|
// Deploy will deploy a Kubernetes manifest inside a specific namespace in a Kubernetes environment(endpoint).
|
||||||
// Otherwise it will use kubectl to deploy the manifest.
|
// Otherwise it will use kubectl to deploy the manifest.
|
||||||
func (deployer *KubernetesDeployer) Deploy(request *http.Request, endpoint *portainer.Endpoint, stackConfig string, namespace string) (string, error) {
|
func (deployer *KubernetesDeployer) Deploy(request *http.Request, endpoint *portainer.Endpoint, stackConfig string, namespace string) (string, error) {
|
||||||
if endpoint.Type == portainer.KubernetesLocalEnvironment {
|
if endpoint.Type == portainer.KubernetesLocalEnvironment {
|
||||||
|
|
|
@ -288,7 +288,7 @@ func (service *Service) StoreTLSFileFromBytes(folder string, fileType portainer.
|
||||||
return path.Join(service.fileStorePath, tlsFilePath), nil
|
return path.Join(service.fileStorePath, tlsFilePath), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPathForTLSFile returns the absolute path to a specific TLS file for an endpoint.
|
// GetPathForTLSFile returns the absolute path to a specific TLS file for an environment(endpoint).
|
||||||
func (service *Service) GetPathForTLSFile(folder string, fileType portainer.TLSFileType) (string, error) {
|
func (service *Service) GetPathForTLSFile(folder string, fileType portainer.TLSFileType) (string, error) {
|
||||||
var fileName string
|
var fileName string
|
||||||
switch fileType {
|
switch fileType {
|
||||||
|
|
|
@ -102,7 +102,7 @@ func Get(url string, timeout int) ([]byte, error) {
|
||||||
return body, nil
|
return body, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExecutePingOperation will send a SystemPing operation HTTP request to a Docker environment
|
// ExecutePingOperation will send a SystemPing operation HTTP request to a Docker environment(endpoint)
|
||||||
// using the specified host and optional TLS configuration.
|
// using the specified host and optional TLS configuration.
|
||||||
// It uses a new Http.Client for each operation.
|
// It uses a new Http.Client for each operation.
|
||||||
func ExecutePingOperation(host string, tlsConfig *tls.Config) (bool, error) {
|
func ExecutePingOperation(host string, tlsConfig *tls.Config) (bool, error) {
|
||||||
|
|
|
@ -3,7 +3,7 @@ package errors
|
||||||
import "errors"
|
import "errors"
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// ErrEndpointAccessDenied Access denied to endpoint error
|
// ErrEndpointAccessDenied Access denied to environment(endpoint) error
|
||||||
ErrEndpointAccessDenied = errors.New("Access denied to environment")
|
ErrEndpointAccessDenied = errors.New("Access denied to environment")
|
||||||
// ErrUnauthorized Unauthorized error
|
// ErrUnauthorized Unauthorized error
|
||||||
ErrUnauthorized = errors.New("Unauthorized")
|
ErrUnauthorized = errors.New("Unauthorized")
|
||||||
|
|
|
@ -39,7 +39,7 @@ func (payload *authenticatePayload) Validate(r *http.Request) error {
|
||||||
|
|
||||||
// @id AuthenticateUser
|
// @id AuthenticateUser
|
||||||
// @summary Authenticate
|
// @summary Authenticate
|
||||||
// @description Use this endpoint to authenticate against Portainer using a username and password.
|
// @description Use this environment(endpoint) to authenticate against Portainer using a username and password.
|
||||||
// @tags auth
|
// @tags auth
|
||||||
// @accept json
|
// @accept json
|
||||||
// @produce json
|
// @produce json
|
||||||
|
|
|
@ -10,7 +10,7 @@ import (
|
||||||
"github.com/portainer/portainer/api/internal/authorization"
|
"github.com/portainer/portainer/api/internal/authorization"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Handler is the HTTP handler used to handle endpoint group operations.
|
// Handler is the HTTP handler used to handle environment(endpoint) group operations.
|
||||||
type Handler struct {
|
type Handler struct {
|
||||||
*mux.Router
|
*mux.Router
|
||||||
DataStore portainer.DataStore
|
DataStore portainer.DataStore
|
||||||
|
@ -18,7 +18,7 @@ type Handler struct {
|
||||||
GitService portainer.GitService
|
GitService portainer.GitService
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewHandler creates a handler to manage endpoint group operations.
|
// NewHandler creates a handler to manage environment(endpoint) group operations.
|
||||||
func NewHandler(bouncer *security.RequestBouncer) *Handler {
|
func NewHandler(bouncer *security.RequestBouncer) *Handler {
|
||||||
h := &Handler{
|
h := &Handler{
|
||||||
Router: mux.NewRouter(),
|
Router: mux.NewRouter(),
|
||||||
|
|
|
@ -9,13 +9,13 @@ import (
|
||||||
"github.com/portainer/portainer/api/http/security"
|
"github.com/portainer/portainer/api/http/security"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Handler is the HTTP handler used to handle endpoint group operations.
|
// Handler is the HTTP handler used to handle environment(endpoint) group operations.
|
||||||
type Handler struct {
|
type Handler struct {
|
||||||
*mux.Router
|
*mux.Router
|
||||||
DataStore portainer.DataStore
|
DataStore portainer.DataStore
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewHandler creates a handler to manage endpoint group operations.
|
// NewHandler creates a handler to manage environment(endpoint) group operations.
|
||||||
func NewHandler(bouncer *security.RequestBouncer) *Handler {
|
func NewHandler(bouncer *security.RequestBouncer) *Handler {
|
||||||
h := &Handler{
|
h := &Handler{
|
||||||
Router: mux.NewRouter(),
|
Router: mux.NewRouter(),
|
||||||
|
|
|
@ -67,8 +67,8 @@ type swarmStackFromFileContentPayload struct {
|
||||||
EdgeGroups []portainer.EdgeGroupID `example:"1"`
|
EdgeGroups []portainer.EdgeGroupID `example:"1"`
|
||||||
// Deployment type to deploy this stack
|
// Deployment type to deploy this stack
|
||||||
// Valid values are: 0 - 'compose', 1 - 'kubernetes'
|
// Valid values are: 0 - 'compose', 1 - 'kubernetes'
|
||||||
// for compose stacks will use kompose to convert to kubernetes manifest for kubernetes endpoints
|
// for compose stacks will use kompose to convert to kubernetes manifest for kubernetes environments(endpoints)
|
||||||
// kubernetes deploytype is enabled only for kubernetes endpoints
|
// kubernetes deploytype is enabled only for kubernetes environments(endpoints)
|
||||||
DeploymentType portainer.EdgeStackDeploymentType `example:"0" enums:"0,1"`
|
DeploymentType portainer.EdgeStackDeploymentType `example:"0" enums:"0,1"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,8 +185,8 @@ type swarmStackFromGitRepositoryPayload struct {
|
||||||
EdgeGroups []portainer.EdgeGroupID `example:"1"`
|
EdgeGroups []portainer.EdgeGroupID `example:"1"`
|
||||||
// Deployment type to deploy this stack
|
// Deployment type to deploy this stack
|
||||||
// Valid values are: 0 - 'compose', 1 - 'kubernetes'
|
// Valid values are: 0 - 'compose', 1 - 'kubernetes'
|
||||||
// for compose stacks will use kompose to convert to kubernetes manifest for kubernetes endpoints
|
// for compose stacks will use kompose to convert to kubernetes manifest for kubernetes environments(endpoints)
|
||||||
// kubernetes deploytype is enabled only for kubernetes endpoints
|
// kubernetes deploytype is enabled only for kubernetes environments(endpoints)
|
||||||
DeploymentType portainer.EdgeStackDeploymentType `example:"0" enums:"0,1"`
|
DeploymentType portainer.EdgeStackDeploymentType `example:"0" enums:"0,1"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -402,7 +402,7 @@ func (handler *Handler) validateUniqueName(name string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// updateEndpointRelations adds a relation between the Edge Stack to the related endpoints
|
// updateEndpointRelations adds a relation between the Edge Stack to the related environments(endpoints)
|
||||||
func updateEndpointRelations(endpointRelationService portainer.EndpointRelationService, edgeStackID portainer.EdgeStackID, relatedEndpointIds []portainer.EndpointID) error {
|
func updateEndpointRelations(endpointRelationService portainer.EndpointRelationService, edgeStackID portainer.EdgeStackID, relatedEndpointIds []portainer.EndpointID) error {
|
||||||
for _, endpointID := range relatedEndpointIds {
|
for _, endpointID := range relatedEndpointIds {
|
||||||
relation, err := endpointRelationService.EndpointRelation(endpointID)
|
relation, err := endpointRelationService.EndpointRelation(endpointID)
|
||||||
|
|
|
@ -33,7 +33,7 @@ func (payload *updateStatusPayload) Validate(r *http.Request) error {
|
||||||
|
|
||||||
// @id EdgeStackStatusUpdate
|
// @id EdgeStackStatusUpdate
|
||||||
// @summary Update an EdgeStack status
|
// @summary Update an EdgeStack status
|
||||||
// @description Authorized only if the request is done by an Edge Endpoint
|
// @description Authorized only if the request is done by an Edge Environment(Endpoint)
|
||||||
// @tags edge_stacks
|
// @tags edge_stacks
|
||||||
// @accept json
|
// @accept json
|
||||||
// @produce json
|
// @produce json
|
||||||
|
|
|
@ -164,11 +164,11 @@ func (handler *Handler) edgeStackUpdate(w http.ResponseWriter, r *http.Request)
|
||||||
|
|
||||||
hasDockerEndpoint, err := hasDockerEndpoint(handler.DataStore.Endpoint(), relatedEndpointIds)
|
hasDockerEndpoint, err := hasDockerEndpoint(handler.DataStore.Endpoint(), relatedEndpointIds)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return &httperror.HandlerError{http.StatusInternalServerError, "Unable to check for existence of docker endpoint", err}
|
return &httperror.HandlerError{http.StatusInternalServerError, "Unable to check for existence of docker environment", err}
|
||||||
}
|
}
|
||||||
|
|
||||||
if hasDockerEndpoint {
|
if hasDockerEndpoint {
|
||||||
return &httperror.HandlerError{http.StatusBadRequest, "Edge stack with docker endpoint cannot be deployed with kubernetes config", err}
|
return &httperror.HandlerError{http.StatusBadRequest, "Edge stack with docker environment cannot be deployed with kubernetes config", err}
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = handler.FileService.StoreEdgeStackFileFromBytes(stackFolder, stack.ManifestPath, []byte(payload.StackFileContent))
|
_, err = handler.FileService.StoreEdgeStackFileFromBytes(stackFolder, stack.ManifestPath, []byte(payload.StackFileContent))
|
||||||
|
|
|
@ -19,7 +19,7 @@ func hasEndpointPredicate(endpointService portainer.EndpointService, endpointIDs
|
||||||
for _, endpointID := range endpointIDs {
|
for _, endpointID := range endpointIDs {
|
||||||
endpoint, err := endpointService.Endpoint(endpointID)
|
endpoint, err := endpointService.Endpoint(endpointID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, fmt.Errorf("failed to retrieve endpoint from database: %w", err)
|
return false, fmt.Errorf("failed to retrieve environment from database: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if predicate(endpoint) {
|
if predicate(endpoint) {
|
||||||
|
|
|
@ -13,7 +13,7 @@ import (
|
||||||
"github.com/portainer/portainer/api/http/security"
|
"github.com/portainer/portainer/api/http/security"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Handler is the HTTP handler used to handle endpoint group operations.
|
// Handler is the HTTP handler used to handle environment(endpoint) group operations.
|
||||||
type Handler struct {
|
type Handler struct {
|
||||||
*mux.Router
|
*mux.Router
|
||||||
requestBouncer *security.RequestBouncer
|
requestBouncer *security.RequestBouncer
|
||||||
|
@ -23,7 +23,7 @@ type Handler struct {
|
||||||
KubernetesDeployer portainer.KubernetesDeployer
|
KubernetesDeployer portainer.KubernetesDeployer
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewHandler creates a handler to manage endpoint group operations.
|
// NewHandler creates a handler to manage environment(endpoint) group operations.
|
||||||
func NewHandler(bouncer *security.RequestBouncer) *Handler {
|
func NewHandler(bouncer *security.RequestBouncer) *Handler {
|
||||||
h := &Handler{
|
h := &Handler{
|
||||||
Router: mux.NewRouter(),
|
Router: mux.NewRouter(),
|
||||||
|
@ -49,7 +49,7 @@ func NewHandler(bouncer *security.RequestBouncer) *Handler {
|
||||||
func (handler *Handler) convertAndStoreKubeManifestIfNeeded(edgeStack *portainer.EdgeStack, relatedEndpointIds []portainer.EndpointID) error {
|
func (handler *Handler) convertAndStoreKubeManifestIfNeeded(edgeStack *portainer.EdgeStack, relatedEndpointIds []portainer.EndpointID) error {
|
||||||
hasKubeEndpoint, err := hasKubeEndpoint(handler.DataStore.Endpoint(), relatedEndpointIds)
|
hasKubeEndpoint, err := hasKubeEndpoint(handler.DataStore.Endpoint(), relatedEndpointIds)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("unable to check if edge stack has kube endpoints: %w", err)
|
return fmt.Errorf("unable to check if edge stack has kube environments: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !hasKubeEndpoint {
|
if !hasKubeEndpoint {
|
||||||
|
|
|
@ -10,14 +10,14 @@ import (
|
||||||
"github.com/portainer/portainer/api/http/security"
|
"github.com/portainer/portainer/api/http/security"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Handler is the HTTP handler used to handle edge endpoint operations.
|
// Handler is the HTTP handler used to handle edge environment(endpoint) operations.
|
||||||
type Handler struct {
|
type Handler struct {
|
||||||
*mux.Router
|
*mux.Router
|
||||||
requestBouncer *security.RequestBouncer
|
requestBouncer *security.RequestBouncer
|
||||||
DataStore portainer.DataStore
|
DataStore portainer.DataStore
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewHandler creates a handler to manage endpoint operations.
|
// NewHandler creates a handler to manage environment(endpoint) operations.
|
||||||
func NewHandler(bouncer *security.RequestBouncer) *Handler {
|
func NewHandler(bouncer *security.RequestBouncer) *Handler {
|
||||||
h := &Handler{
|
h := &Handler{
|
||||||
Router: mux.NewRouter(),
|
Router: mux.NewRouter(),
|
||||||
|
|
|
@ -25,7 +25,7 @@ func (payload *logsPayload) Validate(r *http.Request) error {
|
||||||
// @tags edge, endpoints
|
// @tags edge, endpoints
|
||||||
// @accept json
|
// @accept json
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param id path string true "Endpoint Id"
|
// @param id path string true "environment(endpoint) Id"
|
||||||
// @param jobID path string true "Job Id"
|
// @param jobID path string true "Job Id"
|
||||||
// @success 200
|
// @success 200
|
||||||
// @failure 500
|
// @failure 500
|
||||||
|
|
|
@ -18,12 +18,12 @@ type configResponse struct {
|
||||||
Name string
|
Name string
|
||||||
}
|
}
|
||||||
|
|
||||||
// @summary Inspect an Edge Stack for an Endpoint
|
// @summary Inspect an Edge Stack for an Environment(Endpoint)
|
||||||
// @description
|
// @description
|
||||||
// @tags edge, endpoints, edge_stacks
|
// @tags edge, endpoints, edge_stacks
|
||||||
// @accept json
|
// @accept json
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param id path string true "Endpoint Id"
|
// @param id path string true "environment(endpoint) Id"
|
||||||
// @param stackId path string true "EdgeStack Id"
|
// @param stackId path string true "EdgeStack Id"
|
||||||
// @success 200 {object} configResponse
|
// @success 200 {object} configResponse
|
||||||
// @failure 500
|
// @failure 500
|
||||||
|
|
|
@ -10,7 +10,7 @@ import (
|
||||||
"github.com/portainer/portainer/api/http/security"
|
"github.com/portainer/portainer/api/http/security"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Handler is the HTTP handler used to handle edge endpoint operations.
|
// Handler is the HTTP handler used to handle edge environment(endpoint) operations.
|
||||||
type Handler struct {
|
type Handler struct {
|
||||||
*mux.Router
|
*mux.Router
|
||||||
requestBouncer *security.RequestBouncer
|
requestBouncer *security.RequestBouncer
|
||||||
|
@ -19,7 +19,7 @@ type Handler struct {
|
||||||
ReverseTunnelService portainer.ReverseTunnelService
|
ReverseTunnelService portainer.ReverseTunnelService
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewHandler creates a handler to manage endpoint operations.
|
// NewHandler creates a handler to manage environment(endpoint) operations.
|
||||||
func NewHandler(bouncer *security.RequestBouncer) *Handler {
|
func NewHandler(bouncer *security.RequestBouncer) *Handler {
|
||||||
h := &Handler{
|
h := &Handler{
|
||||||
Router: mux.NewRouter(),
|
Router: mux.NewRouter(),
|
||||||
|
|
|
@ -12,13 +12,13 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type endpointGroupCreatePayload struct {
|
type endpointGroupCreatePayload struct {
|
||||||
// Endpoint group name
|
// Environment(Endpoint) group name
|
||||||
Name string `validate:"required" example:"my-endpoint-group"`
|
Name string `validate:"required" example:"my-environment-group"`
|
||||||
// Endpoint group description
|
// Environment(Endpoint) group description
|
||||||
Description string `example:"description"`
|
Description string `example:"description"`
|
||||||
// List of endpoint identifiers that will be part of this group
|
// List of environment(endpoint) identifiers that will be part of this group
|
||||||
AssociatedEndpoints []portainer.EndpointID `example:"1,3"`
|
AssociatedEndpoints []portainer.EndpointID `example:"1,3"`
|
||||||
// List of tag identifiers to which this endpoint group is associated
|
// List of tag identifiers to which this environment(endpoint) group is associated
|
||||||
TagIDs []portainer.TagID `example:"1,2"`
|
TagIDs []portainer.TagID `example:"1,2"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,14 +32,14 @@ func (payload *endpointGroupCreatePayload) Validate(r *http.Request) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// @summary Create an Endpoint Group
|
// @summary Create an Environment(Endpoint) Group
|
||||||
// @description Create a new endpoint group.
|
// @description Create a new environment(endpoint) group.
|
||||||
// @description **Access policy**: administrator
|
// @description **Access policy**: administrator
|
||||||
// @tags endpoint_groups
|
// @tags endpoint_groups
|
||||||
// @security jwt
|
// @security jwt
|
||||||
// @accept json
|
// @accept json
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param body body endpointGroupCreatePayload true "Endpoint Group details"
|
// @param body body endpointGroupCreatePayload true "Environment(Endpoint) Group details"
|
||||||
// @success 200 {object} portainer.EndpointGroup "Success"
|
// @success 200 {object} portainer.EndpointGroup "Success"
|
||||||
// @failure 400 "Invalid request"
|
// @failure 400 "Invalid request"
|
||||||
// @failure 500 "Server error"
|
// @failure 500 "Server error"
|
||||||
|
|
|
@ -12,8 +12,8 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// @id EndpointGroupDelete
|
// @id EndpointGroupDelete
|
||||||
// @summary Remove an endpoint group
|
// @summary Remove an environment(endpoint) group
|
||||||
// @description Remove an endpoint group.
|
// @description Remove an environment(endpoint) group.
|
||||||
// @description **Access policy**: administrator
|
// @description **Access policy**: administrator
|
||||||
// @tags endpoint_groups
|
// @tags endpoint_groups
|
||||||
// @security jwt
|
// @security jwt
|
||||||
|
|
|
@ -11,13 +11,13 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// @id EndpointGroupAddEndpoint
|
// @id EndpointGroupAddEndpoint
|
||||||
// @summary Add an endpoint to an endpoint group
|
// @summary Add an environment(endpoint) to an environment(endpoint) group
|
||||||
// @description Add an endpoint to an endpoint group
|
// @description Add an environment(endpoint) to an environment(endpoint) group
|
||||||
// @description **Access policy**: administrator
|
// @description **Access policy**: administrator
|
||||||
// @tags endpoint_groups
|
// @tags endpoint_groups
|
||||||
// @security jwt
|
// @security jwt
|
||||||
// @param id path int true "EndpointGroup identifier"
|
// @param id path int true "EndpointGroup identifier"
|
||||||
// @param endpointId path int true "Endpoint identifier"
|
// @param endpointId path int true "Environment(Endpoint) identifier"
|
||||||
// @success 204 "Success"
|
// @success 204 "Success"
|
||||||
// @failure 400 "Invalid request"
|
// @failure 400 "Invalid request"
|
||||||
// @failure 404 "EndpointGroup not found"
|
// @failure 404 "EndpointGroup not found"
|
||||||
|
|
|
@ -11,12 +11,12 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// @id EndpointGroupDeleteEndpoint
|
// @id EndpointGroupDeleteEndpoint
|
||||||
// @summary Removes endpoint from an endpoint group
|
// @summary Removes environment(endpoint) from an environment(endpoint) group
|
||||||
// @description **Access policy**: administrator
|
// @description **Access policy**: administrator
|
||||||
// @tags endpoint_groups
|
// @tags endpoint_groups
|
||||||
// @security jwt
|
// @security jwt
|
||||||
// @param id path int true "EndpointGroup identifier"
|
// @param id path int true "EndpointGroup identifier"
|
||||||
// @param endpointId path int true "Endpoint identifier"
|
// @param endpointId path int true "Environment(Endpoint) identifier"
|
||||||
// @success 204 "Success"
|
// @success 204 "Success"
|
||||||
// @failure 400 "Invalid request"
|
// @failure 400 "Invalid request"
|
||||||
// @failure 404 "EndpointGroup not found"
|
// @failure 404 "EndpointGroup not found"
|
||||||
|
|
|
@ -10,14 +10,14 @@ import (
|
||||||
"github.com/portainer/portainer/api/bolt/errors"
|
"github.com/portainer/portainer/api/bolt/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
// @summary Inspect an Endpoint group
|
// @summary Inspect an Environment(Endpoint) group
|
||||||
// @description Retrieve details abont an endpoint group.
|
// @description Retrieve details abont an environment(endpoint) group.
|
||||||
// @description **Access policy**: administrator
|
// @description **Access policy**: administrator
|
||||||
// @tags endpoint_groups
|
// @tags endpoint_groups
|
||||||
// @security jwt
|
// @security jwt
|
||||||
// @accept json
|
// @accept json
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param id path int true "Endpoint group identifier"
|
// @param id path int true "Environment(Endpoint) group identifier"
|
||||||
// @success 200 {object} portainer.EndpointGroup "Success"
|
// @success 200 {object} portainer.EndpointGroup "Success"
|
||||||
// @failure 400 "Invalid request"
|
// @failure 400 "Invalid request"
|
||||||
// @failure 404 "EndpointGroup not found"
|
// @failure 404 "EndpointGroup not found"
|
||||||
|
|
|
@ -9,15 +9,15 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// @id EndpointGroupList
|
// @id EndpointGroupList
|
||||||
// @summary List Endpoint groups
|
// @summary List Environment(Endpoint) groups
|
||||||
// @description List all endpoint groups based on the current user authorizations. Will
|
// @description List all environment(endpoint) groups based on the current user authorizations. Will
|
||||||
// @description return all endpoint groups if using an administrator account otherwise it will
|
// @description return all environment(endpoint) groups if using an administrator account otherwise it will
|
||||||
// @description only return authorized endpoint groups.
|
// @description only return authorized environment(endpoint) groups.
|
||||||
// @description **Access policy**: restricted
|
// @description **Access policy**: restricted
|
||||||
// @tags endpoint_groups
|
// @tags endpoint_groups
|
||||||
// @security jwt
|
// @security jwt
|
||||||
// @produce json
|
// @produce json
|
||||||
// @success 200 {array} portainer.EndpointGroup "Endpoint group"
|
// @success 200 {array} portainer.EndpointGroup "Environment(Endpoint) group"
|
||||||
// @failure 500 "Server error"
|
// @failure 500 "Server error"
|
||||||
// @router /endpoint_groups [get]
|
// @router /endpoint_groups [get]
|
||||||
func (handler *Handler) endpointGroupList(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
func (handler *Handler) endpointGroupList(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
||||||
|
|
|
@ -13,11 +13,11 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type endpointGroupUpdatePayload struct {
|
type endpointGroupUpdatePayload struct {
|
||||||
// Endpoint group name
|
// Environment(Endpoint) group name
|
||||||
Name string `example:"my-endpoint-group"`
|
Name string `example:"my-environment-group"`
|
||||||
// Endpoint group description
|
// Environment(Endpoint) group description
|
||||||
Description string `example:"description"`
|
Description string `example:"description"`
|
||||||
// List of tag identifiers associated to the endpoint group
|
// List of tag identifiers associated to the environment(endpoint) group
|
||||||
TagIDs []portainer.TagID `example:"3,4"`
|
TagIDs []portainer.TagID `example:"3,4"`
|
||||||
UserAccessPolicies portainer.UserAccessPolicies
|
UserAccessPolicies portainer.UserAccessPolicies
|
||||||
TeamAccessPolicies portainer.TeamAccessPolicies
|
TeamAccessPolicies portainer.TeamAccessPolicies
|
||||||
|
@ -28,8 +28,8 @@ func (payload *endpointGroupUpdatePayload) Validate(r *http.Request) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// @id EndpointGroupUpdate
|
// @id EndpointGroupUpdate
|
||||||
// @summary Update an endpoint group
|
// @summary Update an environment(endpoint) group
|
||||||
// @description Update an endpoint group.
|
// @description Update an environment(endpoint) group.
|
||||||
// @description **Access policy**: administrator
|
// @description **Access policy**: administrator
|
||||||
// @tags endpoint_groups
|
// @tags endpoint_groups
|
||||||
// @security jwt
|
// @security jwt
|
||||||
|
|
|
@ -10,14 +10,14 @@ import (
|
||||||
"github.com/portainer/portainer/api/http/security"
|
"github.com/portainer/portainer/api/http/security"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Handler is the HTTP handler used to handle endpoint group operations.
|
// Handler is the HTTP handler used to handle environment(endpoint) group operations.
|
||||||
type Handler struct {
|
type Handler struct {
|
||||||
*mux.Router
|
*mux.Router
|
||||||
AuthorizationService *authorization.Service
|
AuthorizationService *authorization.Service
|
||||||
DataStore portainer.DataStore
|
DataStore portainer.DataStore
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewHandler creates a handler to manage endpoint group operations.
|
// NewHandler creates a handler to manage environment(endpoint) group operations.
|
||||||
func NewHandler(bouncer *security.RequestBouncer) *Handler {
|
func NewHandler(bouncer *security.RequestBouncer) *Handler {
|
||||||
h := &Handler{
|
h := &Handler{
|
||||||
Router: mux.NewRouter(),
|
Router: mux.NewRouter(),
|
||||||
|
|
|
@ -16,16 +16,16 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// @id EndpointAssociationDelete
|
// @id EndpointAssociationDelete
|
||||||
// @summary De-association an edge endpoint
|
// @summary De-association an edge environment(endpoint)
|
||||||
// @description De-association an edge endpoint.
|
// @description De-association an edge environment(endpoint).
|
||||||
// @description **Access policy**: administrator
|
// @description **Access policy**: administrator
|
||||||
// @security jwt
|
// @security jwt
|
||||||
// @tags endpoints
|
// @tags endpoints
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param id path int true "Endpoint identifier"
|
// @param id path int true "Environment(Endpoint) identifier"
|
||||||
// @success 200 {object} portainer.Endpoint "Success"
|
// @success 200 {object} portainer.Endpoint "Success"
|
||||||
// @failure 400 "Invalid request"
|
// @failure 400 "Invalid request"
|
||||||
// @failure 404 "Endpoint not found"
|
// @failure 404 "Environment(Endpoint) not found"
|
||||||
// @failure 500 "Server error"
|
// @failure 500 "Server error"
|
||||||
// @router /api/endpoints/{id}/association [put]
|
// @router /api/endpoints/{id}/association [put]
|
||||||
func (handler *Handler) endpointAssociationDelete(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
func (handler *Handler) endpointAssociationDelete(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
||||||
|
|
|
@ -148,28 +148,28 @@ func (payload *endpointCreatePayload) Validate(r *http.Request) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// @id EndpointCreate
|
// @id EndpointCreate
|
||||||
// @summary Create a new endpoint
|
// @summary Create a new environment(endpoint)
|
||||||
// @description Create a new endpoint that will be used to manage an environment.
|
// @description Create a new environment(endpoint) that will be used to manage an environment(endpoint).
|
||||||
// @description **Access policy**: administrator
|
// @description **Access policy**: administrator
|
||||||
// @tags endpoints
|
// @tags endpoints
|
||||||
// @security jwt
|
// @security jwt
|
||||||
// @accept multipart/form-data
|
// @accept multipart/form-data
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param Name formData string true "Name that will be used to identify this endpoint (example: my-endpoint)"
|
// @param Name formData string true "Name that will be used to identify this environment(endpoint) (example: my-environment)"
|
||||||
// @param EndpointCreationType formData integer true "Environment type. Value must be one of: 1 (Local Docker environment), 2 (Agent environment), 3 (Azure environment), 4 (Edge agent environment) or 5 (Local Kubernetes Environment" Enum(1,2,3,4,5)
|
// @param EndpointCreationType formData integer true "Environment(Endpoint) type. Value must be one of: 1 (Local Docker environment), 2 (Agent environment), 3 (Azure environment), 4 (Edge agent environment) or 5 (Local Kubernetes Environment" Enum(1,2,3,4,5)
|
||||||
// @param URL formData string false "URL or IP address of a Docker host (example: docker.mydomain.tld:2375). Defaults to local if not specified (Linux: /var/run/docker.sock, Windows: //./pipe/docker_engine)"
|
// @param URL formData string false "URL or IP address of a Docker host (example: docker.mydomain.tld:2375). Defaults to local if not specified (Linux: /var/run/docker.sock, Windows: //./pipe/docker_engine)"
|
||||||
// @param PublicURL formData string false "URL or IP address where exposed containers will be reachable. Defaults to URL if not specified (example: docker.mydomain.tld:2375)"
|
// @param PublicURL formData string false "URL or IP address where exposed containers will be reachable. Defaults to URL if not specified (example: docker.mydomain.tld:2375)"
|
||||||
// @param GroupID formData int false "Endpoint group identifier. If not specified will default to 1 (unassigned)."
|
// @param GroupID formData int false "Environment(Endpoint) group identifier. If not specified will default to 1 (unassigned)."
|
||||||
// @param TLS formData bool false "Require TLS to connect against this endpoint"
|
// @param TLS formData bool false "Require TLS to connect against this environment(endpoint)"
|
||||||
// @param TLSSkipVerify formData bool false "Skip server verification when using TLS"
|
// @param TLSSkipVerify formData bool false "Skip server verification when using TLS"
|
||||||
// @param TLSSkipClientVerify formData bool false "Skip client verification when using TLS"
|
// @param TLSSkipClientVerify formData bool false "Skip client verification when using TLS"
|
||||||
// @param TLSCACertFile formData file false "TLS CA certificate file"
|
// @param TLSCACertFile formData file false "TLS CA certificate file"
|
||||||
// @param TLSCertFile formData file false "TLS client certificate file"
|
// @param TLSCertFile formData file false "TLS client certificate file"
|
||||||
// @param TLSKeyFile formData file false "TLS client key file"
|
// @param TLSKeyFile formData file false "TLS client key file"
|
||||||
// @param AzureApplicationID formData string false "Azure application ID. Required if endpoint type is set to 3"
|
// @param AzureApplicationID formData string false "Azure application ID. Required if environment(endpoint) type is set to 3"
|
||||||
// @param AzureTenantID formData string false "Azure tenant ID. Required if endpoint type is set to 3"
|
// @param AzureTenantID formData string false "Azure tenant ID. Required if environment(endpoint) type is set to 3"
|
||||||
// @param AzureAuthenticationKey formData string false "Azure authentication key. Required if endpoint type is set to 3"
|
// @param AzureAuthenticationKey formData string false "Azure authentication key. Required if environment(endpoint) type is set to 3"
|
||||||
// @param TagIDs formData []int false "List of tag identifiers to which this endpoint is associated"
|
// @param TagIDs formData []int false "List of tag identifiers to which this environment(endpoint) is associated"
|
||||||
// @param EdgeCheckinInterval formData int false "The check in interval for edge agent (in seconds)"
|
// @param EdgeCheckinInterval formData int false "The check in interval for edge agent (in seconds)"
|
||||||
// @success 200 {object} portainer.Endpoint "Success"
|
// @success 200 {object} portainer.Endpoint "Success"
|
||||||
// @failure 400 "Invalid request"
|
// @failure 400 "Invalid request"
|
||||||
|
|
|
@ -12,15 +12,15 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// @id EndpointDelete
|
// @id EndpointDelete
|
||||||
// @summary Remove an endpoint
|
// @summary Remove an environment(endpoint)
|
||||||
// @description Remove an endpoint.
|
// @description Remove an environment(endpoint).
|
||||||
// @description **Access policy**: administrator
|
// @description **Access policy**: administrator
|
||||||
// @tags endpoints
|
// @tags endpoints
|
||||||
// @security jwt
|
// @security jwt
|
||||||
// @param id path int true "Endpoint identifier"
|
// @param id path int true "Environment(Endpoint) identifier"
|
||||||
// @success 204 "Success"
|
// @success 204 "Success"
|
||||||
// @failure 400 "Invalid request"
|
// @failure 400 "Invalid request"
|
||||||
// @failure 404 "Endpoint not found"
|
// @failure 404 "Environment(Endpoint) not found"
|
||||||
// @failure 500 "Server error"
|
// @failure 500 "Server error"
|
||||||
// @router /endpoints/{id} [delete]
|
// @router /endpoints/{id} [delete]
|
||||||
func (handler *Handler) endpointDelete(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
func (handler *Handler) endpointDelete(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
||||||
|
|
|
@ -11,16 +11,16 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// @id EndpointInspect
|
// @id EndpointInspect
|
||||||
// @summary Inspect an endpoint
|
// @summary Inspect an environment(endpoint)
|
||||||
// @description Retrieve details about an endpoint.
|
// @description Retrieve details about an environment(endpoint).
|
||||||
// @description **Access policy**: restricted
|
// @description **Access policy**: restricted
|
||||||
// @tags endpoints
|
// @tags endpoints
|
||||||
// @security jwt
|
// @security jwt
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param id path int true "Endpoint identifier"
|
// @param id path int true "Environment(Endpoint) identifier"
|
||||||
// @success 200 {object} portainer.Endpoint "Success"
|
// @success 200 {object} portainer.Endpoint "Success"
|
||||||
// @failure 400 "Invalid request"
|
// @failure 400 "Invalid request"
|
||||||
// @failure 404 "Endpoint not found"
|
// @failure 404 "Environment(Endpoint) not found"
|
||||||
// @failure 500 "Server error"
|
// @failure 500 "Server error"
|
||||||
// @router /endpoints/{id} [get]
|
// @router /endpoints/{id} [get]
|
||||||
func (handler *Handler) endpointInspect(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
func (handler *Handler) endpointInspect(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
||||||
|
|
|
@ -14,22 +14,22 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// @id EndpointList
|
// @id EndpointList
|
||||||
// @summary List endpoints
|
// @summary List environments(endpoints)
|
||||||
// @description List all endpoints based on the current user authorizations. Will
|
// @description List all environments(endpoints) based on the current user authorizations. Will
|
||||||
// @description return all endpoints if using an administrator account otherwise it will
|
// @description return all environments(endpoints) if using an administrator account otherwise it will
|
||||||
// @description only return authorized endpoints.
|
// @description only return authorized environments(endpoints).
|
||||||
// @description **Access policy**: restricted
|
// @description **Access policy**: restricted
|
||||||
// @tags endpoints
|
// @tags endpoints
|
||||||
// @security jwt
|
// @security jwt
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param start query int false "Start searching from"
|
// @param start query int false "Start searching from"
|
||||||
// @param search query string false "Search query"
|
// @param search query string false "Search query"
|
||||||
// @param groupId query int false "List endpoints of this group"
|
// @param groupId query int false "List environments(endpoints) of this group"
|
||||||
// @param limit query int false "Limit results to this value"
|
// @param limit query int false "Limit results to this value"
|
||||||
// @param types query []int false "List endpoints of this type"
|
// @param types query []int false "List environments(endpoints) of this type"
|
||||||
// @param tagIds query []int false "search endpoints with these tags (depends on tagsPartialMatch)"
|
// @param tagIds query []int false "search environments(endpoints) with these tags (depends on tagsPartialMatch)"
|
||||||
// @param tagsPartialMatch query bool false "If true, will return endpoint which has one of tagIds, if false (or missing) will return only endpoints that has all the tags"
|
// @param tagsPartialMatch query bool false "If true, will return environment(endpoint) which has one of tagIds, if false (or missing) will return only environments(endpoints) that has all the tags"
|
||||||
// @param endpointIds query []int false "will return only these endpoints"
|
// @param endpointIds query []int false "will return only these environments(endpoints)"
|
||||||
// @success 200 {array} portainer.Endpoint "Endpoints"
|
// @success 200 {array} portainer.Endpoint "Endpoints"
|
||||||
// @failure 500 "Server error"
|
// @failure 500 "Server error"
|
||||||
// @router /endpoints [get]
|
// @router /endpoints [get]
|
||||||
|
|
|
@ -36,18 +36,18 @@ func (payload *endpointSettingsUpdatePayload) Validate(r *http.Request) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// @id EndpointSettingsUpdate
|
// @id EndpointSettingsUpdate
|
||||||
// @summary Update settings for an endpoint
|
// @summary Update settings for an environments(endpoints)
|
||||||
// @description Update settings for an endpoint.
|
// @description Update settings for an environments(endpoints).
|
||||||
// @description **Access policy**: administrator
|
// @description **Access policy**: administrator
|
||||||
// @security jwt
|
// @security jwt
|
||||||
// @tags endpoints
|
// @tags endpoints
|
||||||
// @accept json
|
// @accept json
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param id path int true "Endpoint identifier"
|
// @param id path int true "Environment(Endpoint) identifier"
|
||||||
// @param body body endpointSettingsUpdatePayload true "Endpoint details"
|
// @param body body endpointSettingsUpdatePayload true "Environment(Endpoint) details"
|
||||||
// @success 200 {object} portainer.Endpoint "Success"
|
// @success 200 {object} portainer.Endpoint "Success"
|
||||||
// @failure 400 "Invalid request"
|
// @failure 400 "Invalid request"
|
||||||
// @failure 404 "Endpoint not found"
|
// @failure 404 "Environment(Endpoint) not found"
|
||||||
// @failure 500 "Server error"
|
// @failure 500 "Server error"
|
||||||
// @router /api/endpoints/{id}/settings [put]
|
// @router /api/endpoints/{id}/settings [put]
|
||||||
func (handler *Handler) endpointSettingsUpdate(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
func (handler *Handler) endpointSettingsUpdate(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
||||||
|
|
|
@ -12,15 +12,15 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// @id EndpointSnapshot
|
// @id EndpointSnapshot
|
||||||
// @summary Snapshots an endpoint
|
// @summary Snapshots an environments(endpoints)
|
||||||
// @description Snapshots an endpoint
|
// @description Snapshots an environments(endpoints)
|
||||||
// @description **Access policy**: restricted
|
// @description **Access policy**: restricted
|
||||||
// @tags endpoints
|
// @tags endpoints
|
||||||
// @security jwt
|
// @security jwt
|
||||||
// @param id path int true "Endpoint identifier"
|
// @param id path int true "Environment(Endpoint) identifier"
|
||||||
// @success 204 "Success"
|
// @success 204 "Success"
|
||||||
// @failure 400 "Invalid request"
|
// @failure 400 "Invalid request"
|
||||||
// @failure 404 "Endpoint not found"
|
// @failure 404 "Environment(Endpoint) not found"
|
||||||
// @failure 500 "Server error"
|
// @failure 500 "Server error"
|
||||||
// @router /endpoints/{id}/snapshot [post]
|
// @router /endpoints/{id}/snapshot [post]
|
||||||
func (handler *Handler) endpointSnapshot(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
func (handler *Handler) endpointSnapshot(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
||||||
|
|
|
@ -11,8 +11,8 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// @id EndpointSnapshots
|
// @id EndpointSnapshots
|
||||||
// @summary Snapshot all endpoints
|
// @summary Snapshot all environments(endpoints)
|
||||||
// @description Snapshot all endpoints
|
// @description Snapshot all environments(endpoints)
|
||||||
// @description **Access policy**: administrator
|
// @description **Access policy**: administrator
|
||||||
// @tags endpoints
|
// @tags endpoints
|
||||||
// @security jwt
|
// @security jwt
|
||||||
|
|
|
@ -35,31 +35,31 @@ type edgeJobResponse struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type endpointStatusInspectResponse struct {
|
type endpointStatusInspectResponse struct {
|
||||||
// Status represents the endpoint status
|
// Status represents the environment(endpoint) status
|
||||||
Status string `json:"status" example:"REQUIRED"`
|
Status string `json:"status" example:"REQUIRED"`
|
||||||
// The tunnel port
|
// The tunnel port
|
||||||
Port int `json:"port" example:"8732"`
|
Port int `json:"port" example:"8732"`
|
||||||
// List of requests for jobs to run on the endpoint
|
// List of requests for jobs to run on the environment(endpoint)
|
||||||
Schedules []edgeJobResponse `json:"schedules"`
|
Schedules []edgeJobResponse `json:"schedules"`
|
||||||
// The current value of CheckinInterval
|
// The current value of CheckinInterval
|
||||||
CheckinInterval int `json:"checkin" example:"5"`
|
CheckinInterval int `json:"checkin" example:"5"`
|
||||||
//
|
//
|
||||||
Credentials string `json:"credentials" example:""`
|
Credentials string `json:"credentials" example:""`
|
||||||
// List of stacks to be deployed on the endpoints
|
// List of stacks to be deployed on the environments(endpoints)
|
||||||
Stacks []stackStatusResponse `json:"stacks"`
|
Stacks []stackStatusResponse `json:"stacks"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// @id EndpointStatusInspect
|
// @id EndpointStatusInspect
|
||||||
// @summary Get endpoint status
|
// @summary Get environment(endpoint) status
|
||||||
// @description Endpoint for edge agent to check status of environment
|
// @description Environment(Endpoint) for edge agent to check status of environment(endpoint)
|
||||||
// @description **Access policy**: restricted only to Edge endpoints
|
// @description **Access policy**: restricted only to Edge environments(endpoints)
|
||||||
// @tags endpoints
|
// @tags endpoints
|
||||||
// @security jwt
|
// @security jwt
|
||||||
// @param id path int true "Endpoint identifier"
|
// @param id path int true "Environment(Endpoint) identifier"
|
||||||
// @success 200 {object} endpointStatusInspectResponse "Success"
|
// @success 200 {object} endpointStatusInspectResponse "Success"
|
||||||
// @failure 400 "Invalid request"
|
// @failure 400 "Invalid request"
|
||||||
// @failure 403 "Permission denied to access endpoint"
|
// @failure 403 "Permission denied to access environment(endpoint)"
|
||||||
// @failure 404 "Endpoint not found"
|
// @failure 404 "Environment(Endpoint) not found"
|
||||||
// @failure 500 "Server error"
|
// @failure 500 "Server error"
|
||||||
// @router /endpoints/{id}/status [get]
|
// @router /endpoints/{id}/status [get]
|
||||||
func (handler *Handler) endpointStatusInspect(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
func (handler *Handler) endpointStatusInspect(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
||||||
|
|
|
@ -16,8 +16,8 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type endpointUpdatePayload struct {
|
type endpointUpdatePayload struct {
|
||||||
// Name that will be used to identify this endpoint
|
// Name that will be used to identify this environment(endpoint)
|
||||||
Name *string `example:"my-endpoint"`
|
Name *string `example:"my-environment"`
|
||||||
// URL or IP address of a Docker host
|
// URL or IP address of a Docker host
|
||||||
URL *string `example:"docker.mydomain.tld:2375"`
|
URL *string `example:"docker.mydomain.tld:2375"`
|
||||||
// URL or IP address where exposed containers will be reachable.\
|
// URL or IP address where exposed containers will be reachable.\
|
||||||
|
@ -25,13 +25,13 @@ type endpointUpdatePayload struct {
|
||||||
PublicURL *string `example:"docker.mydomain.tld:2375"`
|
PublicURL *string `example:"docker.mydomain.tld:2375"`
|
||||||
// Group identifier
|
// Group identifier
|
||||||
GroupID *int `example:"1"`
|
GroupID *int `example:"1"`
|
||||||
// Require TLS to connect against this endpoint
|
// Require TLS to connect against this environment(endpoint)
|
||||||
TLS *bool `example:"true"`
|
TLS *bool `example:"true"`
|
||||||
// Skip server verification when using TLS
|
// Skip server verification when using TLS
|
||||||
TLSSkipVerify *bool `example:"false"`
|
TLSSkipVerify *bool `example:"false"`
|
||||||
// Skip client verification when using TLS
|
// Skip client verification when using TLS
|
||||||
TLSSkipClientVerify *bool `example:"false"`
|
TLSSkipClientVerify *bool `example:"false"`
|
||||||
// The status of the endpoint (1 - up, 2 - down)
|
// The status of the environment(endpoint) (1 - up, 2 - down)
|
||||||
Status *int `example:"1"`
|
Status *int `example:"1"`
|
||||||
// Azure application ID
|
// Azure application ID
|
||||||
AzureApplicationID *string `example:"eag7cdo9-o09l-9i83-9dO9-f0b23oe78db4"`
|
AzureApplicationID *string `example:"eag7cdo9-o09l-9i83-9dO9-f0b23oe78db4"`
|
||||||
|
@ -39,7 +39,7 @@ type endpointUpdatePayload struct {
|
||||||
AzureTenantID *string `example:"34ddc78d-4fel-2358-8cc1-df84c8o839f5"`
|
AzureTenantID *string `example:"34ddc78d-4fel-2358-8cc1-df84c8o839f5"`
|
||||||
// Azure authentication key
|
// Azure authentication key
|
||||||
AzureAuthenticationKey *string `example:"cOrXoK/1D35w8YQ8nH1/8ZGwzz45JIYD5jxHKXEQknk="`
|
AzureAuthenticationKey *string `example:"cOrXoK/1D35w8YQ8nH1/8ZGwzz45JIYD5jxHKXEQknk="`
|
||||||
// List of tag identifiers to which this endpoint is associated
|
// List of tag identifiers to which this environment(endpoint) is associated
|
||||||
TagIDs []portainer.TagID `example:"1,2"`
|
TagIDs []portainer.TagID `example:"1,2"`
|
||||||
UserAccessPolicies portainer.UserAccessPolicies
|
UserAccessPolicies portainer.UserAccessPolicies
|
||||||
TeamAccessPolicies portainer.TeamAccessPolicies
|
TeamAccessPolicies portainer.TeamAccessPolicies
|
||||||
|
@ -54,18 +54,18 @@ func (payload *endpointUpdatePayload) Validate(r *http.Request) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// @id EndpointUpdate
|
// @id EndpointUpdate
|
||||||
// @summary Update an endpoint
|
// @summary Update an environment(endpoint)
|
||||||
// @description Update an endpoint.
|
// @description Update an environment(endpoint).
|
||||||
// @description **Access policy**: administrator
|
// @description **Access policy**: administrator
|
||||||
// @security jwt
|
// @security jwt
|
||||||
// @tags endpoints
|
// @tags endpoints
|
||||||
// @accept json
|
// @accept json
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param id path int true "Endpoint identifier"
|
// @param id path int true "Environment(Endpoint) identifier"
|
||||||
// @param body body endpointUpdatePayload true "Endpoint details"
|
// @param body body endpointUpdatePayload true "Environment(Endpoint) details"
|
||||||
// @success 200 {object} portainer.Endpoint "Success"
|
// @success 200 {object} portainer.Endpoint "Success"
|
||||||
// @failure 400 "Invalid request"
|
// @failure 400 "Invalid request"
|
||||||
// @failure 404 "Endpoint not found"
|
// @failure 404 "Environment(Endpoint) not found"
|
||||||
// @failure 500 "Server error"
|
// @failure 500 "Server error"
|
||||||
// @router /endpoints/{id} [put]
|
// @router /endpoints/{id} [put]
|
||||||
func (handler *Handler) endpointUpdate(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
func (handler *Handler) endpointUpdate(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
||||||
|
|
|
@ -20,7 +20,7 @@ func hideFields(endpoint *portainer.Endpoint) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handler is the HTTP handler used to handle endpoint operations.
|
// Handler is the HTTP handler used to handle environment(endpoint) operations.
|
||||||
type Handler struct {
|
type Handler struct {
|
||||||
*mux.Router
|
*mux.Router
|
||||||
requestBouncer *security.RequestBouncer
|
requestBouncer *security.RequestBouncer
|
||||||
|
@ -36,7 +36,7 @@ type Handler struct {
|
||||||
BindAddressHTTPS string
|
BindAddressHTTPS string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewHandler creates a handler to manage endpoint operations.
|
// NewHandler creates a handler to manage environment(endpoint) operations.
|
||||||
func NewHandler(bouncer *security.RequestBouncer) *Handler {
|
func NewHandler(bouncer *security.RequestBouncer) *Handler {
|
||||||
h := &Handler{
|
h := &Handler{
|
||||||
Router: mux.NewRouter(),
|
Router: mux.NewRouter(),
|
||||||
|
|
|
@ -102,11 +102,11 @@ type Handler struct {
|
||||||
// @tag.name edge_templates
|
// @tag.name edge_templates
|
||||||
// @tag.description Manage Edge Templates
|
// @tag.description Manage Edge Templates
|
||||||
// @tag.name edge
|
// @tag.name edge
|
||||||
// @tag.description Manage Edge related endpoint settings
|
// @tag.description Manage Edge related environment(endpoint) settings
|
||||||
// @tag.name endpoints
|
// @tag.name endpoints
|
||||||
// @tag.description Manage Docker environments
|
// @tag.description Manage Docker environments(endpoints)
|
||||||
// @tag.name endpoint_groups
|
// @tag.name endpoint_groups
|
||||||
// @tag.description Manage endpoint groups
|
// @tag.description Manage environment(endpoint) groups
|
||||||
// @tag.name kubernetes
|
// @tag.name kubernetes
|
||||||
// @tag.description Manage Kubernetes cluster
|
// @tag.description Manage Kubernetes cluster
|
||||||
// @tag.name motd
|
// @tag.name motd
|
||||||
|
|
|
@ -21,7 +21,7 @@ type requestBouncer interface {
|
||||||
AuthenticatedAccess(h http.Handler) http.Handler
|
AuthenticatedAccess(h http.Handler) http.Handler
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handler is the HTTP handler used to handle endpoint group operations.
|
// Handler is the HTTP handler used to handle environment(endpoint) group operations.
|
||||||
type Handler struct {
|
type Handler struct {
|
||||||
*mux.Router
|
*mux.Router
|
||||||
requestBouncer requestBouncer
|
requestBouncer requestBouncer
|
||||||
|
@ -30,7 +30,7 @@ type Handler struct {
|
||||||
helmPackageManager libhelm.HelmPackageManager
|
helmPackageManager libhelm.HelmPackageManager
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewHandler creates a handler to manage endpoint group operations.
|
// NewHandler creates a handler to manage environment(endpoint) group operations.
|
||||||
func NewHandler(bouncer requestBouncer, dataStore portainer.DataStore, helmPackageManager libhelm.HelmPackageManager, kubeConfigService kubernetes.KubeConfigService) *Handler {
|
func NewHandler(bouncer requestBouncer, dataStore portainer.DataStore, helmPackageManager libhelm.HelmPackageManager, kubeConfigService kubernetes.KubeConfigService) *Handler {
|
||||||
h := &Handler{
|
h := &Handler{
|
||||||
Router: mux.NewRouter(),
|
Router: mux.NewRouter(),
|
||||||
|
@ -62,7 +62,7 @@ func NewHandler(bouncer requestBouncer, dataStore portainer.DataStore, helmPacka
|
||||||
return h
|
return h
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewTemplateHandler creates a template handler to manage endpoint group operations.
|
// NewTemplateHandler creates a template handler to manage environment(endpoint) group operations.
|
||||||
func NewTemplateHandler(bouncer requestBouncer, helmPackageManager libhelm.HelmPackageManager) *Handler {
|
func NewTemplateHandler(bouncer requestBouncer, helmPackageManager libhelm.HelmPackageManager) *Handler {
|
||||||
h := &Handler{
|
h := &Handler{
|
||||||
Router: mux.NewRouter(),
|
Router: mux.NewRouter(),
|
||||||
|
@ -86,7 +86,7 @@ func NewTemplateHandler(bouncer requestBouncer, helmPackageManager libhelm.HelmP
|
||||||
func (handler *Handler) getHelmClusterAccess(r *http.Request) (*options.KubernetesClusterAccess, *httperror.HandlerError) {
|
func (handler *Handler) getHelmClusterAccess(r *http.Request) (*options.KubernetesClusterAccess, *httperror.HandlerError) {
|
||||||
endpoint, err := middlewares.FetchEndpoint(r)
|
endpoint, err := middlewares.FetchEndpoint(r)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, &httperror.HandlerError{http.StatusNotFound, "Unable to find an endpoint on request context", err}
|
return nil, &httperror.HandlerError{http.StatusNotFound, "Unable to find an environment on request context", err}
|
||||||
}
|
}
|
||||||
|
|
||||||
bearerToken, err := security.ExtractBearerToken(r)
|
bearerToken, err := security.ExtractBearerToken(r)
|
||||||
|
|
|
@ -17,13 +17,13 @@ import (
|
||||||
// @security jwt
|
// @security jwt
|
||||||
// @accept json
|
// @accept json
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param id path int true "Endpoint identifier"
|
// @param id path int true "Environment(Endpoint) identifier"
|
||||||
// @param release path string true "The name of the release/application to uninstall"
|
// @param release path string true "The name of the release/application to uninstall"
|
||||||
// @param namespace query string true "An optional namespace"
|
// @param namespace query string true "An optional namespace"
|
||||||
// @success 204 "Success"
|
// @success 204 "Success"
|
||||||
// @failure 400 "Invalid endpoint id or bad request"
|
// @failure 400 "Invalid environment(endpoint) id or bad request"
|
||||||
// @failure 401 "Unauthorized"
|
// @failure 401 "Unauthorized"
|
||||||
// @failure 404 "Endpoint or ServiceAccount not found"
|
// @failure 404 "Environment(Endpoint) or ServiceAccount not found"
|
||||||
// @failure 500 "Server error or helm error"
|
// @failure 500 "Server error or helm error"
|
||||||
// @router /endpoints/{id}/kubernetes/helm/{release} [delete]
|
// @router /endpoints/{id}/kubernetes/helm/{release} [delete]
|
||||||
func (handler *Handler) helmDelete(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
func (handler *Handler) helmDelete(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
||||||
|
|
|
@ -24,7 +24,7 @@ func Test_helmDelete(t *testing.T) {
|
||||||
defer teardown()
|
defer teardown()
|
||||||
|
|
||||||
err := store.Endpoint().CreateEndpoint(&portainer.Endpoint{ID: 1})
|
err := store.Endpoint().CreateEndpoint(&portainer.Endpoint{ID: 1})
|
||||||
is.NoError(err, "Error creating endpoint")
|
is.NoError(err, "Error creating environment")
|
||||||
|
|
||||||
err = store.User().CreateUser(&portainer.User{Username: "admin", Role: portainer.AdministratorRole})
|
err = store.User().CreateUser(&portainer.User{Username: "admin", Role: portainer.AdministratorRole})
|
||||||
is.NoError(err, "Error creating a user")
|
is.NoError(err, "Error creating a user")
|
||||||
|
|
|
@ -36,11 +36,11 @@ var errChartNameInvalid = errors.New("invalid chart name. " +
|
||||||
// @security jwt
|
// @security jwt
|
||||||
// @accept json
|
// @accept json
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param id path int true "Endpoint identifier"
|
// @param id path int true "Environment(Endpoint) identifier"
|
||||||
// @param payload body installChartPayload true "Chart details"
|
// @param payload body installChartPayload true "Chart details"
|
||||||
// @success 201 {object} release.Release "Created"
|
// @success 201 {object} release.Release "Created"
|
||||||
// @failure 401 "Unauthorized"
|
// @failure 401 "Unauthorized"
|
||||||
// @failure 404 "Endpoint or ServiceAccount not found"
|
// @failure 404 "Environment(Endpoint) or ServiceAccount not found"
|
||||||
// @failure 500 "Server error"
|
// @failure 500 "Server error"
|
||||||
// @router /endpoints/{id}/kubernetes/helm [post]
|
// @router /endpoints/{id}/kubernetes/helm [post]
|
||||||
func (handler *Handler) helmInstall(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
func (handler *Handler) helmInstall(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
||||||
|
|
|
@ -26,7 +26,7 @@ func Test_helmInstall(t *testing.T) {
|
||||||
defer teardown()
|
defer teardown()
|
||||||
|
|
||||||
err := store.Endpoint().CreateEndpoint(&portainer.Endpoint{ID: 1})
|
err := store.Endpoint().CreateEndpoint(&portainer.Endpoint{ID: 1})
|
||||||
is.NoError(err, "error creating endpoint")
|
is.NoError(err, "error creating environment")
|
||||||
|
|
||||||
err = store.User().CreateUser(&portainer.User{Username: "admin", Role: portainer.AdministratorRole})
|
err = store.User().CreateUser(&portainer.User{Username: "admin", Role: portainer.AdministratorRole})
|
||||||
is.NoError(err, "error creating a user")
|
is.NoError(err, "error creating a user")
|
||||||
|
|
|
@ -17,14 +17,14 @@ import (
|
||||||
// @security jwt
|
// @security jwt
|
||||||
// @accept json
|
// @accept json
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param id path int true "Endpoint identifier"
|
// @param id path int true "Environment(Endpoint) identifier"
|
||||||
// @param namespace query string true "specify an optional namespace"
|
// @param namespace query string true "specify an optional namespace"
|
||||||
// @param filter query string true "specify an optional filter"
|
// @param filter query string true "specify an optional filter"
|
||||||
// @param selector query string true "specify an optional selector"
|
// @param selector query string true "specify an optional selector"
|
||||||
// @success 200 {array} release.ReleaseElement "Success"
|
// @success 200 {array} release.ReleaseElement "Success"
|
||||||
// @failure 400 "Invalid endpoint identifier"
|
// @failure 400 "Invalid environment(endpoint) identifier"
|
||||||
// @failure 401 "Unauthorized"
|
// @failure 401 "Unauthorized"
|
||||||
// @failure 404 "Endpoint or ServiceAccount not found"
|
// @failure 404 "Environment(Endpoint) or ServiceAccount not found"
|
||||||
// @failure 500 "Server error"
|
// @failure 500 "Server error"
|
||||||
// @router /endpoints/{id}/kubernetes/helm [get]
|
// @router /endpoints/{id}/kubernetes/helm [get]
|
||||||
func (handler *Handler) helmList(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
func (handler *Handler) helmList(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
||||||
|
|
|
@ -23,7 +23,7 @@ func Test_helmList(t *testing.T) {
|
||||||
defer teardown()
|
defer teardown()
|
||||||
|
|
||||||
err := store.Endpoint().CreateEndpoint(&portainer.Endpoint{ID: 1})
|
err := store.Endpoint().CreateEndpoint(&portainer.Endpoint{ID: 1})
|
||||||
assert.NoError(t, err, "error creating endpoint")
|
assert.NoError(t, err, "error creating environment")
|
||||||
|
|
||||||
err = store.User().CreateUser(&portainer.User{Username: "admin", Role: portainer.AdministratorRole})
|
err = store.User().CreateUser(&portainer.User{Username: "admin", Role: portainer.AdministratorRole})
|
||||||
assert.NoError(t, err, "error creating a user")
|
assert.NoError(t, err, "error creating a user")
|
||||||
|
|
|
@ -25,7 +25,7 @@ import (
|
||||||
// @produce text/plain
|
// @produce text/plain
|
||||||
// @success 200 {object} string "Success"
|
// @success 200 {object} string "Success"
|
||||||
// @failure 401 "Unauthorized"
|
// @failure 401 "Unauthorized"
|
||||||
// @failure 404 "Endpoint or ServiceAccount not found"
|
// @failure 404 "Environment(Endpoint) or ServiceAccount not found"
|
||||||
// @failure 500 "Server error"
|
// @failure 500 "Server error"
|
||||||
// @router /templates/helm/{command} [get]
|
// @router /templates/helm/{command} [get]
|
||||||
func (handler *Handler) helmShow(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
func (handler *Handler) helmShow(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
||||||
|
|
|
@ -36,7 +36,7 @@ func (p *addHelmRepoUrlPayload) Validate(_ *http.Request) error {
|
||||||
// @security jwt
|
// @security jwt
|
||||||
// @accept json
|
// @accept json
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param id path int true "Endpoint identifier"
|
// @param id path int true "Environment(Endpoint) identifier"
|
||||||
// @param payload body addHelmRepoUrlPayload true "Helm Repository"
|
// @param payload body addHelmRepoUrlPayload true "Helm Repository"
|
||||||
// @success 200 {object} portainer.HelmUserRepository "Success"
|
// @success 200 {object} portainer.HelmUserRepository "Success"
|
||||||
// @failure 400 "Invalid request"
|
// @failure 400 "Invalid request"
|
||||||
|
|
|
@ -14,7 +14,7 @@ import (
|
||||||
"github.com/portainer/portainer/api/kubernetes/cli"
|
"github.com/portainer/portainer/api/kubernetes/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Handler is the HTTP handler which will natively deal with to external endpoints.
|
// Handler is the HTTP handler which will natively deal with to external environments(endpoints).
|
||||||
type Handler struct {
|
type Handler struct {
|
||||||
*mux.Router
|
*mux.Router
|
||||||
dataStore portainer.DataStore
|
dataStore portainer.DataStore
|
||||||
|
|
|
@ -22,12 +22,12 @@ import (
|
||||||
// @security jwt
|
// @security jwt
|
||||||
// @accept json
|
// @accept json
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param id path int true "Endpoint identifier"
|
// @param id path int true "Environment(Endpoint) identifier"
|
||||||
// @success 200 "Success"
|
// @success 200 "Success"
|
||||||
// @failure 400 "Invalid request"
|
// @failure 400 "Invalid request"
|
||||||
// @failure 401 "Unauthorized"
|
// @failure 401 "Unauthorized"
|
||||||
// @failure 403 "Permission denied"
|
// @failure 403 "Permission denied"
|
||||||
// @failure 404 "Endpoint or ServiceAccount not found"
|
// @failure 404 "Environment(Endpoint) or ServiceAccount not found"
|
||||||
// @failure 500 "Server error"
|
// @failure 500 "Server error"
|
||||||
// @router /kubernetes/{id}/config [get]
|
// @router /kubernetes/{id}/config [get]
|
||||||
func (handler *Handler) getKubernetesConfig(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
func (handler *Handler) getKubernetesConfig(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
||||||
|
|
|
@ -18,12 +18,12 @@ import (
|
||||||
// @security jwt
|
// @security jwt
|
||||||
// @accept json
|
// @accept json
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param id path int true "Endpoint identifier"
|
// @param id path int true "Environment(Endpoint) identifier"
|
||||||
// @success 200 {object} portainer.K8sNodesLimits "Success"
|
// @success 200 {object} portainer.K8sNodesLimits "Success"
|
||||||
// @failure 400 "Invalid request"
|
// @failure 400 "Invalid request"
|
||||||
// @failure 401 "Unauthorized"
|
// @failure 401 "Unauthorized"
|
||||||
// @failure 403 "Permission denied"
|
// @failure 403 "Permission denied"
|
||||||
// @failure 404 "Endpoint not found"
|
// @failure 404 "Environment(Endpoint) not found"
|
||||||
// @failure 500 "Server error"
|
// @failure 500 "Server error"
|
||||||
// @router /kubernetes/{id}/nodes_limits [get]
|
// @router /kubernetes/{id}/nodes_limits [get]
|
||||||
func (handler *Handler) getKubernetesNodesLimits(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
func (handler *Handler) getKubernetesNodesLimits(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
||||||
|
|
|
@ -21,16 +21,16 @@ func (payload *namespacesToggleSystemPayload) Validate(r *http.Request) error {
|
||||||
// @id KubernetesNamespacesToggleSystem
|
// @id KubernetesNamespacesToggleSystem
|
||||||
// @summary Toggle the system state for a namespace
|
// @summary Toggle the system state for a namespace
|
||||||
// @description Toggle the system state for a namespace
|
// @description Toggle the system state for a namespace
|
||||||
// @description **Access policy**: administrator or endpoint admin
|
// @description **Access policy**: administrator or environment(endpoint) admin
|
||||||
// @security jwt
|
// @security jwt
|
||||||
// @tags kubernetes
|
// @tags kubernetes
|
||||||
// @accept json
|
// @accept json
|
||||||
// @param id path int true "Endpoint identifier"
|
// @param id path int true "Environment(Endpoint) identifier"
|
||||||
// @param namespace path string true "Namespace name"
|
// @param namespace path string true "Namespace name"
|
||||||
// @param body body namespacesToggleSystemPayload true "Update details"
|
// @param body body namespacesToggleSystemPayload true "Update details"
|
||||||
// @success 200 "Success"
|
// @success 200 "Success"
|
||||||
// @failure 400 "Invalid request"
|
// @failure 400 "Invalid request"
|
||||||
// @failure 404 "Endpoint not found"
|
// @failure 404 "Environment(Endpoint) not found"
|
||||||
// @failure 500 "Server error"
|
// @failure 500 "Server error"
|
||||||
// @router /kubernetes/{id}/namespaces/{namespace}/system [put]
|
// @router /kubernetes/{id}/namespaces/{namespace}/system [put]
|
||||||
func (handler *Handler) namespacesToggleSystem(rw http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
func (handler *Handler) namespacesToggleSystem(rw http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
||||||
|
|
|
@ -24,7 +24,7 @@ type settingsUpdatePayload struct {
|
||||||
AuthenticationMethod *int `example:"1"`
|
AuthenticationMethod *int `example:"1"`
|
||||||
LDAPSettings *portainer.LDAPSettings `example:""`
|
LDAPSettings *portainer.LDAPSettings `example:""`
|
||||||
OAuthSettings *portainer.OAuthSettings `example:""`
|
OAuthSettings *portainer.OAuthSettings `example:""`
|
||||||
// The interval in which endpoint snapshots are created
|
// The interval in which environment(endpoint) snapshots are created
|
||||||
SnapshotInterval *string `example:"5m"`
|
SnapshotInterval *string `example:"5m"`
|
||||||
// URL to the templates that will be displayed in the UI when navigating to App Templates
|
// URL to the templates that will be displayed in the UI when navigating to App Templates
|
||||||
TemplatesURL *string `example:"https://raw.githubusercontent.com/portainer/templates/master/templates.json"`
|
TemplatesURL *string `example:"https://raw.githubusercontent.com/portainer/templates/master/templates.json"`
|
||||||
|
|
|
@ -22,7 +22,7 @@ type composeStackFromFileContentPayload struct {
|
||||||
Name string `example:"myStack" validate:"required"`
|
Name string `example:"myStack" validate:"required"`
|
||||||
// Content of the Stack file
|
// Content of the Stack file
|
||||||
StackFileContent string `example:"version: 3\n services:\n web:\n image:nginx" validate:"required"`
|
StackFileContent string `example:"version: 3\n services:\n web:\n image:nginx" validate:"required"`
|
||||||
// A list of environment variables used during stack deployment
|
// A list of environment(endpoint) variables used during stack deployment
|
||||||
Env []portainer.Pair `example:""`
|
Env []portainer.Pair `example:""`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,7 +117,7 @@ type composeStackFromGitRepositoryPayload struct {
|
||||||
AdditionalFiles []string `example:"[nz.compose.yml, uat.compose.yml]"`
|
AdditionalFiles []string `example:"[nz.compose.yml, uat.compose.yml]"`
|
||||||
// Optional auto update configuration
|
// Optional auto update configuration
|
||||||
AutoUpdate *portainer.StackAutoUpdate
|
AutoUpdate *portainer.StackAutoUpdate
|
||||||
// A list of environment variables used during stack deployment
|
// A list of environment(endpoint) variables used during stack deployment
|
||||||
Env []portainer.Pair
|
Env []portainer.Pair
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ type swarmStackFromFileContentPayload struct {
|
||||||
SwarmID string `example:"jpofkc0i9uo9wtx1zesuk649w" validate:"required"`
|
SwarmID string `example:"jpofkc0i9uo9wtx1zesuk649w" validate:"required"`
|
||||||
// Content of the Stack file
|
// Content of the Stack file
|
||||||
StackFileContent string `example:"version: 3\n services:\n web:\n image:nginx" validate:"required"`
|
StackFileContent string `example:"version: 3\n services:\n web:\n image:nginx" validate:"required"`
|
||||||
// A list of environment variables used during stack deployment
|
// A list of environment(endpoint) variables used during stack deployment
|
||||||
Env []portainer.Pair
|
Env []portainer.Pair
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,7 +109,7 @@ type swarmStackFromGitRepositoryPayload struct {
|
||||||
Name string `example:"myStack" validate:"required"`
|
Name string `example:"myStack" validate:"required"`
|
||||||
// Swarm cluster identifier
|
// Swarm cluster identifier
|
||||||
SwarmID string `example:"jpofkc0i9uo9wtx1zesuk649w" validate:"required"`
|
SwarmID string `example:"jpofkc0i9uo9wtx1zesuk649w" validate:"required"`
|
||||||
// A list of environment variables used during stack deployment
|
// A list of environment(endpoint) variables used during stack deployment
|
||||||
Env []portainer.Pair
|
Env []portainer.Pair
|
||||||
|
|
||||||
// URL of a Git repository hosting the Stack file
|
// URL of a Git repository hosting the Stack file
|
||||||
|
|
|
@ -32,7 +32,7 @@ func (handler *Handler) cleanUp(stack *portainer.Stack, doCleanUp *bool) error {
|
||||||
|
|
||||||
// @id StackCreate
|
// @id StackCreate
|
||||||
// @summary Deploy a new stack
|
// @summary Deploy a new stack
|
||||||
// @description Deploy a new stack into a Docker environment specified via the endpoint identifier.
|
// @description Deploy a new stack into a Docker environment(endpoint) specified via the environment(endpoint) identifier.
|
||||||
// @description **Access policy**: restricted
|
// @description **Access policy**: restricted
|
||||||
// @tags stacks
|
// @tags stacks
|
||||||
// @security jwt
|
// @security jwt
|
||||||
|
@ -40,14 +40,14 @@ func (handler *Handler) cleanUp(stack *portainer.Stack, doCleanUp *bool) error {
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param type query int true "Stack deployment type. Possible values: 1 (Swarm stack) or 2 (Compose stack)." Enums(1,2)
|
// @param type query int true "Stack deployment type. Possible values: 1 (Swarm stack) or 2 (Compose stack)." Enums(1,2)
|
||||||
// @param method query string true "Stack deployment method. Possible values: file, string or repository." Enums(string, file, repository)
|
// @param method query string true "Stack deployment method. Possible values: file, string or repository." Enums(string, file, repository)
|
||||||
// @param endpointId query int true "Identifier of the endpoint that will be used to deploy the stack"
|
// @param endpointId query int true "Identifier of the environment(endpoint) that will be used to deploy the stack"
|
||||||
// @param body_swarm_string body swarmStackFromFileContentPayload false "Required when using method=string and type=1"
|
// @param body_swarm_string body swarmStackFromFileContentPayload false "Required when using method=string and type=1"
|
||||||
// @param body_swarm_repository body swarmStackFromGitRepositoryPayload false "Required when using method=repository and type=1"
|
// @param body_swarm_repository body swarmStackFromGitRepositoryPayload false "Required when using method=repository and type=1"
|
||||||
// @param body_compose_string body composeStackFromFileContentPayload false "Required when using method=string and type=2"
|
// @param body_compose_string body composeStackFromFileContentPayload false "Required when using method=string and type=2"
|
||||||
// @param body_compose_repository body composeStackFromGitRepositoryPayload false "Required when using method=repository and type=2"
|
// @param body_compose_repository body composeStackFromGitRepositoryPayload false "Required when using method=repository and type=2"
|
||||||
// @param Name formData string false "Name of the stack. required when method is file"
|
// @param Name formData string false "Name of the stack. required when method is file"
|
||||||
// @param SwarmID formData string false "Swarm cluster identifier. Required when method equals file and type equals 1. required when method is file"
|
// @param SwarmID formData string false "Swarm cluster identifier. Required when method equals file and type equals 1. required when method is file"
|
||||||
// @param Env formData string false "Environment variables passed during deployment, represented as a JSON array [{'name': 'name', 'value': 'value'}]. Optional, used when method equals file and type equals 1."
|
// @param Env formData string false "Environment(Endpoint) variables passed during deployment, represented as a JSON array [{'name': 'name', 'value': 'value'}]. Optional, used when method equals file and type equals 1."
|
||||||
// @param file formData file false "Stack file. required when method is file"
|
// @param file formData file false "Stack file. required when method is file"
|
||||||
// @success 200 {object} portainer.CustomTemplate
|
// @success 200 {object} portainer.CustomTemplate
|
||||||
// @failure 400 "Invalid request"
|
// @failure 400 "Invalid request"
|
||||||
|
|
|
@ -24,7 +24,7 @@ import (
|
||||||
// @security jwt
|
// @security jwt
|
||||||
// @param id path int true "Stack identifier"
|
// @param id path int true "Stack identifier"
|
||||||
// @param external query boolean false "Set to true to delete an external stack. Only external Swarm stacks are supported"
|
// @param external query boolean false "Set to true to delete an external stack. Only external Swarm stacks are supported"
|
||||||
// @param endpointId query int false "Endpoint identifier used to remove an external stack (required when external is set to true)"
|
// @param endpointId query int false "Environment(Endpoint) identifier used to remove an external stack (required when external is set to true)"
|
||||||
// @success 204 "Success"
|
// @success 204 "Success"
|
||||||
// @failure 400 "Invalid request"
|
// @failure 400 "Invalid request"
|
||||||
// @failure 403 "Permission denied"
|
// @failure 403 "Permission denied"
|
||||||
|
|
|
@ -16,7 +16,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type stackMigratePayload struct {
|
type stackMigratePayload struct {
|
||||||
// Endpoint identifier of the target endpoint where the stack will be relocated
|
// Environment(Endpoint) identifier of the target environment(endpoint) where the stack will be relocated
|
||||||
EndpointID int `example:"2" validate:"required"`
|
EndpointID int `example:"2" validate:"required"`
|
||||||
// Swarm cluster identifier, must match the identifier of the cluster where the stack will be relocated
|
// Swarm cluster identifier, must match the identifier of the cluster where the stack will be relocated
|
||||||
SwarmID string `example:"jpofkc0i9uo9wtx1zesuk649w"`
|
SwarmID string `example:"jpofkc0i9uo9wtx1zesuk649w"`
|
||||||
|
@ -32,14 +32,14 @@ func (payload *stackMigratePayload) Validate(r *http.Request) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// @id StackMigrate
|
// @id StackMigrate
|
||||||
// @summary Migrate a stack to another endpoint
|
// @summary Migrate a stack to another environment(endpoint)
|
||||||
// @description Migrate a stack from an endpoint to another endpoint. It will re-create the stack inside the target endpoint before removing the original stack.
|
// @description Migrate a stack from an environment(endpoint) to another environment(endpoint). It will re-create the stack inside the target environment(endpoint) before removing the original stack.
|
||||||
// @description **Access policy**: restricted
|
// @description **Access policy**: restricted
|
||||||
// @tags stacks
|
// @tags stacks
|
||||||
// @security jwt
|
// @security jwt
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param id path int true "Stack identifier"
|
// @param id path int true "Stack identifier"
|
||||||
// @param endpointId query int false "Stacks created before version 1.18.0 might not have an associated endpoint identifier. Use this optional parameter to set the endpoint identifier used by the stack."
|
// @param endpointId query int false "Stacks created before version 1.18.0 might not have an associated environment(endpoint) identifier. Use this optional parameter to set the environment(endpoint) identifier used by the stack."
|
||||||
// @param body body stackMigratePayload true "Stack migration details"
|
// @param body body stackMigratePayload true "Stack migration details"
|
||||||
// @success 200 {object} portainer.Stack "Success"
|
// @success 200 {object} portainer.Stack "Success"
|
||||||
// @failure 400 "Invalid request"
|
// @failure 400 "Invalid request"
|
||||||
|
@ -99,8 +99,8 @@ func (handler *Handler) stackMigrate(w http.ResponseWriter, r *http.Request) *ht
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: this is a work-around for stacks created with Portainer version >= 1.17.1
|
// TODO: this is a work-around for stacks created with Portainer version >= 1.17.1
|
||||||
// The EndpointID property is not available for these stacks, this API endpoint
|
// The EndpointID property is not available for these stacks, this API environment(endpoint)
|
||||||
// can use the optional EndpointID query parameter to associate a valid endpoint identifier to the stack.
|
// can use the optional EndpointID query parameter to associate a valid environment(endpoint) identifier to the stack.
|
||||||
endpointID, err := request.RetrieveNumericQueryParameter(r, "endpointId", true)
|
endpointID, err := request.RetrieveNumericQueryParameter(r, "endpointId", true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return &httperror.HandlerError{http.StatusBadRequest, "Invalid query parameter: endpointId", err}
|
return &httperror.HandlerError{http.StatusBadRequest, "Invalid query parameter: endpointId", err}
|
||||||
|
|
|
@ -21,7 +21,7 @@ import (
|
||||||
type updateComposeStackPayload struct {
|
type updateComposeStackPayload struct {
|
||||||
// New content of the Stack file
|
// New content of the Stack file
|
||||||
StackFileContent string `example:"version: 3\n services:\n web:\n image:nginx"`
|
StackFileContent string `example:"version: 3\n services:\n web:\n image:nginx"`
|
||||||
// A list of environment variables used during stack deployment
|
// A list of environment(endpoint) variables used during stack deployment
|
||||||
Env []portainer.Pair
|
Env []portainer.Pair
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ func (payload *updateComposeStackPayload) Validate(r *http.Request) error {
|
||||||
type updateSwarmStackPayload struct {
|
type updateSwarmStackPayload struct {
|
||||||
// New content of the Stack file
|
// New content of the Stack file
|
||||||
StackFileContent string `example:"version: 3\n services:\n web:\n image:nginx"`
|
StackFileContent string `example:"version: 3\n services:\n web:\n image:nginx"`
|
||||||
// A list of environment variables used during stack deployment
|
// A list of environment(endpoint) variables used during stack deployment
|
||||||
Env []portainer.Pair
|
Env []portainer.Pair
|
||||||
// Prune services that are no longer referenced (only available for Swarm stacks)
|
// Prune services that are no longer referenced (only available for Swarm stacks)
|
||||||
Prune bool `example:"true"`
|
Prune bool `example:"true"`
|
||||||
|
@ -57,7 +57,7 @@ func (payload *updateSwarmStackPayload) Validate(r *http.Request) error {
|
||||||
// @accept json
|
// @accept json
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param id path int true "Stack identifier"
|
// @param id path int true "Stack identifier"
|
||||||
// @param endpointId query int false "Stacks created before version 1.18.0 might not have an associated endpoint identifier. Use this optional parameter to set the endpoint identifier used by the stack."
|
// @param endpointId query int false "Stacks created before version 1.18.0 might not have an associated environment(endpoint) identifier. Use this optional parameter to set the environment(endpoint) identifier used by the stack."
|
||||||
// @param body body updateSwarmStackPayload true "Stack details"
|
// @param body body updateSwarmStackPayload true "Stack details"
|
||||||
// @success 200 {object} portainer.Stack "Success"
|
// @success 200 {object} portainer.Stack "Success"
|
||||||
// @failure 400 "Invalid request"
|
// @failure 400 "Invalid request"
|
||||||
|
@ -79,8 +79,8 @@ func (handler *Handler) stackUpdate(w http.ResponseWriter, r *http.Request) *htt
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: this is a work-around for stacks created with Portainer version >= 1.17.1
|
// TODO: this is a work-around for stacks created with Portainer version >= 1.17.1
|
||||||
// The EndpointID property is not available for these stacks, this API endpoint
|
// The EndpointID property is not available for these stacks, this API environment(endpoint)
|
||||||
// can use the optional EndpointID query parameter to associate a valid endpoint identifier to the stack.
|
// can use the optional EndpointID query parameter to associate a valid environment(endpoint) identifier to the stack.
|
||||||
endpointID, err := request.RetrieveNumericQueryParameter(r, "endpointId", true)
|
endpointID, err := request.RetrieveNumericQueryParameter(r, "endpointId", true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return &httperror.HandlerError{StatusCode: http.StatusBadRequest, Message: "Invalid query parameter: endpointId", Err: err}
|
return &httperror.HandlerError{StatusCode: http.StatusBadRequest, Message: "Invalid query parameter: endpointId", Err: err}
|
||||||
|
|
|
@ -45,7 +45,7 @@ func (payload *stackGitUpdatePayload) Validate(r *http.Request) error {
|
||||||
// @accept json
|
// @accept json
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param id path int true "Stack identifier"
|
// @param id path int true "Stack identifier"
|
||||||
// @param endpointId query int false "Stacks created before version 1.18.0 might not have an associated endpoint identifier. Use this optional parameter to set the endpoint identifier used by the stack."
|
// @param endpointId query int false "Stacks created before version 1.18.0 might not have an associated environment(endpoint) identifier. Use this optional parameter to set the environment(endpoint) identifier used by the stack."
|
||||||
// @param body body stackGitUpdatePayload true "Git configs for pull and redeploy a stack"
|
// @param body body stackGitUpdatePayload true "Git configs for pull and redeploy a stack"
|
||||||
// @success 200 {object} portainer.Stack "Success"
|
// @success 200 {object} portainer.Stack "Success"
|
||||||
// @failure 400 "Invalid request"
|
// @failure 400 "Invalid request"
|
||||||
|
@ -76,8 +76,8 @@ func (handler *Handler) stackUpdateGit(w http.ResponseWriter, r *http.Request) *
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: this is a work-around for stacks created with Portainer version >= 1.17.1
|
// TODO: this is a work-around for stacks created with Portainer version >= 1.17.1
|
||||||
// The EndpointID property is not available for these stacks, this API endpoint
|
// The EndpointID property is not available for these stacks, this API environment(endpoint)
|
||||||
// can use the optional EndpointID query parameter to associate a valid endpoint identifier to the stack.
|
// can use the optional EndpointID query parameter to associate a valid environment(endpoint) identifier to the stack.
|
||||||
endpointID, err := request.RetrieveNumericQueryParameter(r, "endpointId", true)
|
endpointID, err := request.RetrieveNumericQueryParameter(r, "endpointId", true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return &httperror.HandlerError{StatusCode: http.StatusBadRequest, Message: "Invalid query parameter: endpointId", Err: err}
|
return &httperror.HandlerError{StatusCode: http.StatusBadRequest, Message: "Invalid query parameter: endpointId", Err: err}
|
||||||
|
|
|
@ -46,7 +46,7 @@ func (payload *stackGitRedployPayload) Validate(r *http.Request) error {
|
||||||
// @accept json
|
// @accept json
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param id path int true "Stack identifier"
|
// @param id path int true "Stack identifier"
|
||||||
// @param endpointId query int false "Stacks created before version 1.18.0 might not have an associated endpoint identifier. Use this optional parameter to set the endpoint identifier used by the stack."
|
// @param endpointId query int false "Stacks created before version 1.18.0 might not have an associated environment(endpoint) identifier. Use this optional parameter to set the environment(endpoint) identifier used by the stack."
|
||||||
// @param body body stackGitRedployPayload true "Git configs for pull and redeploy a stack"
|
// @param body body stackGitRedployPayload true "Git configs for pull and redeploy a stack"
|
||||||
// @success 200 {object} portainer.Stack "Success"
|
// @success 200 {object} portainer.Stack "Success"
|
||||||
// @failure 400 "Invalid request"
|
// @failure 400 "Invalid request"
|
||||||
|
@ -72,8 +72,8 @@ func (handler *Handler) stackGitRedeploy(w http.ResponseWriter, r *http.Request)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: this is a work-around for stacks created with Portainer version >= 1.17.1
|
// TODO: this is a work-around for stacks created with Portainer version >= 1.17.1
|
||||||
// The EndpointID property is not available for these stacks, this API endpoint
|
// The EndpointID property is not available for these stacks, this API environment(endpoint)
|
||||||
// can use the optional EndpointID query parameter to associate a valid endpoint identifier to the stack.
|
// can use the optional EndpointID query parameter to associate a valid environment(endpoint) identifier to the stack.
|
||||||
endpointID, err := request.RetrieveNumericQueryParameter(r, "endpointId", true)
|
endpointID, err := request.RetrieveNumericQueryParameter(r, "endpointId", true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return &httperror.HandlerError{StatusCode: http.StatusBadRequest, Message: "Invalid query parameter: endpointId", Err: err}
|
return &httperror.HandlerError{StatusCode: http.StatusBadRequest, Message: "Invalid query parameter: endpointId", Err: err}
|
||||||
|
|
|
@ -12,7 +12,7 @@ import (
|
||||||
|
|
||||||
// @id UploadTLS
|
// @id UploadTLS
|
||||||
// @summary Upload TLS files
|
// @summary Upload TLS files
|
||||||
// @description Use this endpoint to upload TLS files.
|
// @description Use this environment(endpoint) to upload TLS files.
|
||||||
// @description **Access policy**: administrator
|
// @description **Access policy**: administrator
|
||||||
// @tags upload
|
// @tags upload
|
||||||
// @security jwt
|
// @security jwt
|
||||||
|
|
|
@ -15,7 +15,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// @summary Attach a websocket
|
// @summary Attach a websocket
|
||||||
// @description If the nodeName query parameter is present, the request will be proxied to the underlying agent endpoint.
|
// @description If the nodeName query parameter is present, the request will be proxied to the underlying agent environment(endpoint).
|
||||||
// @description If the nodeName query parameter is not specified, the request will be upgraded to the websocket protocol and
|
// @description If the nodeName query parameter is not specified, the request will be upgraded to the websocket protocol and
|
||||||
// @description an AttachStart operation HTTP request will be created and hijacked.
|
// @description an AttachStart operation HTTP request will be created and hijacked.
|
||||||
// @description Authentication and access is controlled via the mandatory token query parameter.
|
// @description Authentication and access is controlled via the mandatory token query parameter.
|
||||||
|
@ -23,9 +23,9 @@ import (
|
||||||
// @tags websocket
|
// @tags websocket
|
||||||
// @accept json
|
// @accept json
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param endpointId query int true "endpoint ID of the endpoint where the resource is located"
|
// @param endpointId query int true "environment(endpoint) ID of the environment(endpoint) where the resource is located"
|
||||||
// @param nodeName query string false "node name"
|
// @param nodeName query string false "node name"
|
||||||
// @param token query string true "JWT token used for authentication against this endpoint"
|
// @param token query string true "JWT token used for authentication against this environment(endpoint)"
|
||||||
// @success 200
|
// @success 200
|
||||||
// @failure 400
|
// @failure 400
|
||||||
// @failure 403
|
// @failure 403
|
||||||
|
|
|
@ -23,7 +23,7 @@ type execStartOperationPayload struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// @summary Execute a websocket
|
// @summary Execute a websocket
|
||||||
// @description If the nodeName query parameter is present, the request will be proxied to the underlying agent endpoint.
|
// @description If the nodeName query parameter is present, the request will be proxied to the underlying agent environment(endpoint).
|
||||||
// @description If the nodeName query parameter is not specified, the request will be upgraded to the websocket protocol and
|
// @description If the nodeName query parameter is not specified, the request will be upgraded to the websocket protocol and
|
||||||
// @description an ExecStart operation HTTP request will be created and hijacked.
|
// @description an ExecStart operation HTTP request will be created and hijacked.
|
||||||
// @description Authentication and access is controlled via the mandatory token query parameter.
|
// @description Authentication and access is controlled via the mandatory token query parameter.
|
||||||
|
@ -31,9 +31,9 @@ type execStartOperationPayload struct {
|
||||||
// @tags websocket
|
// @tags websocket
|
||||||
// @accept json
|
// @accept json
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param endpointId query int true "endpoint ID of the endpoint where the resource is located"
|
// @param endpointId query int true "environment(endpoint) ID of the environment(endpoint) where the resource is located"
|
||||||
// @param nodeName query string false "node name"
|
// @param nodeName query string false "node name"
|
||||||
// @param token query string true "JWT token used for authentication against this endpoint"
|
// @param token query string true "JWT token used for authentication against this environment(endpoint)"
|
||||||
// @success 200
|
// @success 200
|
||||||
// @failure 400
|
// @failure 400
|
||||||
// @failure 409
|
// @failure 409
|
||||||
|
|
|
@ -24,12 +24,12 @@ import (
|
||||||
// @tags websocket
|
// @tags websocket
|
||||||
// @accept json
|
// @accept json
|
||||||
// @produce json
|
// @produce json
|
||||||
// @param endpointId query int true "endpoint ID of the endpoint where the resource is located"
|
// @param endpointId query int true "environment(endpoint) ID of the environment(endpoint) where the resource is located"
|
||||||
// @param namespace query string true "namespace where the container is located"
|
// @param namespace query string true "namespace where the container is located"
|
||||||
// @param podName query string true "name of the pod containing the container"
|
// @param podName query string true "name of the pod containing the container"
|
||||||
// @param containerName query string true "name of the container"
|
// @param containerName query string true "name of the container"
|
||||||
// @param command query string true "command to execute in the container"
|
// @param command query string true "command to execute in the container"
|
||||||
// @param token query string true "JWT token used for authentication against this endpoint"
|
// @param token query string true "JWT token used for authentication against this environment(endpoint)"
|
||||||
// @success 200
|
// @success 200
|
||||||
// @failure 400
|
// @failure 400
|
||||||
// @failure 403
|
// @failure 403
|
||||||
|
|
|
@ -15,8 +15,8 @@ import (
|
||||||
// Authentication and access is controlled via the mandatory token query parameter.
|
// Authentication and access is controlled via the mandatory token query parameter.
|
||||||
// The request will proxy input from the client to the pod via long-lived websocket connection.
|
// The request will proxy input from the client to the pod via long-lived websocket connection.
|
||||||
// The following query parameters are mandatory:
|
// The following query parameters are mandatory:
|
||||||
// * token: JWT token used for authentication against this endpoint
|
// * token: JWT token used for authentication against this environment(endpoint)
|
||||||
// * endpointId: endpoint ID of the endpoint where the resource is located
|
// * endpointId: environment(endpoint) ID of the environment(endpoint) where the resource is located
|
||||||
func (handler *Handler) websocketShellPodExec(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
func (handler *Handler) websocketShellPodExec(w http.ResponseWriter, r *http.Request) *httperror.HandlerError {
|
||||||
endpointID, err := request.RetrieveNumericQueryParameter(r, "endpointId", false)
|
endpointID, err := request.RetrieveNumericQueryParameter(r, "endpointId", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -51,7 +51,7 @@ func (factory *ProxyFactory) NewLegacyExtensionProxy(extensionAPIURL string) (ht
|
||||||
return proxy, nil
|
return proxy, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewEndpointProxy returns a new reverse proxy (filesystem based or HTTP) to an endpoint API server
|
// NewEndpointProxy returns a new reverse proxy (filesystem based or HTTP) to an environment(endpoint) API server
|
||||||
func (factory *ProxyFactory) NewEndpointProxy(endpoint *portainer.Endpoint) (http.Handler, error) {
|
func (factory *ProxyFactory) NewEndpointProxy(endpoint *portainer.Endpoint) (http.Handler, error) {
|
||||||
switch endpoint.Type {
|
switch endpoint.Type {
|
||||||
case portainer.AzureEnvironment:
|
case portainer.AzureEnvironment:
|
||||||
|
|
|
@ -17,7 +17,7 @@ import (
|
||||||
// TODO: contain code related to legacy extension management
|
// TODO: contain code related to legacy extension management
|
||||||
|
|
||||||
type (
|
type (
|
||||||
// Manager represents a service used to manage proxies to endpoints and extensions.
|
// Manager represents a service used to manage proxies to environments(endpoints) and extensions.
|
||||||
Manager struct {
|
Manager struct {
|
||||||
proxyFactory *factory.ProxyFactory
|
proxyFactory *factory.ProxyFactory
|
||||||
endpointProxies cmap.ConcurrentMap
|
endpointProxies cmap.ConcurrentMap
|
||||||
|
@ -36,7 +36,7 @@ func NewManager(dataStore portainer.DataStore, signatureService portainer.Digita
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateAndRegisterEndpointProxy creates a new HTTP reverse proxy based on endpoint properties and and adds it to the registered proxies.
|
// CreateAndRegisterEndpointProxy creates a new HTTP reverse proxy based on environment(endpoint) properties and and adds it to the registered proxies.
|
||||||
// It can also be used to create a new HTTP reverse proxy and replace an already registered proxy.
|
// It can also be used to create a new HTTP reverse proxy and replace an already registered proxy.
|
||||||
func (manager *Manager) CreateAndRegisterEndpointProxy(endpoint *portainer.Endpoint) (http.Handler, error) {
|
func (manager *Manager) CreateAndRegisterEndpointProxy(endpoint *portainer.Endpoint) (http.Handler, error) {
|
||||||
proxy, err := manager.proxyFactory.NewEndpointProxy(endpoint)
|
proxy, err := manager.proxyFactory.NewEndpointProxy(endpoint)
|
||||||
|
@ -48,7 +48,7 @@ func (manager *Manager) CreateAndRegisterEndpointProxy(endpoint *portainer.Endpo
|
||||||
return proxy, nil
|
return proxy, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateComposeProxyServer creates a new HTTP reverse proxy based on endpoint properties and and adds it to the registered proxies.
|
// CreateComposeProxyServer creates a new HTTP reverse proxy based on environment(endpoint) properties and and adds it to the registered proxies.
|
||||||
// It can also be used to create a new HTTP reverse proxy and replace an already registered proxy.
|
// It can also be used to create a new HTTP reverse proxy and replace an already registered proxy.
|
||||||
func (manager *Manager) CreateComposeProxyServer(endpoint *portainer.Endpoint) (*factory.ProxyServer, error) {
|
func (manager *Manager) CreateComposeProxyServer(endpoint *portainer.Endpoint) (*factory.ProxyServer, error) {
|
||||||
return manager.proxyFactory.NewDockerComposeAgentProxy(endpoint)
|
return manager.proxyFactory.NewDockerComposeAgentProxy(endpoint)
|
||||||
|
@ -65,7 +65,7 @@ func (manager *Manager) GetEndpointProxy(endpoint *portainer.Endpoint) http.Hand
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteEndpointProxy deletes the proxy associated to a key
|
// DeleteEndpointProxy deletes the proxy associated to a key
|
||||||
// and cleans the k8s endpoint client cache. DeleteEndpointProxy
|
// and cleans the k8s environment(endpoint) client cache. DeleteEndpointProxy
|
||||||
// is currently only called for edge connection clean up.
|
// is currently only called for edge connection clean up.
|
||||||
func (manager *Manager) DeleteEndpointProxy(endpoint *portainer.Endpoint) {
|
func (manager *Manager) DeleteEndpointProxy(endpoint *portainer.Endpoint) {
|
||||||
manager.endpointProxies.Remove(fmt.Sprint(endpoint.ID))
|
manager.endpointProxies.Remove(fmt.Sprint(endpoint.ID))
|
||||||
|
|
|
@ -103,9 +103,9 @@ func AuthorizedTeamManagement(teamID portainer.TeamID, context *RestrictedReques
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// authorizedEndpointAccess ensure that the user can access the specified endpoint.
|
// authorizedEndpointAccess ensure that the user can access the specified environment(endpoint).
|
||||||
// It will check if the user is part of the authorized users or part of a team that is
|
// It will check if the user is part of the authorized users or part of a team that is
|
||||||
// listed in the authorized teams of the endpoint and the associated group.
|
// listed in the authorized teams of the environment(endpoint) and the associated group.
|
||||||
func authorizedEndpointAccess(endpoint *portainer.Endpoint, endpointGroup *portainer.EndpointGroup, userID portainer.UserID, memberships []portainer.TeamMembership) bool {
|
func authorizedEndpointAccess(endpoint *portainer.Endpoint, endpointGroup *portainer.EndpointGroup, userID portainer.UserID, memberships []portainer.TeamMembership) bool {
|
||||||
groupAccess := AuthorizedAccess(userID, memberships, endpointGroup.UserAccessPolicies, endpointGroup.TeamAccessPolicies)
|
groupAccess := AuthorizedAccess(userID, memberships, endpointGroup.UserAccessPolicies, endpointGroup.TeamAccessPolicies)
|
||||||
if !groupAccess {
|
if !groupAccess {
|
||||||
|
@ -114,7 +114,7 @@ func authorizedEndpointAccess(endpoint *portainer.Endpoint, endpointGroup *porta
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// authorizedEndpointGroupAccess ensure that the user can access the specified endpoint group.
|
// authorizedEndpointGroupAccess ensure that the user can access the specified environment(endpoint) group.
|
||||||
// It will check if the user is part of the authorized users or part of a team that is
|
// It will check if the user is part of the authorized users or part of a team that is
|
||||||
// listed in the authorized teams.
|
// listed in the authorized teams.
|
||||||
func authorizedEndpointGroupAccess(endpointGroup *portainer.EndpointGroup, userID portainer.UserID, memberships []portainer.TeamMembership) bool {
|
func authorizedEndpointGroupAccess(endpointGroup *portainer.EndpointGroup, userID portainer.UserID, memberships []portainer.TeamMembership) bool {
|
||||||
|
@ -123,7 +123,7 @@ func authorizedEndpointGroupAccess(endpointGroup *portainer.EndpointGroup, userI
|
||||||
|
|
||||||
// AuthorizedRegistryAccess ensure that the user can access the specified registry.
|
// AuthorizedRegistryAccess ensure that the user can access the specified registry.
|
||||||
// It will check if the user is part of the authorized users or part of a team that is
|
// It will check if the user is part of the authorized users or part of a team that is
|
||||||
// listed in the authorized teams for a specified endpoint,
|
// listed in the authorized teams for a specified environment(endpoint),
|
||||||
func AuthorizedRegistryAccess(registry *portainer.Registry, user *portainer.User, teamMemberships []portainer.TeamMembership, endpointID portainer.EndpointID) bool {
|
func AuthorizedRegistryAccess(registry *portainer.Registry, user *portainer.User, teamMemberships []portainer.TeamMembership, endpointID portainer.EndpointID) bool {
|
||||||
if user.Role == portainer.AdministratorRole {
|
if user.Role == portainer.AdministratorRole {
|
||||||
return true
|
return true
|
||||||
|
|
|
@ -36,16 +36,16 @@ func NewRequestBouncer(dataStore portainer.DataStore, jwtService portainer.JWTSe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// PublicAccess defines a security check for public API endpoints.
|
// PublicAccess defines a security check for public API environments(endpoints).
|
||||||
// No authentication is required to access these endpoints.
|
// No authentication is required to access these environments(endpoints).
|
||||||
func (bouncer *RequestBouncer) PublicAccess(h http.Handler) http.Handler {
|
func (bouncer *RequestBouncer) PublicAccess(h http.Handler) http.Handler {
|
||||||
h = mwSecureHeaders(h)
|
h = mwSecureHeaders(h)
|
||||||
return h
|
return h
|
||||||
}
|
}
|
||||||
|
|
||||||
// AdminAccess defines a security check for API endpoints that require an authorization check.
|
// AdminAccess defines a security check for API environments(endpoints) that require an authorization check.
|
||||||
// Authentication is required to access these endpoints.
|
// Authentication is required to access these environments(endpoints).
|
||||||
// The administrator role is required to use these endpoints.
|
// The administrator role is required to use these environments(endpoints).
|
||||||
// The request context will be enhanced with a RestrictedRequestContext object
|
// The request context will be enhanced with a RestrictedRequestContext object
|
||||||
// that might be used later to inside the API operation for extra authorization validation
|
// that might be used later to inside the API operation for extra authorization validation
|
||||||
// and resource filtering.
|
// and resource filtering.
|
||||||
|
@ -56,8 +56,8 @@ func (bouncer *RequestBouncer) AdminAccess(h http.Handler) http.Handler {
|
||||||
return h
|
return h
|
||||||
}
|
}
|
||||||
|
|
||||||
// RestrictedAccess defines a security check for restricted API endpoints.
|
// RestrictedAccess defines a security check for restricted API environments(endpoints).
|
||||||
// Authentication is required to access these endpoints.
|
// Authentication is required to access these environments(endpoints).
|
||||||
// The request context will be enhanced with a RestrictedRequestContext object
|
// The request context will be enhanced with a RestrictedRequestContext object
|
||||||
// that might be used later to inside the API operation for extra authorization validation
|
// that might be used later to inside the API operation for extra authorization validation
|
||||||
// and resource filtering.
|
// and resource filtering.
|
||||||
|
@ -68,8 +68,8 @@ func (bouncer *RequestBouncer) RestrictedAccess(h http.Handler) http.Handler {
|
||||||
return h
|
return h
|
||||||
}
|
}
|
||||||
|
|
||||||
// AuthenticatedAccess defines a security check for restricted API endpoints.
|
// AuthenticatedAccess defines a security check for restricted API environments(endpoints).
|
||||||
// Authentication is required to access these endpoints.
|
// Authentication is required to access these environments(endpoints).
|
||||||
// The request context will be enhanced with a RestrictedRequestContext object
|
// The request context will be enhanced with a RestrictedRequestContext object
|
||||||
// that might be used later to inside the API operation for extra authorization validation
|
// that might be used later to inside the API operation for extra authorization validation
|
||||||
// and resource filtering.
|
// and resource filtering.
|
||||||
|
@ -80,8 +80,8 @@ func (bouncer *RequestBouncer) AuthenticatedAccess(h http.Handler) http.Handler
|
||||||
}
|
}
|
||||||
|
|
||||||
// AuthorizedEndpointOperation retrieves the JWT token from the request context and verifies
|
// AuthorizedEndpointOperation retrieves the JWT token from the request context and verifies
|
||||||
// that the user can access the specified endpoint.
|
// that the user can access the specified environment(endpoint).
|
||||||
// An error is returned when access to the endpoint is denied or if the user do not have the required
|
// An error is returned when access to the environments(endpoints) is denied or if the user do not have the required
|
||||||
// authorization to execute the operation.
|
// authorization to execute the operation.
|
||||||
func (bouncer *RequestBouncer) AuthorizedEndpointOperation(r *http.Request, endpoint *portainer.Endpoint) error {
|
func (bouncer *RequestBouncer) AuthorizedEndpointOperation(r *http.Request, endpoint *portainer.Endpoint) error {
|
||||||
tokenData, err := RetrieveTokenData(r)
|
tokenData, err := RetrieveTokenData(r)
|
||||||
|
@ -110,7 +110,7 @@ func (bouncer *RequestBouncer) AuthorizedEndpointOperation(r *http.Request, endp
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// AuthorizedEdgeEndpointOperation verifies that the request was received from a valid Edge endpoint
|
// AuthorizedEdgeEndpointOperation verifies that the request was received from a valid Edge environment(endpoint)
|
||||||
func (bouncer *RequestBouncer) AuthorizedEdgeEndpointOperation(r *http.Request, endpoint *portainer.Endpoint) error {
|
func (bouncer *RequestBouncer) AuthorizedEdgeEndpointOperation(r *http.Request, endpoint *portainer.Endpoint) error {
|
||||||
if endpoint.Type != portainer.EdgeAgentOnKubernetesEnvironment && endpoint.Type != portainer.EdgeAgentOnDockerEnvironment {
|
if endpoint.Type != portainer.EdgeAgentOnKubernetesEnvironment && endpoint.Type != portainer.EdgeAgentOnDockerEnvironment {
|
||||||
return errors.New("Invalid environment type")
|
return errors.New("Invalid environment type")
|
||||||
|
@ -138,9 +138,9 @@ func (bouncer *RequestBouncer) mwAuthenticatedUser(h http.Handler) http.Handler
|
||||||
}
|
}
|
||||||
|
|
||||||
// mwCheckPortainerAuthorizations will verify that the user has the required authorization to access
|
// mwCheckPortainerAuthorizations will verify that the user has the required authorization to access
|
||||||
// a specific API endpoint.
|
// a specific API environment(endpoint).
|
||||||
// If the administratorOnly flag is specified, this will prevent non-admin
|
// If the administratorOnly flag is specified, this will prevent non-admin
|
||||||
// users from accessing the endpoint.
|
// users from accessing the environment(endpoint).
|
||||||
func (bouncer *RequestBouncer) mwCheckPortainerAuthorizations(next http.Handler, administratorOnly bool) http.Handler {
|
func (bouncer *RequestBouncer) mwCheckPortainerAuthorizations(next http.Handler, administratorOnly bool) http.Handler {
|
||||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
tokenData, err := RetrieveTokenData(r)
|
tokenData, err := RetrieveTokenData(r)
|
||||||
|
|
|
@ -80,8 +80,8 @@ func FilterRegistries(registries []portainer.Registry, user *portainer.User, tea
|
||||||
return filteredRegistries
|
return filteredRegistries
|
||||||
}
|
}
|
||||||
|
|
||||||
// FilterEndpoints filters endpoints based on user role and team memberships.
|
// FilterEndpoints filters environments(endpoints) based on user role and team memberships.
|
||||||
// Non administrator users only have access to authorized endpoints (can be inherited via endoint groups).
|
// Non administrator users only have access to authorized environments(endpoints) (can be inherited via endoint groups).
|
||||||
func FilterEndpoints(endpoints []portainer.Endpoint, groups []portainer.EndpointGroup, context *RestrictedRequestContext) []portainer.Endpoint {
|
func FilterEndpoints(endpoints []portainer.Endpoint, groups []portainer.EndpointGroup, context *RestrictedRequestContext) []portainer.Endpoint {
|
||||||
filteredEndpoints := endpoints
|
filteredEndpoints := endpoints
|
||||||
|
|
||||||
|
@ -100,8 +100,8 @@ func FilterEndpoints(endpoints []portainer.Endpoint, groups []portainer.Endpoint
|
||||||
return filteredEndpoints
|
return filteredEndpoints
|
||||||
}
|
}
|
||||||
|
|
||||||
// FilterEndpointGroups filters endpoint groups based on user role and team memberships.
|
// FilterEndpointGroups filters environment(endpoint) groups based on user role and team memberships.
|
||||||
// Non administrator users only have access to authorized endpoint groups.
|
// Non administrator users only have access to authorized environment(endpoint) groups.
|
||||||
func FilterEndpointGroups(endpointGroups []portainer.EndpointGroup, context *RestrictedRequestContext) []portainer.EndpointGroup {
|
func FilterEndpointGroups(endpointGroups []portainer.EndpointGroup, context *RestrictedRequestContext) []portainer.EndpointGroup {
|
||||||
filteredEndpointGroups := endpointGroups
|
filteredEndpointGroups := endpointGroups
|
||||||
|
|
||||||
|
|
|
@ -19,8 +19,8 @@ func NewService(dataStore portainer.DataStore) *Service {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// DefaultEndpointAuthorizationsForEndpointAdministratorRole returns the default endpoint authorizations
|
// DefaultEndpointAuthorizationsForEndpointAdministratorRole returns the default environment(endpoint) authorizations
|
||||||
// associated to the endpoint administrator role.
|
// associated to the environment(endpoint) administrator role.
|
||||||
func DefaultEndpointAuthorizationsForEndpointAdministratorRole() portainer.Authorizations {
|
func DefaultEndpointAuthorizationsForEndpointAdministratorRole() portainer.Authorizations {
|
||||||
return map[portainer.Authorization]bool{
|
return map[portainer.Authorization]bool{
|
||||||
portainer.OperationDockerContainerArchiveInfo: true,
|
portainer.OperationDockerContainerArchiveInfo: true,
|
||||||
|
@ -157,7 +157,7 @@ func DefaultEndpointAuthorizationsForEndpointAdministratorRole() portainer.Autho
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// DefaultEndpointAuthorizationsForHelpDeskRole returns the default endpoint authorizations
|
// DefaultEndpointAuthorizationsForHelpDeskRole returns the default environment(endpoint) authorizations
|
||||||
// associated to the helpdesk role.
|
// associated to the helpdesk role.
|
||||||
func DefaultEndpointAuthorizationsForHelpDeskRole(volumeBrowsingAuthorizations bool) portainer.Authorizations {
|
func DefaultEndpointAuthorizationsForHelpDeskRole(volumeBrowsingAuthorizations bool) portainer.Authorizations {
|
||||||
authorizations := map[portainer.Authorization]bool{
|
authorizations := map[portainer.Authorization]bool{
|
||||||
|
@ -216,7 +216,7 @@ func DefaultEndpointAuthorizationsForHelpDeskRole(volumeBrowsingAuthorizations b
|
||||||
return authorizations
|
return authorizations
|
||||||
}
|
}
|
||||||
|
|
||||||
// DefaultEndpointAuthorizationsForStandardUserRole returns the default endpoint authorizations
|
// DefaultEndpointAuthorizationsForStandardUserRole returns the default environment(endpoint) authorizations
|
||||||
// associated to the standard user role.
|
// associated to the standard user role.
|
||||||
func DefaultEndpointAuthorizationsForStandardUserRole(volumeBrowsingAuthorizations bool) portainer.Authorizations {
|
func DefaultEndpointAuthorizationsForStandardUserRole(volumeBrowsingAuthorizations bool) portainer.Authorizations {
|
||||||
authorizations := map[portainer.Authorization]bool{
|
authorizations := map[portainer.Authorization]bool{
|
||||||
|
@ -350,7 +350,7 @@ func DefaultEndpointAuthorizationsForStandardUserRole(volumeBrowsingAuthorizatio
|
||||||
return authorizations
|
return authorizations
|
||||||
}
|
}
|
||||||
|
|
||||||
// DefaultEndpointAuthorizationsForReadOnlyUserRole returns the default endpoint authorizations
|
// DefaultEndpointAuthorizationsForReadOnlyUserRole returns the default environment(endpoint) authorizations
|
||||||
// associated to the readonly user role.
|
// associated to the readonly user role.
|
||||||
func DefaultEndpointAuthorizationsForReadOnlyUserRole(volumeBrowsingAuthorizations bool) portainer.Authorizations {
|
func DefaultEndpointAuthorizationsForReadOnlyUserRole(volumeBrowsingAuthorizations bool) portainer.Authorizations {
|
||||||
authorizations := map[portainer.Authorization]bool{
|
authorizations := map[portainer.Authorization]bool{
|
||||||
|
|
|
@ -5,7 +5,7 @@ import (
|
||||||
"github.com/portainer/portainer/api/internal/tag"
|
"github.com/portainer/portainer/api/internal/tag"
|
||||||
)
|
)
|
||||||
|
|
||||||
// EdgeGroupRelatedEndpoints returns a list of endpoints related to this Edge group
|
// EdgeGroupRelatedEndpoints returns a list of environments(endpoints) related to this Edge group
|
||||||
func EdgeGroupRelatedEndpoints(edgeGroup *portainer.EdgeGroup, endpoints []portainer.Endpoint, endpointGroups []portainer.EndpointGroup) []portainer.EndpointID {
|
func EdgeGroupRelatedEndpoints(edgeGroup *portainer.EdgeGroup, endpoints []portainer.Endpoint, endpointGroups []portainer.EndpointGroup) []portainer.EndpointID {
|
||||||
if !edgeGroup.Dynamic {
|
if !edgeGroup.Dynamic {
|
||||||
return edgeGroup.Endpoints
|
return edgeGroup.Endpoints
|
||||||
|
@ -33,7 +33,7 @@ func EdgeGroupRelatedEndpoints(edgeGroup *portainer.EdgeGroup, endpoints []porta
|
||||||
return endpointIDs
|
return endpointIDs
|
||||||
}
|
}
|
||||||
|
|
||||||
// edgeGroupRelatedToEndpoint returns true is edgeGroup is associated with endpoint
|
// edgeGroupRelatedToEndpoint returns true is edgeGroup is associated with environment(endpoint)
|
||||||
func edgeGroupRelatedToEndpoint(edgeGroup *portainer.EdgeGroup, endpoint *portainer.Endpoint, endpointGroup *portainer.EndpointGroup) bool {
|
func edgeGroupRelatedToEndpoint(edgeGroup *portainer.EdgeGroup, endpoint *portainer.Endpoint, endpointGroup *portainer.EndpointGroup) bool {
|
||||||
if !edgeGroup.Dynamic {
|
if !edgeGroup.Dynamic {
|
||||||
for _, endpointID := range edgeGroup.Endpoints {
|
for _, endpointID := range edgeGroup.Endpoints {
|
||||||
|
|
|
@ -2,7 +2,7 @@ package edge
|
||||||
|
|
||||||
import portainer "github.com/portainer/portainer/api"
|
import portainer "github.com/portainer/portainer/api"
|
||||||
|
|
||||||
// LoadEdgeJobs registers all edge jobs inside corresponding endpoint tunnel
|
// LoadEdgeJobs registers all edge jobs inside corresponding environment(endpoint) tunnel
|
||||||
func LoadEdgeJobs(dataStore portainer.DataStore, reverseTunnelService portainer.ReverseTunnelService) error {
|
func LoadEdgeJobs(dataStore portainer.DataStore, reverseTunnelService portainer.ReverseTunnelService) error {
|
||||||
edgeJobs, err := dataStore.EdgeJob().EdgeJobs()
|
edgeJobs, err := dataStore.EdgeJob().EdgeJobs()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -5,7 +5,7 @@ import (
|
||||||
"github.com/portainer/portainer/api"
|
"github.com/portainer/portainer/api"
|
||||||
)
|
)
|
||||||
|
|
||||||
// EdgeStackRelatedEndpoints returns a list of endpoints related to this Edge stack
|
// EdgeStackRelatedEndpoints returns a list of environments(endpoints) related to this Edge stack
|
||||||
func EdgeStackRelatedEndpoints(edgeGroupIDs []portainer.EdgeGroupID, endpoints []portainer.Endpoint, endpointGroups []portainer.EndpointGroup, edgeGroups []portainer.EdgeGroup) ([]portainer.EndpointID, error) {
|
func EdgeStackRelatedEndpoints(edgeGroupIDs []portainer.EdgeGroupID, endpoints []portainer.Endpoint, endpointGroups []portainer.EndpointGroup, edgeGroups []portainer.EdgeGroup) ([]portainer.EndpointID, error) {
|
||||||
edgeStackEndpoints := []portainer.EndpointID{}
|
edgeStackEndpoints := []portainer.EndpointID{}
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ package edge
|
||||||
|
|
||||||
import "github.com/portainer/portainer/api"
|
import "github.com/portainer/portainer/api"
|
||||||
|
|
||||||
// EndpointRelatedEdgeStacks returns a list of Edge stacks related to this Endpoint
|
// EndpointRelatedEdgeStacks returns a list of Edge stacks related to this Environment(Endpoint)
|
||||||
func EndpointRelatedEdgeStacks(endpoint *portainer.Endpoint, endpointGroup *portainer.EndpointGroup, edgeGroups []portainer.EdgeGroup, edgeStacks []portainer.EdgeStack) []portainer.EdgeStackID {
|
func EndpointRelatedEdgeStacks(endpoint *portainer.Endpoint, endpointGroup *portainer.EndpointGroup, edgeGroups []portainer.EdgeGroup, edgeStacks []portainer.EdgeStack) []portainer.EdgeStackID {
|
||||||
relatedEdgeGroupsSet := map[portainer.EdgeGroupID]bool{}
|
relatedEdgeGroupsSet := map[portainer.EdgeGroupID]bool{}
|
||||||
|
|
||||||
|
|
|
@ -6,19 +6,19 @@ import (
|
||||||
portainer "github.com/portainer/portainer/api"
|
portainer "github.com/portainer/portainer/api"
|
||||||
)
|
)
|
||||||
|
|
||||||
// IsLocalEndpoint returns true if this is a local endpoint
|
// IsLocalEndpoint returns true if this is a local environment(endpoint)
|
||||||
func IsLocalEndpoint(endpoint *portainer.Endpoint) bool {
|
func IsLocalEndpoint(endpoint *portainer.Endpoint) bool {
|
||||||
return strings.HasPrefix(endpoint.URL, "unix://") || strings.HasPrefix(endpoint.URL, "npipe://") || endpoint.Type == 5
|
return strings.HasPrefix(endpoint.URL, "unix://") || strings.HasPrefix(endpoint.URL, "npipe://") || endpoint.Type == 5
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsKubernetesEndpoint returns true if this is a kubernetes endpoint
|
// IsKubernetesEndpoint returns true if this is a kubernetes environment(endpoint)
|
||||||
func IsKubernetesEndpoint(endpoint *portainer.Endpoint) bool {
|
func IsKubernetesEndpoint(endpoint *portainer.Endpoint) bool {
|
||||||
return endpoint.Type == portainer.KubernetesLocalEnvironment ||
|
return endpoint.Type == portainer.KubernetesLocalEnvironment ||
|
||||||
endpoint.Type == portainer.AgentOnKubernetesEnvironment ||
|
endpoint.Type == portainer.AgentOnKubernetesEnvironment ||
|
||||||
endpoint.Type == portainer.EdgeAgentOnKubernetesEnvironment
|
endpoint.Type == portainer.EdgeAgentOnKubernetesEnvironment
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsDockerEndpoint returns true if this is a docker endpoint
|
// IsDockerEndpoint returns true if this is a docker environment(endpoint)
|
||||||
func IsDockerEndpoint(endpoint *portainer.Endpoint) bool {
|
func IsDockerEndpoint(endpoint *portainer.Endpoint) bool {
|
||||||
return endpoint.Type == portainer.DockerEnvironment ||
|
return endpoint.Type == portainer.DockerEnvironment ||
|
||||||
endpoint.Type == portainer.AgentOnDockerEnvironment ||
|
endpoint.Type == portainer.AgentOnDockerEnvironment ||
|
||||||
|
|
|
@ -9,9 +9,9 @@ import (
|
||||||
portainer "github.com/portainer/portainer/api"
|
portainer "github.com/portainer/portainer/api"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Service repesents a service to manage endpoint snapshots.
|
// Service repesents a service to manage environment(endpoint) snapshots.
|
||||||
// It provides an interface to start background snapshots as well as
|
// It provides an interface to start background snapshots as well as
|
||||||
// specific Docker/Kubernetes endpoint snapshot methods.
|
// specific Docker/Kubernetes environment(endpoint) snapshot methods.
|
||||||
type Service struct {
|
type Service struct {
|
||||||
dataStore portainer.DataStore
|
dataStore portainer.DataStore
|
||||||
refreshSignal chan struct{}
|
refreshSignal chan struct{}
|
||||||
|
@ -37,7 +37,7 @@ func NewService(snapshotInterval string, dataStore portainer.DataStore, dockerSn
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start will start a background routine to execute periodic snapshots of endpoints
|
// Start will start a background routine to execute periodic snapshots of environments(endpoints)
|
||||||
func (service *Service) Start() {
|
func (service *Service) Start() {
|
||||||
if service.refreshSignal != nil {
|
if service.refreshSignal != nil {
|
||||||
return
|
return
|
||||||
|
@ -72,8 +72,8 @@ func (service *Service) SetSnapshotInterval(snapshotInterval string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// SupportDirectSnapshot checks whether an endpoint can be used to trigger a direct a snapshot.
|
// SupportDirectSnapshot checks whether an environment(endpoint) can be used to trigger a direct a snapshot.
|
||||||
// It is mostly true for all endpoints except Edge and Azure endpoints.
|
// It is mostly true for all environments(endpoints) except Edge and Azure environments(endpoints).
|
||||||
func SupportDirectSnapshot(endpoint *portainer.Endpoint) bool {
|
func SupportDirectSnapshot(endpoint *portainer.Endpoint) bool {
|
||||||
switch endpoint.Type {
|
switch endpoint.Type {
|
||||||
case portainer.EdgeAgentOnDockerEnvironment, portainer.EdgeAgentOnKubernetesEnvironment, portainer.AzureEnvironment:
|
case portainer.EdgeAgentOnDockerEnvironment, portainer.EdgeAgentOnKubernetesEnvironment, portainer.AzureEnvironment:
|
||||||
|
@ -82,8 +82,8 @@ func SupportDirectSnapshot(endpoint *portainer.Endpoint) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// SnapshotEndpoint will create a snapshot of the endpoint based on the endpoint type.
|
// SnapshotEndpoint will create a snapshot of the environment(endpoint) based on the environment(endpoint) type.
|
||||||
// If the snapshot is a success, it will be associated to the endpoint.
|
// If the snapshot is a success, it will be associated to the environment(endpoint).
|
||||||
func (service *Service) SnapshotEndpoint(endpoint *portainer.Endpoint) error {
|
func (service *Service) SnapshotEndpoint(endpoint *portainer.Endpoint) error {
|
||||||
switch endpoint.Type {
|
switch endpoint.Type {
|
||||||
case portainer.AzureEnvironment:
|
case portainer.AzureEnvironment:
|
||||||
|
@ -189,7 +189,7 @@ func (service *Service) snapshotEndpoints() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// FetchDockerID fetches info.Swarm.Cluster.ID if endpoint is swarm and info.ID otherwise
|
// FetchDockerID fetches info.Swarm.Cluster.ID if environment(endpoint) is swarm and info.ID otherwise
|
||||||
func FetchDockerID(snapshot portainer.DockerSnapshot) (string, error) {
|
func FetchDockerID(snapshot portainer.DockerSnapshot) (string, error) {
|
||||||
info, done := snapshot.SnapshotRaw.Info.(map[string]interface{})
|
info, done := snapshot.SnapshotRaw.Info.(map[string]interface{})
|
||||||
if !done {
|
if !done {
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue