// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package api
import (
"io"
"strings"
"time"
)
type License struct {
// The unique identifier of the license
LicenseID string ` json:"license_id" `
// The customer ID associated with the license
CustomerID string ` json:"customer_id" `
// If set, an identifier that should be used to lock the license to a
// particular site, cluster, etc.
InstallationID string ` json:"installation_id" `
// The time at which the license was issued
IssueTime time . Time ` json:"issue_time" `
// The time at which the license starts being valid
StartTime time . Time ` json:"start_time" `
// The time after which the license expires
ExpirationTime time . Time ` json:"expiration_time" `
// The time at which the license ceases to function and can
// no longer be used in any capacity
TerminationTime time . Time ` json:"termination_time" `
// Whether the license will ignore termination
IgnoreTermination bool ` json:"ignore_termination" `
// The product the license is valid for
Product string ` json:"product" `
// License Specific Flags
Flags map [ string ] interface { } ` json:"flags" `
// Modules is a list of the licensed enterprise modules
Modules [ ] string ` json:"modules" `
// List of features enabled by the license
Features [ ] string ` json:"features" `
}
type LicenseReply struct {
Valid bool
License * License
Warnings [ ] string
}
func ( op * Operator ) LicenseGet ( q * QueryOptions ) ( * LicenseReply , error ) {
var reply LicenseReply
if _ , err := op . c . query ( "/v1/operator/license" , & reply , q ) ; err != nil {
return nil , err
} else {
return & reply , nil
}
}
func ( op * Operator ) LicenseGetSigned ( q * QueryOptions ) ( string , error ) {
r := op . c . newRequest ( "GET" , "/v1/operator/license" )
r . params . Set ( "signed" , "1" )
r . setQueryOptions ( q )
_ , resp , err := op . c . doRequest ( r )
if err != nil {
return "" , err
}
defer closeResponseBody ( resp )
if err := requireOK ( resp ) ; err != nil {
return "" , err
}
data , err := io . ReadAll ( resp . Body )
if err != nil {
return "" , err
}
return string ( data ) , nil
}
// LicenseReset will reset the license to the builtin one if it is still valid.
// If the builtin license is invalid, the current license stays active.
//
// DEPRECATED: Consul 1.10 removes the corresponding HTTP endpoint as licenses
// are now set via agent configuration instead of through the API
func ( op * Operator ) LicenseReset ( opts * WriteOptions ) ( * LicenseReply , error ) {
var reply LicenseReply
r := op . c . newRequest ( "DELETE" , "/v1/operator/license" )
r . setWriteOptions ( opts )
_ , resp , err := op . c . doRequest ( r )
if err != nil {
return nil , err
}
defer closeResponseBody ( resp )
if err := requireOK ( resp ) ; err != nil {
return nil , err
}
if err := decodeBody ( resp , & reply ) ; err != nil {
return nil , err
}
return & reply , nil
}
// LicensePut will configure the Consul Enterprise license for the target datacenter
//
// DEPRECATED: Consul 1.10 removes the corresponding HTTP endpoint as licenses
// are now set via agent configuration instead of through the API
func ( op * Operator ) LicensePut ( license string , opts * WriteOptions ) ( * LicenseReply , error ) {
var reply LicenseReply
r := op . c . newRequest ( "PUT" , "/v1/operator/license" )
r . setWriteOptions ( opts )
r . body = strings . NewReader ( license )
_ , resp , err := op . c . doRequest ( r )
if err != nil {
return nil , err
}
defer closeResponseBody ( resp )
if err := requireOK ( resp ) ; err != nil {
return nil , err
}
if err := decodeBody ( resp , & reply ) ; err != nil {
return nil , err
}
return & reply , nil
}