From a8dc5a085bfdd00982d13421ec632db20e5a0cda Mon Sep 17 00:00:00 2001 From: Balazs Czoma Date: Fri, 27 Oct 2023 06:36:38 -0400 Subject: [PATCH] Sync common code with sw broker, initial doc updates --- CONTRIBUTING.md | 12 +- LICENSE | 2 +- Makefile | 6 +- README.md | 31 +- cmd/broker/client.go | 2 +- cmd/command/configgenerator.go | 10 +- cmd/command/util.go | 9 + cmd/command/util_test.go | 64 + cmd/generate.go | 5 +- cmd/root.go | 3 +- docs/guides/config-generator.md | 110 ++ docs/guides/provider.md | 91 + docs/index.md | 87 + internal/broker/conversions.go | 3 +- internal/broker/entity.go | 3 +- internal/broker/provider.go | 2 +- internal/broker/resource.go | 20 +- internal/broker/schema.go | 13 +- internal/broker/sempversion.go | 4 +- internal/broker/testacc/datasource_test.go | 28 +- internal/broker/testacc/provider_test.go | 105 +- source-address.go | 2 +- templates/guides/config-generator.md | 94 +- templates/guides/provider.md | 61 +- templates/index.md.tmpl | 18 +- third-party-licenses.txt | 1751 ++++++++++++++++++++ 26 files changed, 2336 insertions(+), 200 deletions(-) create mode 100644 docs/guides/config-generator.md create mode 100644 docs/guides/provider.md create mode 100644 docs/index.md create mode 100644 third-party-licenses.txt diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8ac826e..a5fa508 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,9 +9,9 @@ We'd love for you to contribute and welcome your help. Here are some guidelines ## Did you find a issue? -- **Ensure the bug was not already reported** by searching on GitHub under [Issues](https://github.com/SolaceProducts/pubsubplus-kubernetes-quickstart/issues). +- **Ensure the bug was not already reported** by searching on GitHub under [Issues](https://github.com/SolaceProducts/terraform-provider-solacebrokerappliance/issues). -- If you're unable to find an open issue addressing the problem, [open a new one](https://github.com/SolaceProducts/pubsubplus-kubernetes-quickstart/issues). Be sure to include a **title and clear description**, as much relevant information as possible, and a **code sample** or an **executable test case** demonstrating the expected behavior that is not occurring. +- If you're unable to find an open issue addressing the problem, [open a new one](https://github.com/SolaceProducts/terraform-provider-solacebrokerappliance/issues). Be sure to include a **title and clear description**, as much relevant information as possible, and a **code sample** or an **executable test case** demonstrating the expected behavior that is not occurring. ## Did you write a patch that fixes a bug? @@ -19,7 +19,7 @@ Open a new GitHub pull request with the patch following the steps outlined below Before you submit your pull request consider the following guidelines: -- Search [GitHub](/https://github.com/SolaceProducts/pubsubplus-kubernetes-quickstart/pulls) for an open or closed Pull Request +- Search [GitHub](/https://github.com/SolaceProducts/terraform-provider-solacebrokerappliance/pulls) for an open or closed Pull Request that relates to your submission. You don't want to duplicate effort. ### Submitting a Pull Request @@ -32,7 +32,7 @@ Fork the project and clone your fork locally. ```sh -prompt:~$ git clone https://github.com/SolaceProducts/pubsubplus-kubernetes-quickstart +prompt:~$ git clone https://github.com/SolaceProducts/terraform-provider-solacebrokerappliance ``` #### Step 2: Branch @@ -61,7 +61,7 @@ repository. If you have not set the upstream, do so as follows: ```sh -prompt:~$ git remote add upstream https://github.com/SolaceProducts/pubsubplus-kubernetes-quickstart +prompt:~$ git remote add upstream https://github.com/SolaceProducts/terraform-provider-solacebrokerappliance ``` then: @@ -108,7 +108,7 @@ That's it! Thank you for your contribution! ## **Do you have an ideas for a new feature or a change to an existing one?** -- Open a GitHub [enhancement request issue](https://github.com/SolaceProducts/pubsubplus-kubernetes-quickstart/issues) and describe the new functionality. +- Open a GitHub [enhancement request issue](https://github.com/SolaceProducts/terraform-provider-solacebrokerappliance/issues) and describe the new functionality. ## Do you have questions about the source code? diff --git a/LICENSE b/LICENSE index 261eeb9..ca2ee04 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright 2023 Solace Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/Makefile b/Makefile index 4b18cf9..627080f 100644 --- a/Makefile +++ b/Makefile @@ -17,13 +17,13 @@ test: ## Run unit tests .PHONY: test-coverage: ## Run tests with coverage - mkdir -p reports + @mkdir -p reports @go test -short -coverprofile reports/cover.out ${PKG_LIST} @go tool cover -html reports/cover.out -o reports/cover.html .PHONY: testacc -testacc: # Run acceptance tests - TF_ACC=1 go test ./... -v $(TESTARGS) -timeout 120m +testacc: ## Run acceptance tests + @TF_ACC=1 go test ./... -v $(TESTARGS) -timeout 120m .PHONY: generate-docs: dep ## Build the binary file diff --git a/README.md b/README.md index 9483919..3cc514c 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,28 @@ -# Terraform provider for Solace PubSub+ Software Event Broker +# Terraform Provider for Solace PubSub+ Event Broker Appliance +[![Actions Status](https://github.com/SolaceProducts/terraform-provider-solacebroker/actions/workflows/core-pipeline-main-branch-only.yml/badge.svg?branch=main)](https://github.com/SolaceProducts/terraform-provider-solacebroker/actions?query=workflow:%22Test+Provider%22+branch:main) +[![Go Report Card](https://goreportcard.com/badge/github.com/solaceproducts/terraform-provider-solacebroker)](https://goreportcard.com/report/github.com/solaceproducts/terraform-provider-solacebroker) -This provider is a plugin for Terraform that allows for the configuration of the PubSub+ Software Event Broker and it is maintained by Solace. + +This provider, maintained by Solace, is a plugin for Terraform that enables you to configure PubSub+ Event Broker Appliances. The provider is available from the [Terraform Providers Registry](https://registry.terraform.io/providers/solaceproducts/solacebroker/latest). +The minimum required PubSub+ Event Broker Appliance version is 10.4. + ## Quick Start -1. Ensure you have admin access to a Solace PubSub+ Software Event Broker. Options include [locally deployment of a containerized version](https://docs.solace.com/Software-Broker/SW-Broker-Set-Up/Containers/Set-Up-Container-Image.htm) or use of a free broker from [PubSub+ Cloud](https://docs.solace.com/Cloud/cloud-lp.htm). +1. Ensure you have admin access to a Solace PubSub+ Event Broker Appliance. 2. Install the [Terraform CLI](https://www.terraform.io/downloads) -3. Create the [`examples/sampleconfig.tf`](examples/sampleconfig.tf) sample file in a new directory, adjust `url`, and the management credential parameters `username` and `password` to your broker's setup. -4. From this directory run `terraform plan`, then `terraform apply`. -5. Open the `url` link in your browser to access the broker's web managment UI. The creadentials are the same as used in the Terraform config. Observe the new objects created: a new message-vpn and a messaging queue under that message-vpn. -6. Run `terraform delete` from your command line and observe the message-vpn deleted. +3. Create the [`examples/sampleconfig.tf`](examples/sampleconfig.tf) sample file in a new directory, adjust the `url`, and the management credential parameters `username` and `password` to your broker's setup. +4. From this directory run `terraform plan`, then `terraform apply` (if prompted, `terraform init` may also be required). +5. Open the `url` link in your browser to access the broker's web management UI. The credentials are the same as used in the Terraform config. Observe the new objects created: a new Message VPN and a messaging queue under that Message VPN. +6. Run `terraform destroy` from your command line and observe that the Message VPN is deleted. -Note that the provider also offers the unique functionality of generating a config file from an already configured broker. Refer to the documentation for more details on that. +Note that the provider also offers the unique ability to generate a config file from an already configured broker. For more information, refer to the [full documentation](https://registry.terraform.io/providers/SolaceProducts/solacebroker/latest/docs). ## Documentation -Full documentation is available on the [Terraform Providers Registry website](https://registry.terraform.io/providers/confluentinc/confluent/latest/docs). +Full documentation is available on the [Terraform Providers Registry website](https://registry.terraform.io/providers/solaceproducts/solacebroker/latest/docs). It is recommended to familiarize yourself with Solace technology and broker management, refer to the [Resources section](#resources). @@ -31,20 +36,20 @@ It is recommended to familiarize yourself with Solace technology and broker mana ### Building -1. `git clone` this repository and `cd` into its directory +1. `git clone` this repository and `cd` into its directory. 2. `make install` will trigger the Golang build of the provider in your [`${GOBIN}`](https://pkg.go.dev/cmd/go#hdr-Compile_and_install_packages_and_dependencies) (defaults to `${GOPATH}/bin` or `${HOME}/go/bin` if `${GOPATH}` is not set). Repeat this every time you make changes to the provider locally. -The provided `makefile` defines additional commands generally useful during development. +The provided `makefile` defines additional commands that are useful during development. -### Using a development build +### Using a Development Build Create or update your `${HOME}/.terraformrc` (Unix) / `%APPDATA%\terraform.rc` (Windows) configuration with a `provider_installation` section that contains the following `dev_overrides`: ```hcl provider_installation { dev_overrides { - "hashicorp/random" = "${GOBIN}" //< replace `${GOBIN}` with the actual path on your system + "registry.terraform.io/solaceproducts/solacebroker" = "${GOBIN}" //< replace `${GOBIN}` with the actual path on your system } direct {} diff --git a/cmd/broker/client.go b/cmd/broker/client.go index e7c8f81..4e01d36 100644 --- a/cmd/broker/client.go +++ b/cmd/broker/client.go @@ -19,7 +19,7 @@ import ( "net/http/cookiejar" "os" "strings" - terraform "terraform-provider-solacebroker/cmd/command" + "terraform-provider-solacebroker/cmd/command" "terraform-provider-solacebroker/internal/broker" "terraform-provider-solacebroker/internal/semp" "time" diff --git a/cmd/command/configgenerator.go b/cmd/command/configgenerator.go index 9e65e9e..9538659 100644 --- a/cmd/command/configgenerator.go +++ b/cmd/command/configgenerator.go @@ -19,6 +19,7 @@ import ( "context" "errors" "fmt" + "golang.org/x/exp/slices" "net/http" "os" "regexp" @@ -26,8 +27,6 @@ import ( internalbroker "terraform-provider-solacebroker/internal/broker" "terraform-provider-solacebroker/internal/broker/generated" "terraform-provider-solacebroker/internal/semp" - - "golang.org/x/exp/slices" ) type BrokerObjectType string @@ -211,16 +210,11 @@ func GetNameForResource(resourceTerraformName string, attributeResourceTerraform } if found { //sanitize name - value = strings.ReplaceAll(value, " ", "_") - value = strings.ReplaceAll(value, "#", "_") - value = strings.ReplaceAll(value, "\\", "_") - value = strings.ReplaceAll(value, "/", "_") - value = strings.ReplaceAll(value, "\"", "") resourceName = "_" + value } } } } } - return resourceName + return SanitizeHclIdentifierName(resourceName) } diff --git a/cmd/command/util.go b/cmd/command/util.go index d50aff7..69c4214 100644 --- a/cmd/command/util.go +++ b/cmd/command/util.go @@ -399,3 +399,12 @@ func hclFormatResource(resourceConfig ResourceConfig) string { config := b.String() return config } + +func SanitizeHclIdentifierName(name string) string { + name = regexp.MustCompile(`[^a-zA-Z0-9 ]+`).ReplaceAllString(strings.TrimSpace(name), "_") + if len(name) == 0 || (name[0] >= '0' && name[0] <= '9') || (len(name) == 1 && name[0] == '_') { + //just prepend static string to avoid checking all characters + name = "gn_" + name + } + return name +} diff --git a/cmd/command/util_test.go b/cmd/command/util_test.go index c69be07..941dd63 100644 --- a/cmd/command/util_test.go +++ b/cmd/command/util_test.go @@ -206,3 +206,67 @@ func Test_newAttributeInfo(t *testing.T) { }) } } + +func TestSanitizeHclIdentifierName(t *testing.T) { + type args struct { + name string + } + tests := []struct { + name string + args args + want string + }{ + { + "SanitizeTextStartingWithNumber", + args{name: "1testing"}, + "gn_1testing", + }, + { + "SanitizeTextContainingSpecialCharacters", + args{name: "*testing*"}, + "_testing_", + }, + { + "SanitizeTextContainingSpecialCharactersTwo", + args{name: "#testing/"}, + "_testing_", + }, + { + "SanitizeTextContainingSpecialCharactersThree", + args{name: "$testing\""}, + "_testing_", + }, + { + "SanitizeTextContainingSpecialCharactersFour", + args{name: "%testing^"}, + "_testing_", + }, + { + "SanitizeTextContainingSpecialCharactersFive", + args{name: "%testing^"}, + "_testing_", + }, + { + "SanitizeTextEmpty", + args{name: ""}, + "gn_", + }, + { + "SanitizeTextContainingEmpty", + args{name: " "}, + "gn_", + }, + { + "SanitizeTextOnlySpecialCharacter", + args{name: "#"}, + "gn__", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := SanitizeHclIdentifierName(tt.args.name); got != tt.want { + t.Errorf("SanitizeHclIdentifierName() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/cmd/generate.go b/cmd/generate.go index 8f52e4a..14dc824 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -69,7 +69,7 @@ This command would create a file my-messagevpn.tf that contains a resource defin } providerSpecificIdentifier := cmd.Flags().Arg(1) if len(providerSpecificIdentifier) == 0 { - command.LogCLIError("Broker object not provided") + command.LogCLIError("Broker object not provided") _ = cmd.Help() os.Exit(1) } @@ -108,7 +108,8 @@ This command would create a file my-messagevpn.tf that contains a resource defin brokerObjectInstanceName := strings.ToLower(brokerObjectType) if strings.Contains(brokerObjectType, ".") { brokerObjectTypeName = strings.Split(brokerObjectType, ".")[0] - brokerObjectInstanceName = strings.Split(brokerObjectType, ".")[1] + //sanitize name + brokerObjectInstanceName = command.SanitizeHclIdentifierName(strings.Split(brokerObjectType, ".")[1]) } brokerObjectTerraformName := strings.ReplaceAll(brokerObjectTypeName, "solacebroker_", "") diff --git a/cmd/root.go b/cmd/root.go index 3d57427..e549e46 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -17,9 +17,8 @@ package cmd import ( - terraform "terraform-provider-solacebroker/cmd/command" - "github.com/spf13/cobra" + terraform "terraform-provider-solacebroker/cmd/command" ) var rootCmd = &cobra.Command{ diff --git a/docs/guides/config-generator.md b/docs/guides/config-generator.md new file mode 100644 index 0000000..8bc3be1 --- /dev/null +++ b/docs/guides/config-generator.md @@ -0,0 +1,110 @@ +--- +page_title: "Command-line Terraform Configuration Generator Guide" +--- + +# Command-Line Terraform Configuration Generator + +Normally, provider binaries are not run standalone, they are started and their services are used by Terraform CLI. + +The `solacebrokerappliance` provider, however, includes an additional feature where you can run its binary outside of Terraform CLI. In this case, you can use the "generate" command on the provider binary to generate a Terraform HLC configuration file for a specified object and all child objects known to the provider. + +You can [locate](https://terra-farm.github.io/main/installation.html) the provider binary in the `.terraform/providers` directory of an existing Terraform configuration directory that uses the `solacebrokerappliance` provider. + +You can run the provider binary directly with the `generate` command to generate a Terraform configuration file from the current configuration of a PubSub+ broker. + +` generate ` + +- `` is the broker provider binary. +- `` is the broker address, for example `https://mybroker.example.org:1943/`. +- `` are the similar to the Terraform Import command. This is the resource name and possible values to find a specific resource. +- `` is the desirable name of the generated filename. +- There are also supported options, which mirror the configuration options for the provider object. These can be found [here](#supported-options). + +## Important notes + +The generated configuration shoud be reviewed for followings: + +* Provider configuration values (url, username, etc.) may need to be updated. +* Write-only attributes, such as passwords, are omitted from the config as they cannot be read from the broker configuration. They need to be added manually. +* Default resources may be present that may be omitted. +* The generator uses a naming scheme for the resources. This may be updated by manually replacing the generated names. + +## Usage + +```shell +terraform-provider-solacebrokerappliance -h + +Usage: + terraform-provider-solacebrokerappliance [command] + +Available Commands: +generate Generates a Terraform configuration file for a specified PubSub+ Broker object and all child objects known to the provider +help Help about any command +version Provides version information about the current binary +``` + +To `generate` the configuration, make sure all ENVIRONMENT VARIABLES, which mirrors the configuration options for the +provider object are set. The list of variables +are listed [here](#supported-options). + +For example: +`SOLACEBROKER_USERNAME=admin SOLACEBROKER_PASSWORD=admin terraform-provider-solacebrokerappliance generate --url=https://localhost:8080 solacebroker_msg_vpn.mq default my-messagevpn.tf` + +This command would create a file `my-messagevpn.tf` that contains a resource definition for the default Message VPN resource and +any child objects, assuming the appropriate broker credentials were set in environment variables. + +Note: For objects with no child object, the file will only contain a resource definition for that object. + +For example: +`SOLACEBROKER_USERNAME=admin SOLACEBROKER_PASSWORD=admin terraform-provider-solacebrokerappliance generate --url=https://localhost:8080 solacebroker_msg_vpn_queue.q default/test my-message-vpn-queue.tf` + +This command would create a file `my-message-vpn-queue.tf` that contains the msg_vpn_queue resource , `test` for the +Message VPN, `default`, assuming a msg_vpn_queue resource called `test` exists for the Message VPN, `default`. + +### Supported Options + +The following parameters can be set as ENVIRONMENT VARIABLES. When used as environment variables +each parameter must be preceded with _SOLACEBROKER__. For example for a PubSub+ broker using username and password +_**admin/password**_ +would be: + +`SOLACEBROKER_USERNAME=admin SOLACEBROKER_PASSWORD=password` + +- `bearer_token`, (String, Sensitive, Mandatory if `password` will not be provided) +- `insecure_skip_verify` (Boolean) Disable validation of server SSL certificates, accept/ignore self-signed. +- `password` (String, Sensitive, Mandatory is `bearer_token` will not be provided) +- `request_min_interval` (String) +- `request_timeout_duration` (String) +- `retries` (Number) +- `retry_max_interval` (String) +- `retry_min_interval` (String) +- `username` (String, Mandatory) The username for the broker request. + +## Troubleshooting + +The following issues may arise while using the generator. + +| Error | SEMP call failed. unexpected status 401 (401 Unauthorized) | +|-----------------|----------------------------------------------------------------------------| +| Explanation | Configurations to connect to the PubSub+ Broker not accurate. | +| Possible Action | Check and confirm, configuration details to PubSub+ Broker are accurate. | + +| Error | SOLACEBROKER_xxx is mandatory but not available | +|-----------------|------------------------------------------------------------------------------------| +| Explanation | A mandatory parameter which is required to connect to PubSub+ broker is missing. | +| Possible Action | Confirm if all [mandatory parameters](#supported-options) are correctly set. | + +| Error | Error: Too many provider specific identifiers. Required identifiers: [{xxx}] | +|-----------------|------------------------------------------------------------------------------| +| Explanation | This indicates that identifiers specific to the provider are set in an ambiguous manner. | +| Possible Action | Ensure all identifiers are available and separated by `/` where needed. For example a msgVpnName will require `msgVpnName`, however a specific queueName under a specific msgVpnName will be `msgVpnName/queueName`. | + +| Error | SEMP called failed. resource not found on path /xxx/xxx | +|-----------------|------------------------------------------------------------------------------------------| +| Explanation | This indicates the resource attributes attempted to be fetch could not be read. | +| Possible Action | Ensure identifiers values are consistent as set on the PubSub+ broker configured with. | + +| Error | Error: Broker resource not found by terraform name xxx | +|-----------------|------------------------------------------------------------------------------------------------------------| +| Explanation | This indicates the resource by name _xxx_ is not recognized by the generator. | +| Possible Action | Ensure the resource name used is available as a Terraform resource for the version of the provider in use. | diff --git a/docs/guides/provider.md b/docs/guides/provider.md new file mode 100644 index 0000000..4878cb6 --- /dev/null +++ b/docs/guides/provider.md @@ -0,0 +1,91 @@ +--- +page_title: "solacebrokerappliance Provider Guide" +--- + +# Solace PubSub+ Event Broker Appliance (solacebrokerappliance) Provider + +The `solacebrokerappliance` provider supports Terraform CLI operations including basic CRUD (create, read, update, and delete) and import. + +The provider leverages the [SEMP (Solace Element Management Protocol)](https://docs.solace.com/Admin/SEMP/Using-SEMP.htm) REST API to configure the PubSub+ event broker. The API reference is available from the [Solace PubSub+ Documentation](https://docs.solace.com/API-Developer-Online-Ref-Documentation/swagger-ui/appliance/config/index.html). + +## Mapping of SEMP API and Provider Names + +Terraform uses the [snake case](https://en.wikipedia.org/wiki/Snake_case) naming scheme, while SEMP uses camel case. Resources and datasource are also prefixed with the provider local name, `solacebroker_`. For example, `solacebroker_msg_vpn` is the message-vpn resource name and `max_subscription_count` is the attribute for the maximum subscription count, since `MsgVpn` is the SEMP API object name and `maxSubscriptionCount` is the name of the SEMP attribute. + +## Broker SEMP API Access + +The broker SEMP service, by default at port 8080 for HTTP and TLS port 1943 for HTTPS, must be accessible to the console running Terraform CLI. + +The supported access credentials are basic authentication using username and password, and OAuth using a token. The two options are mutually exclusive and the provider will fail if both are configured. + +-> The [user access levels](https://docs.solace.com/Admin/CLI-User-Access-Levels.htm) associated with the credentials used must be properly configured on the broker so that the desired actions are authorized. + +## SEMP API Versioning and Provider Broker Compatibility + +The SEMP API minor version reflects the supported set of objects, attributes, their properties and possible deprecations. + +New versions of the PubSub+ event broker with new features typically require a newer SEMP API version that supports the new or updated objects, attributes, etc. The SEMP API version of a broker version can be determined from the [Solace PubSub+ documentation](https://docs.solace.com/Admin/SEMP/SEMP-API-Versions.htm#SEMP_v2_to_SolOS_Version_Mapping). + +A given version of the provider is built to support a specific version of the SEMP API. For the SEMP API version of the provider and corresponding broker version, refer to the [Version Compatibility section](https://docs.solace.com/Admin/SEMP/Declarative-SEMP.htm#Version) of the Solace PubSub+ documentation. + +* Broker versions at the same SEMP API version level as the provider can be fully configured. +* Broker versions at a lower SEMP API version level than the provider can be configured, except for objects or attributes that have been deprecated and removed in the provider's SEMP version. However, configuration will fail when attempting to configure objects or attributes that have been introduced in a later SEMP version than the broker supports. +* Broker versions at a higher SEMP API version level than the provider can be configured for objects or attributes that are included in the provider's SEMP version. Objects or attributes that have been introduced in a later SEMP version will be unknown to the provider. Objects or attributes that have been deprecated in the broker SEMP version may result in configuration failure. + +## Object Relationships + +Broker inter-object references must be correctly encoded in Terraform configuration to have the apply operation work. This requires an understanding of the PubSub+ event broker objects. For more information about each object consult the [SEMP API reference](https://docs.solace.com/API-Developer-Online-Ref-Documentation/swagger-ui/appliance/config/index.html) and especially look for "Identifying" attributes that give a hint to required already configured objects. +For example: + +```terraform +resource "solacebroker_msg_vpn" "test" { + # on the resource itself, specify the value + msg_vpn_name = "new" + # ... other attributes +} + +resource "solacebroker_msg_vpn_queue" "q" { + # on dependent resources, specify as a reference so + # that Terraform creates the referenced object first + msg_vpn_name = solacebroker_msg_vpn.test.msg_vpn_name + # ... other attributes +} +``` + +## The Broker Object + +The Broker object is the `solacebroker_broker` resource. This object contains global configuration for the PubSub+ event broker. + +The Broker object differs from all other objects as it always exists for a given broker and can only be updated. + +-> Important: only attributes that are specified will be set to their configured value. Unspecified attributes will not be set to their default-attribute value. This may result in `terraform plan` indicating a change to set attributes to default even after an `apply`, for example after removing an attribute from the configuration. + +## Default Objects + +There are objects that are preexisting defaults and cannot be created or destroyed, only updated. The default Message VPN and the default client profile are examples of this. Any attempt to remove these resources will fail. + +## Broker-Defined Attributes + +Some attributes don't have a default value. In this case their value will be determined by the broker. Typically, these defaults depend on the broker scaling settings. While Terraform plan and apply operations function the same way as with other attributes, import will set the Terraform state of the attribute to the broker value (instead of null), even if they were set at default. You can use subsequent plan and apply operations to fix this. + +## Importing Resources + +When [importing resources to Terraform](https://developer.hashicorp.com/terraform/language/import#syntax) an `id` is required. Note that this `id` is not the same as the internal `id` attribute of resources. + +The `id` to be used shall be constructed as a path from the highest parent object down to the resource. + +For example, when importing a `solacebroker_msg_vpn_queue_subscription`, the parent relationship is `msg_vpn` > `msg_vpn_queue` > `msg_vpn_queue_subscription`. To construct the `id`, concatenate the identifications of parents and the particular resource identification, separated by `/` (slash). Also note that elements containing `/` must be URL-encoded. + +For this example: +``` +id = // +# using my-vpn, my-queue, a/b/c +id = my-vpn/my-queue/a%2Fb%2Fc +``` + +## Notes + +* Terraform `apply` is not atomic. If interrupted by a user, failure, reboot, or switchover the configuration changes may be partly applied. Terraform does not perform rollbacks. +* Terraform must be the authoritative source of configuration. If there is any overlap between Terraform controlled configuration and either pre-existing configuration or modifications from other management interfaces the behaviour will be undefined. +* Apply operations may impact broker AD performance, especially large changes. The `request_min_interval` attribute on the provider limits the request rate and can be adjusted to control the impact. +* Application of configuration may cause brief service interruptions to the resources affected. These can include a queue missing a published message or clients being briefly disconnected. These outages are no different from a current administrator manually making an equivalent change to a broker. \ No newline at end of file diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..6d6574e --- /dev/null +++ b/docs/index.md @@ -0,0 +1,87 @@ +--- +page_title: "Provider: solacebrokerappliance" +description: |- + A provider for a Solace PubSub+ Event Broker Appliance. +--- + +# Solace PubSub+ Event Broker Appliance (solacebrokerappliance) Provider + +The [Solace PubSub+ Platform](https://solace.com/products/platform/)'s [PubSub+ Event Broker Appliance](https://solace.com/products/event-broker/software/) +efficiently streams event-driven information between applications, IoT devices and user interfaces running in cloud, on-premises, and hybrid environments +using open APIs and protocols like AMQP, JMS, MQTT, REST and WebSocket. + +It can be installed into a variety of public and private clouds, PaaS, and on-premises environments, +and brokers in multiple locations can be linked together in an [Event Mesh](https://solace.com/what-is-an-event-mesh/) +to dynamically share events across the distributed enterprise. + +## Overview + +The _solacebrokerappliance_ provider enables you to configure a PubSub+ Event Broker Appliance using Terraform. + +This provider also offers the possibility to generate an [HCL configuration](https://developer.hashicorp.com/terraform/language) file from a preconfigured event broker. + +Use the navigation to the left for more information in the guides and for the available provider resources and data sources. + +## Minimum broker version + +The minimum required PubSub+ Event Broker Appliance version is 10.4. + +## Example Usage + +```terraform +terraform { + required_providers { + solacebroker = { + source = "registry.terraform.io/solaceproducts/solacebrokerappliance" + } + } +} + +# Configure the provider +provider "solacebroker" { + username = "admin" + password = "admin" + url = "http://localhost:8080" +} + +# Create a message-vpn on the event broker +resource "solacebroker_msg_vpn" "test" { + msg_vpn_name = "new" + enabled = true + max_msg_spool_usage = 10 +} + +# Create a messaging queue +resource "solacebroker_msg_vpn_queue" "q" { + msg_vpn_name = solacebroker_msg_vpn.test.msg_vpn_name + queue_name = "green" + ingress_enabled = true + egress_enabled = true +} +``` + + +## Schema + +### Required + +- `url` (String) The base URL of the event broker, for example `https://mybroker.example.org:1943/`. The trailing / can be omitted. + +### Optional + +- `bearer_token` (String, Sensitive) A bearer token that will be sent in the Authorization header of SEMP requests. Requires TLS transport enabled. Conflicts with username and password. +- `insecure_skip_verify` (Boolean) Disable validation of server SSL certificates, accept/ignore self-signed. The default value is false. +- `password` (String, Sensitive) The password to connect to the broker with. Requires username and conflicts with bearer_token. +- `request_min_interval` (String) A [duration](https://pkg.go.dev/maze.io/x/duration#ParseDuration) string indicating the minimum interval between requests; this serves as a rate limit. This setting does not apply to retries. Set to 0 for no rate limit. The default value is 100ms (which equates to a rate limit of 10 calls per second). +- `request_timeout_duration` (String) A [duration](https://pkg.go.dev/maze.io/x/duration#ParseDuration) string indicating the maximum time to wait for a SEMP request. The default value is 1m. +- `retries` (Number) The number of retries for a SEMP call. The default value is 10. +- `retry_max_interval` (String) A [duration](https://pkg.go.dev/maze.io/x/duration#ParseDuration) string indicating the maximum retry interval. The default value is 30s. +- `retry_min_interval` (String) A [duration](https://pkg.go.dev/maze.io/x/duration#ParseDuration) string indicating how long to wait after an initial failed request before the first retry. Exponential backoff is used, up to the limit set by retry_max_interval. The default value is 3s. +- `username` (String) The username to connect to the broker with. Requires password and conflicts with bearer_token. + +-> All provider configuration values can also be set as environment variables with the same name but uppercase and with the `SOLACEBROKER_` prefix. +For example, the password attribute can be set via the `SOLACEBROKER_PASSWORD` environment variable. Values in the configuration take precedence over environment variables. + +# Release Notes and History + +For detailed Release Notes and release history, refer to the Releases section in the [Provider GitHub repository](https://github.com/SolaceProducts/terraform-provider-solacebrokerappliance/releases). diff --git a/internal/broker/conversions.go b/internal/broker/conversions.go index 2a443b0..b1fe9a0 100644 --- a/internal/broker/conversions.go +++ b/internal/broker/conversions.go @@ -18,9 +18,8 @@ package broker import ( "fmt" - "math/big" - "github.com/hashicorp/terraform-plugin-go/tftypes" + "math/big" ) type Converter interface { diff --git a/internal/broker/entity.go b/internal/broker/entity.go index 441d356..9d8e930 100644 --- a/internal/broker/entity.go +++ b/internal/broker/entity.go @@ -18,10 +18,9 @@ package broker import ( "fmt" - "reflect" - dschema "github.com/hashicorp/terraform-plugin-framework/datasource/schema" rschema "github.com/hashicorp/terraform-plugin-framework/resource/schema" + "reflect" ) var resourceToDataSourceTypes = map[reflect.Type]reflect.Type{ diff --git a/internal/broker/provider.go b/internal/broker/provider.go index 90629c5..0a50f1a 100644 --- a/internal/broker/provider.go +++ b/internal/broker/provider.go @@ -65,7 +65,7 @@ func (p *BrokerProvider) Schema(_ context.Context, _ provider.SchemaRequest, res Sensitive: true, }, "bearer_token": schema.StringAttribute{ - MarkdownDescription: "A bearer token that will be sent in the Authorization header of SEMP requests. Conflicts with username and password.", + MarkdownDescription: "A bearer token that will be sent in the Authorization header of SEMP requests. Requires TLS transport enabled. Conflicts with username and password.", Optional: true, Sensitive: true, }, diff --git a/internal/broker/resource.go b/internal/broker/resource.go index 0aec3b7..d61011f 100644 --- a/internal/broker/resource.go +++ b/internal/broker/resource.go @@ -37,7 +37,7 @@ import ( ) const ( - defaults = "defaults" + defaults = "defaults" defaultObjectName = "default" ) @@ -413,18 +413,18 @@ func (r *brokerResource) Delete(ctx context.Context, request resource.DeleteRequ return } // don't actually do anything if the object is a default object - if toId(path) == defaultObjectName { + if toId(path) == defaultObjectName { switch r.terraformName { - case - "msg_vpn", - "msg_vpn_client_profile", - "msg_vpn_acl_profile", - "msg_vpn_client_username": - addWarningToDiagnostics(&response.Diagnostics, fmt.Sprintf("Associated state will be removed but default object %s, \"%s\" cannot be deleted", r.terraformName, toId(path)), ErrDeleteSingletonOrDefaultsNotAllowed) - return + case + "msg_vpn", + "msg_vpn_client_profile", + "msg_vpn_acl_profile", + "msg_vpn_client_username": + addWarningToDiagnostics(&response.Diagnostics, fmt.Sprintf("Associated state will be removed but default object %s, \"%s\" cannot be deleted", r.terraformName, toId(path)), ErrDeleteSingletonOrDefaultsNotAllowed) + return } } - // request delete + // request delete client, d := client(r.providerData) if d != nil { response.Diagnostics.Append(d) diff --git a/internal/broker/schema.go b/internal/broker/schema.go index 1dfafc7..f5d896b 100644 --- a/internal/broker/schema.go +++ b/internal/broker/schema.go @@ -17,9 +17,6 @@ package broker import ( - "sort" - "strings" - "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/resource/schema" @@ -29,6 +26,8 @@ import ( "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier" "github.com/hashicorp/terraform-plugin-framework/resource/schema/stringplanmodifier" "github.com/hashicorp/terraform-plugin-go/tftypes" + "sort" + "strings" ) var DataSources []func() datasource.DataSource @@ -50,8 +49,8 @@ var SempDetail SempVersionDetail func RegisterSempVersionDetails(sempAPIBasePath string, sempVersion string) { SempDetail = SempVersionDetail{ - BasePath: sempAPIBasePath, - SempVersion: sempVersion, + BasePath: sempAPIBasePath, + SempVersion: sempVersion, } } @@ -81,12 +80,12 @@ func terraformAttributeMap(attributes []*AttributeInfo, isResource bool, require tfAttributes["id"] = schema.StringAttribute{ Description: "Identifier attribute, for internal use only.", Computed: true, - } + } } else { tfAttributes["id"] = schema.StringAttribute{ Description: "Identifier attribute, for internal use only.", Computed: true, - PlanModifiers: []planmodifier.String{ + PlanModifiers: []planmodifier.String{ stringplanmodifier.UseStateForUnknown(), }, } diff --git a/internal/broker/sempversion.go b/internal/broker/sempversion.go index e77c228..42b2b1e 100644 --- a/internal/broker/sempversion.go +++ b/internal/broker/sempversion.go @@ -17,6 +17,6 @@ package broker type SempVersionDetail struct { - BasePath string - SempVersion string + BasePath string + SempVersion string } diff --git a/internal/broker/testacc/datasource_test.go b/internal/broker/testacc/datasource_test.go index 0bd7526..aa38b28 100644 --- a/internal/broker/testacc/datasource_test.go +++ b/internal/broker/testacc/datasource_test.go @@ -23,21 +23,23 @@ import ( ) func TestAccDataSource(t *testing.T) { - resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - ProtoV6ProviderFactories: testAccProtoV6ProviderFactories, - Steps: []resource.TestStep{ - // Read testing - { - Config: ProviderConfig + ` + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + ProtoV6ProviderFactories: testAccProtoV6ProviderFactories, + Steps: []resource.TestStep{ + // Read testing + { + Config: ProviderConfig + ` data "solacebroker_msg_vpn" "default" { msg_vpn_name = "default" } `, - Check: resource.ComposeAggregateTestCheckFunc( - resource.TestCheckResourceAttr("data.solacebroker_msg_vpn.default", "authentication_basic_enabled", "true"), - ), - }, - }, - }) + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr("data.solacebroker_msg_vpn.default", "authentication_basic_enabled", "true"), + ), + }, + }, + }) } + + diff --git a/internal/broker/testacc/provider_test.go b/internal/broker/testacc/provider_test.go index 3ad9e2e..825c639 100644 --- a/internal/broker/testacc/provider_test.go +++ b/internal/broker/testacc/provider_test.go @@ -29,75 +29,76 @@ import ( "github.com/testcontainers/testcontainers-go" "github.com/testcontainers/testcontainers-go/wait" - _ "terraform-provider-solacebroker/internal/broker/generated" + _ "terraform-provider-solacebroker/internal/broker/generated" + ) var ProviderConfig string var ( - // testAccProtoV6ProviderFactories are used to instantiate a provider during - // acceptance testing. The factory function will be invoked for every Terraform - // CLI command executed to create a provider server to which the CLI can - // reattach. - testAccProtoV6ProviderFactories = map[string]func() (tfprotov6.ProviderServer, error){ - "solacebroker": providerserver.NewProtocol6WithError(broker.New("test")()), - } + // testAccProtoV6ProviderFactories are used to instantiate a provider during + // acceptance testing. The factory function will be invoked for every Terraform + // CLI command executed to create a provider server to which the CLI can + // reattach. + testAccProtoV6ProviderFactories = map[string]func() (tfprotov6.ProviderServer, error){ + "solacebroker": providerserver.NewProtocol6WithError(broker.New("test")()), + } ) func init() { - // start docker test broker - ctx := context.Background() - req := testcontainers.ContainerRequest{ - Image: "solace/solace-pubsub-standard:latest", - ExposedPorts: []string{"8080/tcp"}, - Env: map[string]string{ - "username_admin_globalaccesslevel": "admin", - "username_admin_password": "admin", - "system_scaling_maxconnectioncount": "100", - }, - Mounts: testcontainers.ContainerMounts{ - { - Source: testcontainers.GenericVolumeMountSource{ - Name: "test-volume", - }, - Target: "/var/lib/solace", - }, - }, - ShmSize: 1000000000, - WaitingFor: wait.ForHTTP("/").WithPort("8080/tcp"), - } - solaceC, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{ - ContainerRequest: req, - Started: true, - }) - if err != nil { - panic(err) - } - endpoint, err := solaceC.Endpoint(ctx, "") - if err != nil { - panic(err) - } - ProviderConfig = ` + // start docker test broker + ctx := context.Background() + req := testcontainers.ContainerRequest{ + Image: "solace/solace-pubsub-standard:latest", + ExposedPorts: []string{"8080/tcp"}, + Env: map[string]string{ + "username_admin_globalaccesslevel": "admin", + "username_admin_password": "admin", + "system_scaling_maxconnectioncount": "100", + }, + Mounts: testcontainers.ContainerMounts{ + { + Source: testcontainers.GenericVolumeMountSource{ + Name: "test-volume", + }, + Target: "/var/lib/solace", + }, + }, + ShmSize: 1000000000, + WaitingFor: wait.ForHTTP("/").WithPort("8080/tcp"), + } + solaceC, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{ + ContainerRequest: req, + Started: true, + }) + if err != nil { + panic(err) + } + endpoint, err := solaceC.Endpoint(ctx, "") + if err != nil { + panic(err) + } + ProviderConfig = ` provider "solacebroker" { username = "admin" password = "admin" url = "http://` + endpoint + `" } ` - const user = "admin" - const password = "admin" + const user = "admin" + const password = "admin" - if err = os.Setenv("SOLACEBROKER_URL", "http://"+endpoint); err != nil { - panic(err) - } + if err = os.Setenv("SOLACEBROKER_URL", "http://" + endpoint); err != nil { + panic(err) + } - if err = os.Setenv("SOLACEBROKER_USERNAME", password); err != nil { - panic(err) - } + if err = os.Setenv("SOLACEBROKER_USERNAME", password); err != nil { + panic(err) + } - if err = os.Setenv("SOLACEBROKER_PASSWORD", password); err != nil { - panic(err) - } + if err = os.Setenv("SOLACEBROKER_PASSWORD", password); err != nil { + panic(err) + } } func testAccPreCheck(t *testing.T) { diff --git a/source-address.go b/source-address.go index e219be5..889d866 100644 --- a/source-address.go +++ b/source-address.go @@ -17,5 +17,5 @@ package main const providerNamespace = "solaceproducts" -const providerSimpleType = "solacebrokerappliance" +const providerSimpleType = "solacebroker" const providerType = providerSimpleType diff --git a/templates/guides/config-generator.md b/templates/guides/config-generator.md index 08452c7..8bc3be1 100644 --- a/templates/guides/config-generator.md +++ b/templates/guides/config-generator.md @@ -2,28 +2,34 @@ page_title: "Command-line Terraform Configuration Generator Guide" --- -# Command-line Terraform configuration generator - -The `solacebroker` provider offers this feature outside of Terraform CLI. +# Command-Line Terraform Configuration Generator Normally, provider binaries are not run standalone, they are started and their services are used by Terraform CLI. -The `solacebroker` provider can also be run standalone: the generate command on the provider binary generates a Terraform HLC configuration file for the specified object and all child objects known to the provider. +The `solacebrokerappliance` provider, however, includes an additional feature where you can run its binary outside of Terraform CLI. In this case, you can use the "generate" command on the provider binary to generate a Terraform HLC configuration file for a specified object and all child objects known to the provider. -This is not a Terraform CLI command. The provider binary can be located in the .terraform/providers directory of an existing Terraform configuration directory that uses the `solacebroker` provider, or can be downloaded from the Solace GitHub repository (TBD: add link). +You can [locate](https://terra-farm.github.io/main/installation.html) the provider binary in the `.terraform/providers` directory of an existing Terraform configuration directory that uses the `solacebrokerappliance` provider. -The provider binary can be run directly with the `generate` command to generate a Terraform configuration file from the current configuration of a PubSubPlus broker. +You can run the provider binary directly with the `generate` command to generate a Terraform configuration file from the current configuration of a PubSub+ broker. ` generate ` -- `` is the broker provider binary +- `` is the broker provider binary. - `` is the broker address, for example `https://mybroker.example.org:1943/`. - `` are the similar to the Terraform Import command. This is the resource name and possible values to find a specific resource. - `` is the desirable name of the generated filename. -- There are also supported options, which mirror the configuration options for the provider object. These can be - found [here](#supported-options) +- There are also supported options, which mirror the configuration options for the provider object. These can be found [here](#supported-options). + +## Important notes + +The generated configuration shoud be reviewed for followings: + +* Provider configuration values (url, username, etc.) may need to be updated. +* Write-only attributes, such as passwords, are omitted from the config as they cannot be read from the broker configuration. They need to be added manually. +* Default resources may be present that may be omitted. +* The generator uses a naming scheme for the resources. This may be updated by manually replacing the generated names. -### Usage +## Usage ```shell terraform-provider-solacebrokerappliance -h @@ -32,7 +38,7 @@ Usage: terraform-provider-solacebrokerappliance [command] Available Commands: -generate Generates a Terraform configuration file for a specified PubSubPlus Broker object and all child objects known to the provider +generate Generates a Terraform configuration file for a specified PubSub+ Broker object and all child objects known to the provider help Help about any command version Provides version information about the current binary ``` @@ -44,61 +50,61 @@ are listed [here](#supported-options). For example: `SOLACEBROKER_USERNAME=admin SOLACEBROKER_PASSWORD=admin terraform-provider-solacebrokerappliance generate --url=https://localhost:8080 solacebroker_msg_vpn.mq default my-messagevpn.tf` -This command would create a file `my-messagevpn.tf` that contains a resource definition for the default message VPN resource and +This command would create a file `my-messagevpn.tf` that contains a resource definition for the default Message VPN resource and any child objects, assuming the appropriate broker credentials were set in environment variables. -Note: For objects with no child object, the file will only contain resource definition for that object. +Note: For objects with no child object, the file will only contain a resource definition for that object. For example: `SOLACEBROKER_USERNAME=admin SOLACEBROKER_PASSWORD=admin terraform-provider-solacebrokerappliance generate --url=https://localhost:8080 solacebroker_msg_vpn_queue.q default/test my-message-vpn-queue.tf` This command would create a file `my-message-vpn-queue.tf` that contains the msg_vpn_queue resource , `test` for the -message VPN, `default`, assuming a msg_vpn_queue resource called `test` exists for the message VPN, `default`. +Message VPN, `default`, assuming a msg_vpn_queue resource called `test` exists for the Message VPN, `default`. + +### Supported Options + +The following parameters can be set as ENVIRONMENT VARIABLES. When used as environment variables +each parameter must be preceded with _SOLACEBROKER__. For example for a PubSub+ broker using username and password +_**admin/password**_ +would be: + +`SOLACEBROKER_USERNAME=admin SOLACEBROKER_PASSWORD=password` + +- `bearer_token`, (String, Sensitive, Mandatory if `password` will not be provided) +- `insecure_skip_verify` (Boolean) Disable validation of server SSL certificates, accept/ignore self-signed. +- `password` (String, Sensitive, Mandatory is `bearer_token` will not be provided) +- `request_min_interval` (String) +- `request_timeout_duration` (String) +- `retries` (Number) +- `retry_max_interval` (String) +- `retry_min_interval` (String) +- `username` (String, Mandatory) The username for the broker request. -### Troubleshooting +## Troubleshooting The following issues may arise while using the generator. | Error | SEMP call failed. unexpected status 401 (401 Unauthorized) | |-----------------|----------------------------------------------------------------------------| -| Explanation | Configurations to connect to the PubSubPlus Broker not accurate. | -| Possible Action | Check and confirm, configuration details to PubSubPlus Broker are accurate | +| Explanation | Configurations to connect to the PubSub+ Broker not accurate. | +| Possible Action | Check and confirm, configuration details to PubSub+ Broker are accurate. | | Error | SOLACEBROKER_xxx is mandatory but not available | |-----------------|------------------------------------------------------------------------------------| -| Explanation | A mandatory parameter which is required to connect to PubSubPlus broker is missing | +| Explanation | A mandatory parameter which is required to connect to PubSub+ broker is missing. | | Possible Action | Confirm if all [mandatory parameters](#supported-options) are correctly set. | -| Error | Error: Too many provider specific identifiers. Required identifiers: [{xxx}] | -|-----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Explanation | This indicates that identifiers specific to the provider are set in an ambiguous manner. | -| Possible Action | Ensure all identifiers are available and separated by `/` where needed. For example a msgVpnName will require `msgVpnName`, however a specific queueName under a specific msgVpnName will be `msgVpnName/queueName` | +| Error | Error: Too many provider specific identifiers. Required identifiers: [{xxx}] | +|-----------------|------------------------------------------------------------------------------| +| Explanation | This indicates that identifiers specific to the provider are set in an ambiguous manner. | +| Possible Action | Ensure all identifiers are available and separated by `/` where needed. For example a msgVpnName will require `msgVpnName`, however a specific queueName under a specific msgVpnName will be `msgVpnName/queueName`. | | Error | SEMP called failed. resource not found on path /xxx/xxx | |-----------------|------------------------------------------------------------------------------------------| -| Explanation | This indicates the resource attributes attempted to be fetch could not be read | -| Possible Action | Ensure identifiers values are consistent as set on the PubSubPlus broker configured with | +| Explanation | This indicates the resource attributes attempted to be fetch could not be read. | +| Possible Action | Ensure identifiers values are consistent as set on the PubSub+ broker configured with. | | Error | Error: Broker resource not found by terraform name xxx | |-----------------|------------------------------------------------------------------------------------------------------------| -| Explanation | This indicates the resource by name _xxx_ is not recognized by the generator | +| Explanation | This indicates the resource by name _xxx_ is not recognized by the generator. | | Possible Action | Ensure the resource name used is available as a Terraform resource for the version of the provider in use. | - -### Supported Options - -These parameters could be set as ENVIRONMENT VARIABLES. When used as environment variables -each parameter should be preceded with _SOLACEBROKER__. For example for a PubSubPlus broker using username and password -_**admin/admin**_ -will be: - -`SOLACEBROKER_USERNAME=admin SOLACEBROKER_PASSWORD=admin` - -- `bearer_token`, (String, Sensitive, Mandatory if `password` will not be provided) -- `insecure_skip_verify` (Boolean) Disable validation of server SSL certificates, accept/ignore self-signed. -- `password` (String, Sensitive, Mandatory is `bearer_token` will not be provided) -- `request_min_interval` (String) -- `request_timeout_duration` (String) -- `retries` (Number) -- `retry_max_interval` (String) -- `retry_min_interval` (String) -- `username` (String, Mandatory) The username for the broker request. diff --git a/templates/guides/provider.md b/templates/guides/provider.md index f49583a..4878cb6 100644 --- a/templates/guides/provider.md +++ b/templates/guides/provider.md @@ -1,36 +1,40 @@ --- -page_title: "Solacebroker Provider Guide" +page_title: "solacebrokerappliance Provider Guide" --- -# Solace PubSub+ Software Event Broker (solacebroker) Provider +# Solace PubSub+ Event Broker Appliance (solacebrokerappliance) Provider -The `solacebroker` provider (Provider) supports Terraform CLI operations including basic CRUD (create, read, update, and delete) and import. +The `solacebrokerappliance` provider supports Terraform CLI operations including basic CRUD (create, read, update, and delete) and import. -The Provider is leveraging the [SEMP (Solace Element Management Protocol)](https://docs.solace.com/Admin/SEMP/Using-SEMP.htm) REST API to configure the PubSub+ event broker. The API reference is available from the [Solace Documentation](https://docs.solace.com/API-Developer-Online-Ref-Documentation/swagger-ui/software-broker/config/index.html). +The provider leverages the [SEMP (Solace Element Management Protocol)](https://docs.solace.com/Admin/SEMP/Using-SEMP.htm) REST API to configure the PubSub+ event broker. The API reference is available from the [Solace PubSub+ Documentation](https://docs.solace.com/API-Developer-Online-Ref-Documentation/swagger-ui/appliance/config/index.html). -## Broker SEMP API access +## Mapping of SEMP API and Provider Names + +Terraform uses the [snake case](https://en.wikipedia.org/wiki/Snake_case) naming scheme, while SEMP uses camel case. Resources and datasource are also prefixed with the provider local name, `solacebroker_`. For example, `solacebroker_msg_vpn` is the message-vpn resource name and `max_subscription_count` is the attribute for the maximum subscription count, since `MsgVpn` is the SEMP API object name and `maxSubscriptionCount` is the name of the SEMP attribute. + +## Broker SEMP API Access The broker SEMP service, by default at port 8080 for HTTP and TLS port 1943 for HTTPS, must be accessible to the console running Terraform CLI. -The supported access credentials are basic authentication using username and password, and OAuth using a token. The two options are mutually exclusive and the provider will fail if both configured. +The supported access credentials are basic authentication using username and password, and OAuth using a token. The two options are mutually exclusive and the provider will fail if both are configured. --> The [user access levels](https://docs.solace.com/Admin/CLI-User-Access-Levels.htm) associated with the credentials used must be properly configured on the broker so desired actions are authorized. +-> The [user access levels](https://docs.solace.com/Admin/CLI-User-Access-Levels.htm) associated with the credentials used must be properly configured on the broker so that the desired actions are authorized. -## SEMP API versioning and Provider broker compatibility +## SEMP API Versioning and Provider Broker Compatibility The SEMP API minor version reflects the supported set of objects, attributes, their properties and possible deprecations. -New versions of the PubSub+ event broker with new features typically require a newer SEMP API version that supports the new or updated objects, attributes, etc. The SEMP API version of a broker version can be determined from the [Solace documentation](https://docs.solace.com/Admin/SEMP/SEMP-API-Versions.htm#SEMP_v2_to_SolOS_Version_Mapping). +New versions of the PubSub+ event broker with new features typically require a newer SEMP API version that supports the new or updated objects, attributes, etc. The SEMP API version of a broker version can be determined from the [Solace PubSub+ documentation](https://docs.solace.com/Admin/SEMP/SEMP-API-Versions.htm#SEMP_v2_to_SolOS_Version_Mapping). -A given version of the Provider is built to support a specific version of the SEMP API. For the SEMP API version of the provider see the release notes in the GitHub repo. +A given version of the provider is built to support a specific version of the SEMP API. For the SEMP API version of the provider and corresponding broker version, refer to the [Version Compatibility section](https://docs.solace.com/Admin/SEMP/Declarative-SEMP.htm#Version) of the Solace PubSub+ documentation. -* Broker versions at the same SEMP API version level as the Provider can be fully configured. -* Broker versions at a lower SEMP API version level than the Provider can be configured, with the exception of objects or attributes that have been deprecated and removed in the Provider's SEMP version. However, configuration will fail when attempting to configure objects or attributes that have been introduced in a later SEMP version than the broker supports. -* Broker versions at a higher SEMP API version level than the Provider can be configured for objects or attributes that are included in the Provider's SEMP version. Objects or attributes that have been introduced in a later SEMP version will be unknown to the Provider. Objects or attributes that have been deprecated in the broker SEMP version may result in configuration failure. +* Broker versions at the same SEMP API version level as the provider can be fully configured. +* Broker versions at a lower SEMP API version level than the provider can be configured, except for objects or attributes that have been deprecated and removed in the provider's SEMP version. However, configuration will fail when attempting to configure objects or attributes that have been introduced in a later SEMP version than the broker supports. +* Broker versions at a higher SEMP API version level than the provider can be configured for objects or attributes that are included in the provider's SEMP version. Objects or attributes that have been introduced in a later SEMP version will be unknown to the provider. Objects or attributes that have been deprecated in the broker SEMP version may result in configuration failure. -## Object relationships +## Object Relationships -Broker inter-object references must be correctly encoded in Terraform configuration to have the apply work. It requires understanding of the PubSub+ event broker objects: it is recommended to consult the [SEMP API reference](https://docs.solace.com/API-Developer-Online-Ref-Documentation/swagger-ui/software-broker/config/index.htm) and especially "Identifying" attributes that give a hint to required already configured objects. +Broker inter-object references must be correctly encoded in Terraform configuration to have the apply operation work. This requires an understanding of the PubSub+ event broker objects. For more information about each object consult the [SEMP API reference](https://docs.solace.com/API-Developer-Online-Ref-Documentation/swagger-ui/appliance/config/index.html) and especially look for "Identifying" attributes that give a hint to required already configured objects. For example: ```terraform @@ -48,25 +52,36 @@ resource "solacebroker_msg_vpn_queue" "q" { } ``` -## The Broker object +## The Broker Object The Broker object is the `solacebroker_broker` resource. This object contains global configuration for the PubSub+ event broker. The Broker object differs from all other objects as it always exists for a given broker and can only be updated. --> Important: only attributes that are specified will be set to their configured value. Unspecified attributes will not be set to their default-attribute value. This may result in `terraform plan` indicating a change to set attributes to default even after an `apply`, for example after removing an attribute from the config. +-> Important: only attributes that are specified will be set to their configured value. Unspecified attributes will not be set to their default-attribute value. This may result in `terraform plan` indicating a change to set attributes to default even after an `apply`, for example after removing an attribute from the configuration. -## Default objects +## Default Objects -There are objects that are preexisting defaults and cannot be created or destroyed, only updated. The default VPN and the default client profile are examples of this. Delete of these resources will fail. +There are objects that are preexisting defaults and cannot be created or destroyed, only updated. The default Message VPN and the default client profile are examples of this. Any attempt to remove these resources will fail. -## Broker-defined attributes +## Broker-Defined Attributes -Some attributes don't have a default value, however is not specified their value will be determined by the broker. Typically these defaults depend on the broker scaling settings. While Terraform plan and apply operations work like for any other attributes, import will set the broker value in the state (instead of null), even if they were set at default. Subsequent plan and apply can be used to fix this. +Some attributes don't have a default value. In this case their value will be determined by the broker. Typically, these defaults depend on the broker scaling settings. While Terraform plan and apply operations function the same way as with other attributes, import will set the Terraform state of the attribute to the broker value (instead of null), even if they were set at default. You can use subsequent plan and apply operations to fix this. -## Mapping of SEMP API and Provider names +## Importing Resources -Terraform uses the [snake case](https://en.wikipedia.org/wiki/Snake_case) naming scheme, while SEMP uses camel case. Resources and datasource are also prefixed with the provider local name, `solacebroker_`. For example, `solacebroker_msg_vpn` is the message-vpn resource name and `max_subscription_count` is the attribute for the maximum subscription count, since `MsgVpn` is the SEMP API object name and `maxSubscriptionCount` is the name of the SEMP attribute. +When [importing resources to Terraform](https://developer.hashicorp.com/terraform/language/import#syntax) an `id` is required. Note that this `id` is not the same as the internal `id` attribute of resources. + +The `id` to be used shall be constructed as a path from the highest parent object down to the resource. + +For example, when importing a `solacebroker_msg_vpn_queue_subscription`, the parent relationship is `msg_vpn` > `msg_vpn_queue` > `msg_vpn_queue_subscription`. To construct the `id`, concatenate the identifications of parents and the particular resource identification, separated by `/` (slash). Also note that elements containing `/` must be URL-encoded. + +For this example: +``` +id = // +# using my-vpn, my-queue, a/b/c +id = my-vpn/my-queue/a%2Fb%2Fc +``` ## Notes diff --git a/templates/index.md.tmpl b/templates/index.md.tmpl index 4d1c55f..f79682b 100644 --- a/templates/index.md.tmpl +++ b/templates/index.md.tmpl @@ -1,12 +1,12 @@ --- -page_title: "Provider: solacebroker" +page_title: "Provider: solacebrokerappliance" description: |- - A provider for a Solace PubSub+ Software Event Broker. + A provider for a Solace PubSub+ Event Broker Appliance. --- -# Solace PubSub+ Software Event Broker (solacebroker) Provider +# Solace PubSub+ Event Broker Appliance (solacebrokerappliance) Provider -The [Solace PubSub+ Platform](https://solace.com/products/platform/)'s [PubSub+ Software Event Broker](https://solace.com/products/event-broker/software/) +The [Solace PubSub+ Platform](https://solace.com/products/platform/)'s [PubSub+ Event Broker Appliance](https://solace.com/products/event-broker/software/) efficiently streams event-driven information between applications, IoT devices and user interfaces running in cloud, on-premises, and hybrid environments using open APIs and protocols like AMQP, JMS, MQTT, REST and WebSocket. @@ -16,12 +16,16 @@ to dynamically share events across the distributed enterprise. ## Overview -The _solacebroker_ provider enables configuration of a PubSub+ Software Event Broker using Terraform. +The _solacebrokerappliance_ provider enables you to configure a PubSub+ Event Broker Appliance using Terraform. -This provider also offers the possibility to generate [HCL configuration](https://developer.hashicorp.com/terraform/language) file from an already configured event broker. +This provider also offers the possibility to generate an [HCL configuration](https://developer.hashicorp.com/terraform/language) file from a preconfigured event broker. Use the navigation to the left for more information in the guides and for the available provider resources and data sources. +## Minimum broker version + +The minimum required PubSub+ Event Broker Appliance version is 10.4. + ## Example Usage {{ tffile "examples/sampleconfig.tf" }} @@ -29,7 +33,7 @@ Use the navigation to the left for more information in the guides and for the av {{ .SchemaMarkdown | trimspace }} -> All provider configuration values can also be set as environment variables with the same name but uppercase and with the `SOLACEBROKER_` prefix. -For example the password attribute can be set via the `SOLACEBROKER_PASSWORD` environment variable. Values in the configuration take precedence over environment variables. +For example, the password attribute can be set via the `SOLACEBROKER_PASSWORD` environment variable. Values in the configuration take precedence over environment variables. # Release Notes and History diff --git a/third-party-licenses.txt b/third-party-licenses.txt new file mode 100644 index 0000000..4fdca7d --- /dev/null +++ b/third-party-licenses.txt @@ -0,0 +1,1751 @@ +LICENSE SUMMARY +=============== + +License terms can be found at the bottom of this file. + +Apache 2.0 +BSD 2 +BSD 3 +Golang BSD + Patents +MIT +Mozilla 2.0 +Solace + + +THIRD-PARTY SOFTWARE USED +========================= + +github.com/Fatih/Color-v1.15.0 +------------------------------ +Licensed under MIT +Copyright 2013 +Copyright 2013 Fatih Arslan +Home page: https://pkg.go.dev/github.com/Fatih/Color@v1.15.0 + +github.com/golang/Protobuf-v1.5.3 +--------------------------------- +Licensed under BSD 3 +Copyright 2010 +Copyright 2010 The Go Authors +Home page: https://pkg.go.dev/github.com/golang/Protobuf@v1.5.3 + +github.com/hashicorp/go-Version-v1.6.0 +-------------------------------------- +Licensed under Mozilla 2.0 +Copyright 2014 HashiCorp, Inc +Home page: https://pkg.go.dev/github.com/hashicorp/go-Version@v1.6.0 + +github.com/hashicorp/go-hcLog-v1.5.0 +------------------------------------ +Licensed under MIT +Copyright 2017 +Copyright 2017 HashiCorp, Inc +Home page: https://pkg.go.dev/github.com/hashicorp/go-hcLog@v1.5.0 + +github.com/hashicorp/go-plugin-v1.4.10 +-------------------------------------- +Licensed under Mozilla 2.0 +Copyright 2016 +Copyright 2016 HashiCorp, Inc +Home page: https://pkg.go.dev/github.com/hashicorp/go-plugin@v1.4.10 + +github.com/hashicorp/go-uuid-v1.0.3 +----------------------------------- +Licensed under Mozilla 2.0 +Copyright 2015-2022 +Copyright 2015-2022 HashiCorp, Inc +Home page: https://pkg.go.dev/github.com/hashicorp/go-uuid@v1.0.3 + +github.com/hashicorp/terraform-plugin-framework-v1.3.2 +------------------------------------------------------ +Licensed under Mozilla 2.0 +Copyright 2021 +Copyright 2021 HashiCorp, Inc +Home page: https://pkg.go.dev/github.com/hashicorp/terraform-plugin-framework@v1.3.2 + +github.com/hashicorp/terraform-plugin-framework-validators-v0.10.0 +------------------------------------------------------------------ +Licensed under Mozilla 2.0 +Copyright 2022 +Copyright 2022 HashiCorp, Inc +Home page: https://pkg.go.dev/github.com/hashicorp/terraform-plugin-framework-validators@v0.10.0 + +github.com/hashicorp/terraform-plugin-go-v0.18.0 +------------------------------------------------ +Licensed under Mozilla 2.0 +Copyright 2020 +Copyright 2020 HashiCorp, Inc +Home page: https://pkg.go.dev/github.com/hashicorp/terraform-plugin-go@v0.18.0 + +github.com/hashicorp/terraform-plugin-log-v0.9.0 +------------------------------------------------ +Licensed under Mozilla 2.0 +Copyright 2021 +Copyright 2021 HashiCorp, Inc +Home page: https://pkg.go.dev/github.com/hashicorp/terraform-plugin-log@v0.9.0 + +github.com/hashicorp/terraform-registry-address-v0.2.1 +------------------------------------------------------ +Licensed under Mozilla 2.0 +Copyright 2021 +Copyright 2021 HashiCorp, Inc +Home page: https://pkg.go.dev/github.com/hashicorp/terraform-registry-address@v0.2.1 + +github.com/hashicorp/terraform-svchost-v0.1.1 +--------------------------------------------- +Licensed under Mozilla 2.0 +Copyright 2019 +Copyright 2019 HashiCorp, Inc +Home page: https://pkg.go.dev/github.com/hashicorp/terraform-svchost@v0.1.1 + +github.com/hashicorp/yamux-v0.0.0-20181012175058-2f1d1f20f75d +------------------------------------------------------------- +Licensed under Mozilla 2.0 +Copyright 2014 HashiCorp, Inc. +Home page: https://pkg.go.dev/github.com/hashicorp/yamux@v0.0.0-20181012175058-2f1d1f20f75d + +github.com/mattn/go-coLorabLe-v0.1.13 +------------------------------------- +Licensed under MIT +Copyright 2016 +Copyright 2016 Yasuhiro Matsumoto +Home page: https://pkg.go.dev/github.com/mattn/go-coLorabLe@v0.1.13 + +github.com/mattn/go-isatty-v0.0.19 +---------------------------------- +Licensed under MIT +Copyright Yasuhiro MATSUMOTO +Home page: https://pkg.go.dev/github.com/mattn/go-isatty@v0.0.19 + +github.com/mitchellh/go-testing-interface-v1.14.1 +------------------------------------------------- +Licensed under MIT +Copyright 2016 +Copyright 2016 Mitchell Hashimoto +Home page: https://pkg.go.dev/github.com/mitchellh/go-testing-interface@v1.14.1 + +github.com/oklog/Run-v1.0.0 +--------------------------- +Licensed under Apache 2.0 +No copyright. +Home page: https://pkg.go.dev/github.com/oklog/Run@v1.0.0 + +github.com/spf13/COBRA-v1.7.0 +----------------------------- +Licensed under Apache 2.0 +No copyright. +Home page: https://pkg.go.dev/github.com/spf13/COBRA@v1.7.0 + +github.com/spf13/pflag-v1.0.5 +----------------------------- +Licensed under BSD 3 +Copyright 2012 +Copyright 2012 The Go Authors2012 +Copyright 2012 Alex Ogier +Home page: https://pkg.go.dev/github.com/spf13/pflag@v1.0.5 + +github.com/vmihAilenco/msgpack/v5-v5.3.5 +---------------------------------------- +Licensed under BSD 2 +Copyright 2013 +Copyright 2013 The github.com/vmihailenco/msgpack Authors +Home page: https://pkg.go.dev/github.com/vmihAilenco/msgpack/v5@v5.3.5 + +github.com/vmihailenco/tagparser/v2-v2.0.0 +------------------------------------------ +Licensed under BSD 2 +Copyright 2019 +Copyright 2019 The github.com/vmihailenco/tagparser Authors +Home page: https://pkg.go.dev/github.com/vmihailenco/tagparser/v2@v2.0.0 + +golang.org/x/exp-v0.0.0-20230811145659-89c5cff77bcb +--------------------------------------------------- +Licensed under Golang BSD + Patents +Copyright 2009 +Copyright 2009 The Go Authors +Home page: https://pkg.go.dev/golang.org/x/exp@v0.0.0-20230811145659-89c5cff77bcb + +golang.org/x/net-v0.12.0 +------------------------ +Licensed under Golang BSD + Patents +Copyright 2009 +Copyright 2009 The Go Authors +Home page: https://pkg.go.dev/golang.org/x/net@v0.12.0 + +golang.org/x/sys-v0.11.0 +------------------------ +Licensed under Golang BSD + Patents +Copyright 2009 +Copyright 2009 The Go Authors +Home page: https://pkg.go.dev/golang.org/x/sys@v0.11.0 + +golang.org/x/text-v0.11.0 +------------------------- +Licensed under Golang BSD + Patents +Copyright 2009 +Copyright 2009 The Go Authors +Home page: https://pkg.go.dev/golang.org/x/text@v0.11.0 + +google.golang.org/genproto/googleapis/rpc-v0.0.0-20230525234030-28d5490b6b19 +---------------------------------------------------------------------------- +Licensed under Apache 2.0 +No copyright. +Home page: https://pkg.go.dev/google.golang.org/genproto/googleapis/rpc@v0.0.0-20230525234030-28d5490b6b19 + +google.golang.org/grpc-v1.57.0 +------------------------------ +Licensed under Apache 2.0 +Copyright 2014 +Copyright 2014 gRPC authors +Home page: https://pkg.go.dev/google.golang.org/grpc@v1.57.0 + +google.golang.org/protobuf-v1.31.0 +---------------------------------- +Licensed under Golang BSD + Patents +Copyright 2018 +Copyright 2018 The Go Authors +Home page: https://pkg.go.dev/google.golang.org/protobuf@v1.31.0 + + +LICENSE REQUIREMENTS & SPECIFICATIONS +====================================== + +Apache 2.0 +---------- + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +BSD 2 +----- + +Copyright (c) , +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and +the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list of conditions +and the following disclaimer in the documentation and/or other materials provided with the +distribution. + +THIS SOFTWARE IS PROVIDED BY {{THE COPYRIGHT HOLDERS AND CONTRIBUTORS}} "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL {{THE COPYRIGHT HOLDER OR +CONTRIBUTORS}} BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +BSD 3 +----- + +Copyright (c) {{YEAR}}, {{OWNER}} +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and +the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, this list of conditions +and the following disclaimer in the documentation and/or other materials provided with the +distribution. + +Neither the name of {{the ORGANIZATION nor the names of its contributors}} may be used to endorse +or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY {{THE COPYRIGHT HOLDERS AND CONTRIBUTORS}} "AS IS" AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL {{THE COPYRIGHT HOLDER OR +CONTRIBUTORS}} BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Golang BSD + Patents +-------------------- + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +******************************************************************************* + + +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. + +MIT +--- + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, +including without limitation the rights to use, copy, modify, merge, publish, distribute, +sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +Mozilla 2.0 +----------- + +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. + +Solace +------ + +Version: 10/25/2018 + +SOLACE CORPORATION + +LICENCE AGREEMENT FOR SOLACE SOFTWARE + +THIS LICENCE AGREEMENT and any documents expressly referred to in this +agreement (the "Agreement") between SOLACE CORPORATION, a company +incorporated under the laws of the Province of Ontario ("SOLACE") and +licensee, the party identified in the Order (as defined below) or that +otherwise accepts this Agreement (the "Licensee") (together the "Parties", +and each a "Party"), is made on the Effective Date (as defined below). + +BY ACCEPTING THE TERMS OF THIS AGREEMENT, EITHER BY: A) ACCEPTING THE +AGREEMENT ONLINE, B) SIGNING THE ORDER (AS DEFINED BELOW) WHICH REFERENCES +THIS AGREEMENT, OR C) INSTALLING OR USING THE SOFTWARE AFTER BEING MADE AWARE +OF THIS AGREEMENT, THE LICENSEE ACKNOWLEDGES THAT IT HAS READ AND UNDERSTOOD +ALL OF THE PROVISIONS, AND HAS THE AUTHORITY TO AGREE TO, AND IS CONFIRMING +THAT IT IS AGREEING TO, COMPLY WITH AND BE BOUND BY, ALL OF THE TERMS AND +CONDITIONS CONTAINED HEREIN, TOGETHER WITH THE TERMS SET FORTH IN ANY ORDER. +IF, AFTER READING THIS AGREEMENT, THE LICENSEE DOES NOT ACCEPT OR AGREE TO +THE TERMS AND CONDITIONS CONTAINED HEREIN, THE LICENSEE SHALL NOT INSTALL OR +USE THE SOFTWARE. + +IF YOU ARE AN AGENT OR EMPLOYEE OF ANOTHER ENTITY THEN YOU HEREBY REPRESENT +AND WARRANT THAT: (I) THE INDIVIDUAL ACCEPTING THIS AGREEMENT IS DULY +AUTHORIZED TO ACCEPT THIS AGREEMENT ON SUCH ENTITY'S BEHALF AND TO BIND SUCH +ENTITY, AND (II) SUCH ENTITY HAS FULL POWER, CORPORATE OR OTHERWISE, TO ENTER +INTO THIS AGREEMENT AND PERFORM ITS OBLIGATIONS HEREUNDER. + +1 INTERPRETATION + +1.1 Definitions. In this Agreement the following terms shall have the +following meanings: + +"Core" means (i) a single physical processor core or hyper-thread when Solace +PubSub+ software is deployed on either a bare-metal server or a cloud or +virtualization environment that presents physical cores to the software, and +(ii) a single virtual core when deployed in a cloud or virtualization +environment that presents virtual cores to the VMR. + +"Documentation" means the documentation made accessible by SOLACE via a URL +provided to Licensee. + +"Order" means (i) an electronic form provided by SOLACE on its website for +ordering Software Subscriptions, Professional Services, and/or Support and +Maintenance Services, or (ii) a written document, including a Licensee +purchase order, executed by SOLACE and Licensee pursuant to which Licensee +purchases of Software Subscriptions, Professional Services, and/or Support +and Maintenance Services from SOLACE. + +"Products" means the Software, Documentation, Support and Maintenance +Services, Professional Services and other products and services that are +ordered by Licensee from SOLACE. + +"Software" means the SOLACE software product(s) described in an Order. + +"SOLACE Quotation" means SOLACE's sales quotation document provided by SOLACE +to a prospective customer which sets out the fees for SOLACE's Products. + +"Subscription" means the right granted by SOLACE to Licensee to install and +use the Software in accordance with the terms of this Agreement and the +applicable Order, for the Subscription Term specified in the applicable +Order. + +"Subscription Fee" means the fee payable by Licensee for a Subscription in +accordance with the terms hereof and the applicable Order. + +"Subscription Term" means the period of time that Licensee is authorized by +SOLACE to install and use the Software (including the Documentation). + +"Support and Maintenance Services" means the support services provided by +SOLACE for the Software in accordance with the Support and Maintenance Terms. + +"Support and Maintenance Terms" means SOLACE'S policies, terms and conditions +for the provision of Support and Maintenance Services to its customers, a +copy of which is available on the SOLACE website at +https://solace.com/support. + +"Statement of Work" or "SOW" shall mean a statement of work in the form +attached hereto as Schedule B pursuant to which the parties agree upon the +Professional Services to be provided by SOLACE to Licensee, the fees to be +charged, milestones, deliverables and such other terms and conditions as the +parties may agree upon. + +1.2 Currency. Unless otherwise specified, all dollar amounts in this +Agreement, including the symbol "$", refer to United States currency. + +2 LICENSE GRANT + +2.1 General License to Software. + +(a) Provided Licensee complies with this Agreement, SOLACE hereby grants +to Licensee a non-exclusive, non-sublicensable (except as permitted in +accordance with Section 2.6 below), non-transferable, license, during the +term of this Agreement, to install and use the Software in object code form +during the applicable Subscription Term for the number of Cores specified in +the Order, solely for the Licensee's internal business purposes and in +accordance with the terms of this Agreement. + +(b) If Licensee requires a license from SOLACE to enable Licensee to +bundle or otherwise make available a Product with Licensee's own software, +such bundling will be pursuant to separate terms to be agreed. + +2.2 Documentation. Provided Licensee complies with this Agreement, +Licensee may reproduce the Documentation, for use on an internal basis only, +and solely in support of the Licensee's licensed use of the Software. +Distribution of the Documentation outside of Licensee is prohibited without +the express written permission of SOLACE. Licensee must reproduce all +copyright and other proprietary notices that are on the original copy of the +Documentation. + +2.3 Back-up Copy. In addition to the number of copies of the Software +installed and used pursuant to Section 2.1 and paid for in accordance with +Section 5, Licensee may make one copy of each licensed Product per +Subscription solely for back-up purposes, provided that Licensee reproduces +all copyright and other proprietary notices that are on the original copy of +the Software and such back-up copy is not installed or used other than for +back-up and recovery purposes. Back-up copies that are used as part of a +live or 'hot' back-up will be subject to additional fees. + +2.4 Use Restrictions. Licensee will not: (a) reverse engineer, +disassemble, decompile, or translate the Software (other than Sample +Applications), or otherwise attempt to derive the source code version of the +Software, except if and only to the extent expressly permitted by applicable +law, and provided that Licensee first approaches SOLACE and seeks permission +in writing; (b) except as expressly permitted in this Agreement, use the +Products or any portion thereof to create or develop any developer tools +(including plug-ins and middleware) or any software; (c) except as expressly +permitted in this Agreement, rent, lease, loan or otherwise in any manner +provide, transfer or distribute the Products or any part thereof to any third +party; (d) use the Software in violation of applicable laws; (e) circumvent +any user limits or other license timing or use restrictions that are built +into the Software; (f) except as expressly permitted in this Agreement, +reproduce, distribute, publicly perform, publicly display or create +adaptations or derivative works of or based on the Products. + +2.5 Publicly Available Software. Portions of the Software include +software programs that are distributed by SOLACE pursuant to the terms and +conditions of a license granted by the copyright owner of such software +programs and which governs Customer's use of such software programs +("Publicly Available Software"). The Licensee's use of Publicly Available +Software in conjunction with the Software in a manner consistent with the +terms of this Agreement is permitted, however, the Licensee may have broader +rights under the applicable license for Publicly Available Software and +nothing contained herein is intended to impose restrictions or limitations on +the Licensee's use of the Publicly Available Software. The warranty, +indemnity and limitation of liability provisions in this Agreement will apply +to all of the Software, including Publicly Available Software included in the +Software. Copies of such Publicly Available Software license agreements are +available by contacting Licensor at support@solace.com. The source code for +certain portions of the Publicly Available Software included in the Software +(as specified in the copyright notices) is available by contacting SOLACE at +support@solcae.com within a three (3) year period from the original date of +receipt of the applicable Software or Adapter and for a fee that shall not +exceed Licensor' costs associated with the shipping of such software source +code. + +2.6 Sub-licensing. Any sub-licensing of the Software under this +Agreement must be expressly authorized by SOLACE pursuant to an Order or +otherwise in writing. Any attempt by Licensee to sub-license or otherwise +transfer the Products to a third party in breach of this restriction will be +void. Any sub-licensing that may be permitted under this Agreement by SOLACE +will be subject to such sub-licensee agreeing to substantially similar +restrictions and obligations set out in this Agreement. Licensee will be +fully liable for any breach by a sub-licensee of any restriction or +obligation, and SOLACE may bring a Claim against Licensee if SOLACE suffers +any Losses arising from such breach. + +2.7 Evaluation Licenses. + +(a) If the Software provided to Licensee under this Agreement is +designated by SOLACE in an Order or otherwise as an evaluation release +(indicated by terms such as "pre-commercial", "alpha," "beta," "trial," +"draft," "early access," "EA" or "evaluation") (each an "Evaluation Software +Release"), Licensee will have the limited right under this Agreement to +download and install the Software on the number of Cores identified in the +Order or, if not identified, one Core, for the Licensee's internal and +non-commercial evaluation of the Software. + +(b) Licensee acknowledges that the Evaluation Software Release may not +meet performance and compatibility standards of a production version. The +Evaluation Software Release may not operate correctly, may be substantially +modified by SOLACE prior to first commercial shipment, and may be withdrawn +completely and never issued for commercial use. + +(c) If Licensee desires other rights for the Evaluation Software Release, +Licensee must request from SOLACE a commercial release of the Software. + +(d) The limited use license granted in subsection (a) will automatically +expire on the earlier of: (i) the date when the Software is made available to +Licensee as a commercially available product, and (ii) the date specified in +the Order or, if no such date is identified in the Order, the date that is 30 +days after the date of delivery or provision of the Evaluation Software +Release to Licensee. Following license expiry Licensee will permanently +delete or otherwise purge such Evaluation Software Release from Licensee's +systems and, if requested by SOLACE, certify the same. + +2.8 License of APIs. Provided Licensee complies with this Agreement and +any terms that SOLACE provides, SOLACE grants to Licensee a non-exclusive, +royalty free license, during the term of this Agreement, to download, install +and use, the applicable application programming interfaces that may be made +available by SOLACE with the Software ("APIs") solely to create interfaces +between the Software and the Licensee's software or third party software on +Licensee's systems. + +2.9 License to Sample Applications. + +(a) SOLACE may, in its sole discretion, provide certain sample Software +in source code or object code form for the purposes of demonstrating certain +features enabled by the Software, including demonstrating to Licensees how to +build applications using APIs, and for use by Licensees with such APIs (each, +a "Sample Application"). + +(b) Whether provided separately or together with other Software, if +SOLACE provides such Sample Application to Licensee, then SOLACE hereby +grants to Licensee a non-sublicensable, non-transferable, non-exclusive, +revocable license, to install such Sample Application for Licensee's +evaluation for the same duration as the Software with which the Sample +Application is associated or such other duration as specified by SOLACE upon +delivery of the Sample Application. + +3 OPTIONAL SERVICES AND SUPPORT + +3.1 Optional Services. Licensee acknowledge that certain optional +services, such as training, integration and development services may be +provided by SOLACE in association with the Products, and access to such +services will be provided only pursuant to a Statement of Work executed by +SOLACE and Licensee and may include separate and additional fees. + +3.2 Support. + +(a) Provided Licensee complies with this Agreement, SOLACE will provide +Support and Maintenance Services the Software in accordance with SOLACE's +then standard Support and Maintenance Terms. The level of support will be +dependent on whether Licensee has procured either the 'Premium Support Plan' +or 'Standard Support Plan' defined in SOLACE's Support and Maintenance Terms +and as specified in the applicable Order. + +(b) SOLACE may enhance such standard Support and Maintenance Services +from time to time in its discretion. + +(c) For greater clarity, SOLACE's then standard Support and Maintenance +Terms do not apply to Evaluation Software Releases, Sample Applications or +any free versions of the Software that may be made available. SOLACE may +make available support related information on a free basis for such Software +on its publicly accessible website or otherwise, and such support related +information will, for greater clarity, be subject to the limitations and +exclusions in this Agreement. + +4 PROPRIETARY RIGHTS + +4.1 Intellectual Property Rights. In this Agreement "Intellectual +Property Rights" means: (a) any and all proprietary rights anywhere in the +world provided under: (i) patent law; (ii) copyright law (including moral +rights); (iii) trademark law; (iv) design patent or industrial design law; or +(v) any other statutory provision or common law principle applicable to this +Agreement, including trade secret law, that may provide a right in either +hardware or information generally or the expression or use of such hardware +or information; (b) any and all applications, registrations, licenses, +sub-licenses, franchises, agreements or any other evidence of a right in any +of the foregoing. Except for the licenses expressly granted herein, othing +in this Agreement or the provision of the Products conveys or otherwise +provides to Licensee title, interest or any Intellectual Property Rights in +or to: (a) the Products, or (b) know-how, ideas, or any other subject matter +protectable under laws applicable to Intellectual Property Rights of any +jurisdiction. As between Licensee and SOLACE, SOLACE and its affiliates and +licensors are the sole and exclusive owners of the Products, including +Intellectual Property Rights therein. + +4.2 Feedback. Licensee is encouraged to provide to SOLACE suggestions, +comments and feedback related to the Products (including reporting bugs) (the +"Feedback"). Licensee hereby grants to SOLACE a license to use, copy, +distribute, modify or otherwise adapt, incorporate into any software and +documentation, including the Products, and sublicense, without attribution or +compensation to Licensee, all Feedback which SOLACE receives or otherwise +obtains from Licensee, in any form, to improve, enhance or modify the +Products or otherwise. Licensee waives or will cause all moral rights to be +waived in any Feedback. + +4.3 Third Party Licenses. The Software may contain or require third +party software that is licensed under third party terms. SOLACE may direct +Licensee to such third party terms, and in some instances the Software cannot +be used or further distributed without Licensee's acceptance of such terms. +Any failure of Licensee to agree to the terms applicable to such third party +software may undermine certain functionality of or prevent Licensee from +using the Software. + +4.4 Open Source Software. + +(a) Licensee will not represent to third parties, or use any third party +software or code in conjunction with: (i) the Software; or (ii) any software, +products, documentation, content or other materials developed using the +Software, in such a way that: (A) creates, purports to create or has the +potential to create, obligations for SOLACE with respect to the Software; or +(B) grants, purports to grant, or has the potential to grant to any third +party any rights to or immunities under any Intellectual Property Rights of +SOLACE, as such rights exist in or relate to the Products. + +(b) Licensee will not use any Software in any manner, including through +incorporation, linking, distribution or otherwise, that will cause any +Products and any Intellectual Property Rights therein to become subject to +any encumbrance or terms and conditions of any third party or open source +license, including any open source license listed on +http://www.opensource.org/licenses/alphabetical (each an "Open Source +License"). + +(c) The restrictions, limitations, exclusions and conditions referred to +under subsection (b) will apply even if SOLACE becomes aware of or fails to +act in a manner to address any violation or failure to comply therewith. No +act by SOLACE that is undertaken under this Agreement in respect to any +Products will be construed as intending to cause any Intellectual Property +Rights that are owned or controlled by SOLACE or any of its affiliates (or +for which SOLACE or any of its affiliates has received license rights) to +become subject to any encumbrance or terms and conditions of any Open Source +License. + +4.5 Use of Name and Logo. Licensee will not display or make any use of +SOLACE's or its affiliates' names, marks or logos without the prior written +approval of SOLACE. + +5 FEES AND TAXES + +5.1 Fees. Licensee shall pay the applicable Subscription Fees and support +fees specified in the applicable Order. Except as otherwise specified herein +or in an Order, Subscription Fees are based on Subscriptions purchased and +not actual usage. Payment obligations are non-cancellable, Subscription Fees +paid are non-refundable, and the number of Subscriptions purchased cannot be +decreased during the relevant Subscription Term. + +5.2 Invoices and Payment. Subscription Fees will be invoiced in advance +and otherwise in accordance with the relevant Order. All invoices issued by +SOLACE are due and payable within 30 days of the invoice date unless +otherwise agreed in an Order. Licensee will be responsible for any and all +sales, use, excise, import, value-added, services, consumption, and other +taxes assessed on the receipt of the Products, and any related services as a +whole. + +5.3 Overdue Charges. Any payment not received from Customer by the due +date may accrue (except with respect to charges then subject to a reasonable +and good faith dispute), at Licensor' discretion, late charges at the rate of +1.5% of the outstanding balance per month (19.57% per annum), or the maximum +rate permitted by law, whichever is lower, from the date such payment was due +until the date paid. + +6 CONFIDENTIALITY + +6.1 Definition of Confidential Information. + +In this Agreement "Confidential Information" of a Party means any information +of a Party (including in respect to SOLACE any of its affiliates, licensors, +customers, employees or subcontractors) (the "Disclosing Party"), whether +oral, written or in electronic form, which has or will come into the +possession or knowledge of the other Party (the "Receiving Party") in +connection with or as a result of entering into this Agreement that can +reasonably be considered to be confidential in the circumstances of +disclosure or which is designated as confidential. The Products, any +performance information, service levels, support terms, and results of +testing of the Software, and the terms of this Agreement are Confidential +Information of SOLACE. Notwithstanding the foregoing, "Confidential +Information" does not include information that is: + +(a) publicly available when it is received by or becomes known to the +Receiving Party or that subsequently becomes publicly available other than +through a direct or indirect act or omission of the Receiving Party (but only +after it becomes publicly available); + +(b) established by evidence to have been already known to the Receiving +Party at the time of its disclosure to the Receiving Party and is not known +by the Receiving Party to be the subject of an obligation of confidence of +any kind; + +(c) independently developed by the Receiving Party without any use of or +reference to the Confidential Information of the Disclosing Party as +established by evidence that would be acceptable to a court of competent +jurisdiction; + +(d) received by the Receiving Party in good faith without an obligation +of confidence of any kind from a third party who the Receiving Party had no +reason to believe was not lawfully in possession of such information free of +any obligation of confidence of any kind, but only until the Receiving Party +subsequently comes to have reason to believe that such information was +subject to an obligation of confidence of any kind when originally received; +or + +(e) Feedback provided by Licensee or a representative of Licensee. + +6.2 Confidentiality Obligations. + +(a) Each Party will, in its capacity as a Receiving Party: (i) not use or +reproduce Confidential Information of the Disclosing Party for any purpose, +other than as may be reasonably necessary for the exercise of its rights or +the performance of its obligations set out in this Agreement; and (ii) not +disclose, provide access to, transfer or otherwise make available any +Confidential Information of the Disclosing Party to any third party except as +expressly permitted in this Agreement. + +(b) Each Party may, in its capacity as a Receiving Party, disclose +Confidential Information of the Disclosing Party: (i) if and to the extent +required by a governmental authority or otherwise as required by applicable +law, provided that the Receiving Party must first give the Disclosing Party +notice of such compelled disclosure (except where prohibited by applicable +law from doing so) and must use commercially reasonable efforts to provide +the Disclosing Party with an opportunity to take such steps as it desires to +challenge or contest such disclosure or seek a protective order. Thereafter, +the Receiving Party may disclose the Confidential Information of the +Disclosing Party, but only to the extent required by applicable law and +subject to any protective order that applies to such disclosure; and (ii) to: +(A) its accountants, internal and external auditors and other professional +advisors if and to the extent that such persons need to know such +Confidential Information in order to provide the applicable professional +advisory services relating to the Receiving Party; and (B) employees of the +Receiving Party and its subcontractors if and to the extent that such persons +need to know such Confidential Information to perform their respective +obligations under this Agreement; + +provided that any such person is aware of the provisions of this Section 6.2 +and has entered into a written agreement with the Receiving Party that +includes confidentiality obligations in respect of such Confidential +Information of the Disclosing Party that are no less stringent than those +contained in this Section 6.2. + +6.3 Consent to Injunctive Relief. Any unauthorized use or disclosure of +the Confidential Information of SOLACE, its affiliates or licensors may cause +irreparable harm and significant injury to SOLACE that would be difficult to +ascertain or quantify; accordingly Licensee agrees that SOLACE will have the +right to seek and obtain injunctive or other equitable relief to enforce the +terms of this Agreement and without limiting any other rights or remedies +that SOLACE may have. + +7 WARRANTY AND DISCLAIMER OF WARRANTIES. + +7.1 Warranty. SOLACE warrants that the Software will materially comply +with the Documentation during the Subscription Term. If the Software does +not materially conform with the warranty in the prior sentence, provided that +Licensee is in compliance with the terms of this Agreement, and all +Subscription Fees are fully-paid up, SOLACE will provide the support to +Licensee in respect to the applicable Software to the extent set out in +SOLACE's then current Support and Maintenance Terms, and the provision of +support to correct the non-compliance with the warranty in this Section will +be Licensee's sole and exclusive remedy in the event of non-compliance with +the warranty in this Section by SOLACE. All other support will be dependent +on the plan procured by Licensee, as defined in the Support and Maintenance +Terms. + +7.2 Disclaimers. + +a) EXCEPT AS SET OUT IN SECTION 7.1, THE PRODUCTS AND SUPPORT THAT MAY +BE PROVIDED BY SOLACE UNDER THIS AGREEMENT, IS PROVIDED 'AS-IS' AND 'AS +AVAILABLE'. + +(b) Except as set out in Section 7.1, the Products and support are +without any additional warranties of any kind, whether express, implied, +collateral, statutory or otherwise. SOLACE does not warrant or make any +representations regarding the use, or the results of the use, of the Products +in terms of its correctness, accuracy, reliability, or otherwise. + +(c) SOLACE does not represent or warrant that the functionality of the +Products will meet Licensee requirements, or that the operation of the +Products will be uninterrupted or error-free, or that the Products or any +service enabled by the use of the Software will always be available, or that +defects in the Products will be corrected. + +(d) TO THE MAXIMUM EXTENT PERMITTED UNDER APPLICABLE LAW, SOLACE ON ITS +OWN BEHALF AND ON BEHALF OF ITS AFFILIATES AND LICENSOR(S) EXPRESSLY +DISCLAIMS ALL WARRANTIES AND CONDITIONS, WHETHER EXPRESS, IMPLIED, STATUTORY +OR OTHERWISE, INCLUDING ANY IMPLIED WARRANTIES, AND CONDITIONS OF +MERCHANTABLE QUALITY, MERCHANTABILITY, QUALITY, FITNESS FOR A PARTICULAR +PURPOSE, AND NON-INFRINGEMENT. + +(e) Some jurisdictions do not allow the exclusion of implied warranties, +so exclusions in this Article 7 will apply only to the extent permitted by +applicable law. + +8 LICENSEE INDEMNITY AND EXCLUSION. + +8.1 Licensee Indemnity. + +(a) Without limiting SOLACE's rights and remedies under this Agreement, +Licensee will indemnify, defend and hold SOLACE, its licensors, affiliates or +any of their respective directors, officers, employees or agents (together, +the "Solace Indemnitees") harmless from and against any and all third party +Claims and Losses incurred or otherwise suffered by each SOLACE Indemnitee +arising out of, resulting from or related to: +(i) any use, reproduction or distribution of the Products +(notwithstanding the restrictions and obligations in this Agreement), as +modified or integrated by Licensee in Licensee application, which causes an +infringement or misappropriation of any Intellectual Property Right, +publicity or privacy right of any third parties arising in any jurisdiction +anywhere in the world, except and solely to the extent such infringement is +caused by the unmodified Software, or portions thereof, as supplied to +Licensee by SOLACE under this Agreement; or +(ii) any use, downloading, distribution, installation, storage, execution, +or transfer of the Products in breach of this Agreement. + +(b) SOLACE may enforce the indemnity under this Article 8 on behalf of +any or all of the SOLACE Indemnitees. Licensee may only bring a Claim +against SOLACE and not any SOLACE Indemnitees under this Agreement. + +8.2 SOLACE Indemnity. + +(a) SOLACE will defend Licensee from and against any and all Claims by a +third party incurred or otherwise suffered by Licensee arising out of, +resulting from or related to a Claim that the Products licensed pursuant to +Section 2.1 infringe or misappropriate third party copyright or patent rights +in Canada or the United States of America, and indemnity Licensee from any +damages awarded by a court of final determination. + +(b) Without limitation, Section 8.2 will not be applicable and SOLACE +will not be liable to defend a Claim to the extent that such Claim is based +on: (i) Licensee's use of the Products after SOLACE notifies Licensee to +discontinue using them; (ii) Licensee combining the Products with non-SOLACE +services, products, programs or data; or (iii) Licensee altering or modifying +the Products. + +(c) If SOLACE receives information concerning an infringement or +misappropriation Claim related to the Products, SOLACE may, at its expense +and without obligation to do so, either: (i) procure the Intellectual +Property Rights or other right(s) to continue to use the Product; or (ii) +replace or modify the Product to make it non-infringing; or (iii) immediately +terminate this Agreement on written notice to Licensee, in which case SOLACE +will refund to Licensee, on a pro-rata basis, any pre-paid fees in respect to +such Product from the date of such termination to the end of the then current +Subscription Term for such Product; and this Section 8.2(c) states the sole +and exclusive remedy of Licensee and the entire liability of SOLACE for third +party infringement claims and actions. + +8.3 Indemnification Procedures. Each Party's obligations under this +Article 8 are contingent on all of the following: (i) the Party seeking the +indemnity (the "Indemnified Party") must notify the other Party (the +"Indemnifying Party"), in a timely manner and in writing of the Claim; (ii) +the Indemnified Party must give the Indemnifying Party sole control over +defense and settlement of the Claim; (iii) the Indemnified Party must provide +the Indemnifying Party with reasonable information and assistance, at the +Indemnifying Party's request, as needed in defending the Claim (the +Indemnifying Party will reimburse the Indemnified Party for reasonable +expenses that the Indemnified Party incurs in providing that assistance). +The Indemnified Party may choose to have its counsel, monitor or participate +in the defense of such a Claim provided that the Indemnified Party will be +responsible for the cost of its own counsel and the Indemnifying Party's +obligations in this Article 8 do not extend to the Indemnified Party's legal +costs should it wish to exercise such right. The Indemnifying Party will not +be responsible for any settlement made by the Indemnified Party without its +prior written consent. The Indemnifying Party may not settle or publicize +any Claim without the Indemnified Party's prior written consent. + +9 LIMITATIONS OF LIABILITY. + +9.1 Definition and Limitations of Liability. + +(a) In this Agreement: "Claim" means any actual, threatened or potential +civil, criminal, administrative, regulatory, arbitral or investigative +demand, allegation, action, suit, investigation or proceeding or any other +claim or demand; and "Losses" means any and all damages, fines, penalties, +deficiencies, losses, liabilities (including settlements and judgments), +costs and expenses (including interest, court costs, reasonable fees and +expenses of lawyers, accountants and other experts and professionals or other +reasonable fees and expenses of litigation or other proceedings or of any +Claim, default or assessment). + +(b) SUBJECT TO SECTION 9.1(d), TO THE FULLEST EXTENT PERMITTED BY +APPLICABLE LAW, UNDER NO CIRCUMSTANCES WILL SOLACE INDEMNITEES BE LIABLE FOR +(A) ANY INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE, EXEMPLARY OR CONSEQUENTIAL +DAMAGES; OR (B) ANY DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS +INTERRUPTION, OR LOSS OF BUSINESS INFORMATION, IN EACH CASE, ARISING OUT OF +OR IN CONNECTION WITH THIS AGREEMENT, INCLUDING ANY DOWNLOAD, INSTALLATION OR +USE OF, OR INABILITY TO USE, THE PRODUCTS; EVEN IF SUCH DAMAGES WERE +FORESEEABLE, AND REGARDLESS OF WHETHER THE SOLACE INDEMNITIEES HAVE BEEN +ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +(c) SUBJECT TO SECTION 9.1(d), TO THE FULLEST EXTENT PERMITTED BY +APPLICABLE LAW, IN NO EVENT WILL SOLACE INDEMNITEES' TOTAL AGGREGATE +LIABILITY IN RESPECT OF THIS AGREEMENT, INCLUDING THE PRODUCTS AND ANY +SERVICES THAT MAY BE PROVIDED HEREUNDER, FOR ANY AND ALL LOSSES AND CLAIMS +EXCEED THE AMOUNTS PAID TO SOLACE IN THE 12 MONTHS IMMEDIATELY PRECEDING THE +EVENT GIVING RISE TO THE CLAIM. + +(d) Certain Damages Not Excluded or Limited. NOTWITHSTANDING THE +FOREGOING, SECTIONS 9.1 (b) AND (c) DO NOT APPLY TO (I) DAMAGES ARISING FROM +A PARTY'S BREACH OF ITS CONFIDENTIALITY OBLIGATIONS HEREUNDER, (II) +INDEMNIFICATION CLAIMS, (III) DAMAGES ARISING FROM INFRINGEMENT OF A PARTY'S +INTELLECTUAL PROPERTY RIGHTS; (IV) ANY CLAIMS FOR NON-PAYMENT, (V) FRAUD OR +WILLFUL MISCONDUCT, OR (VI) BODILY INJURY OR DEATH. + +(e) This Article 9 will apply irrespective of the nature of the cause of +action, demand or Claim, including, breach of contract (including fundamental +breach), negligence (including gross negligence), tort or any other legal +theory, and will survive a fundamental breach or breaches of this Agreement +or of any remedy contained herein. + +10 TERM AND TERMINATION. + +10.1 Term and Renewal. This Agreement will be effective from the Effective +Date and will continue until the expiry of the Subscription Term set out in +the Order or the Agreement terminates in accordance with its terms. Subject +to payment of the applicable Software Fees, Software Subscriptions shall +automatically renew for additional periods equal to the expiring Subscription +Term or one (1) year (whichever is shorter), unless either party gives the +other notice of non-renewal at least thirty (30) days prior to the end of the +then-current Subscription Term. The Subscription Fees during any automatic +renewal term will be as set forth in the applicable Order. + +10.2 Termination for Cause. A party may terminate this Agreement for cause +(i) upon 30 days' written notice to the other party of a material breach if +such breach remains uncured at the expiration of such period, or (ii) if the +other party becomes the subject of a petition in bankruptcy or any other +proceeding relating to insolvency, receivership, liquidation or assignment +for the benefit of creditors. + +10.3 Termination by SOLACE. SOLACE may terminate this Agreement for cause +with immediate effect on written notice if Licensee commits a breach of +Articles 4 or 5 by Licensee. + +10.4 Termination of Sample Application and Evaluation Software Release +Licenses for Convenience by SOLACE. SOLACE may terminate the licenses in +respect to the Sample Applications, Evaluation Software Releases, and any +other Products that may be licensed by SOLACE on a trial basis, at any time +for convenience, upon written notice to Licensee. + +10.5 Termination of Licenses of Trial Software. Subject to Section 10.4, +if any Software is licensed for use by a Licensee on a trial basis, the +license to use such Software during a trial period will continue for such +duration set out in an Order. + +10.6 Effects of Termination. Upon termination or expiry of this Agreement +or specific licenses granted hereunder for any reason, and without limiting +SOLACE's other rights or remedies under this Agreement: (a) Licensee must +permanently delete or destroy, or otherwise purge, all copies (electronic or +otherwise) of the applicable Products from Licensee's systems, and any other +Confidential Information of SOLACE, in Licensee's possession or control, and, +if requested by SOLACE, certify the same, and the license and other rights +granted to Licensee in this Agreement will terminate; (b) termination or +expiration of this Agreement or an individual Subscription will result in +termination of any applicable Support and Maintenance Services; and (c) +Licensee will not receive a return of any pre-paid fees in respect to the +applicable Products, on a pro-rata basis or otherwise, except where expressly +stated in this Agreement. + +10.7 Survival. Neither the expiration nor the earlier termination of this +Agreement will release either of the Parties from any obligation or liability +that accrued prior to such expiration or termination. The provisions of this +Agreement requiring performance or fulfilment after the expiration or earlier +termination of this Agreement, including Articles 4, 5, 5, 7, 9, 8, 9, 10, +11, 12, and 13, and such other provisions as are necessary for the +interpretation thereof and any other provisions hereof, the nature and intent +of which is to survive termination or expiration of this Agreement, will +survive the expiration or earlier termination of this Agreement. + +11 AUDIT AND REMEDIATION + +11.1 Audit. During the term of this Agreement and for two years +thereafter, SOLACE or any internal or external audit representative acting on +behalf of SOLACE (the "SOLACE Audit Representatives") will have the right, +and Licensee will provide access to SOLACE Audit Representatives during +regular business hours and upon reasonable prior written notice to Licensee, +to audit and inspect on a mutually agreed upon date and location any system +or facility or part of a system or facility to which Licensee has downloaded +the Software or is receiving any services (or both) in order to verify the +performance by Licensee of its obligations under this Agreement, including +the Licensee's usage of the Products in accordance with the restrictions and +terms in this Agreement. + +11.2 Remediation. Without limiting SOLACE's rights and remedies under this +Agreement, if an audit conducted pursuant to this Agreement reveals any +error, deficiency or other failure to perform on the part of Licensee +including use of the Software contrary to the licenses in this Agreement or +installed on systems, computers or processors for which the Licensee has not +paid applicable Subscription Fees: (a) Licensee will immediately pay to +SOLACE any fees due and payable for Software used in breach of the +restrictions in this Agreement, plus interest at the lesser of: (i) the rate +of 1.5 percent per month compounded monthly (19.562 percent per annum); or +(ii) the maximum rate allowed by applicable law, in each case, on the amount +outstanding from the date when payment is due until the date payment in full +is received by SOLACE; and (b) pursue any other right or remedy SOLACE may +have under this Agreement. + +12 EXPORT COMPLIANCE ASSURANCES + +(a) All Products obtained from SOLACE are subject to the export control +and economic sanctions laws and regulations of Canada, including the Exports +and Import Permits Act, R.S.C. 1985, c. E-19, Area Control List, Export +Control List, and the United States, including the Export Administration +Regulations ("EAR", 15 CFR 730 et seq., http://www.bis.doc.gov/) administered +by the Department of Commerce, Bureau of Industry and Security, and the +Foreign Asset Control Regulations (31 CFR 500 et seq., +http://www.treas.gov/offices/enforcement/ofac/) administered by the +Department of Treasury, Office of Foreign Assets Control ("OFAC"), each as +may be amended and updated from time to time. + +(b) Licensee will not, and will ensure that Licensee will not directly or +indirectly export, re-export, transfer or release (collectively, "export") +any Products to any destination, person, entity or end use prohibited or +restricted under Canadian or US law, or the laws of the jurisdiction in which +Licensee is resident or in which Licensee uses the Products, without prior +government or regulatory authorization to the extent required by applicable +laws and regulations. + +(c) The US government maintains embargoes and sanctions against the +countries listed in Country Groups E:1/2 of the EAR (Supplement 1 to part +740), including, as at the Effective Date, Cuba, Iran, North Korea, Sudan and +Syria, as amended from time to time. Licensee will not directly or +indirectly employ any Product received from SOLACE in missile technology, +sensitive nuclear or chemical biological weapons activities, or in any manner +knowingly transfer any Product to any party for any such end use. Licensee +will not export Products listed in Supplement 2 to part 744 of the EAR for +military end-uses, as defined in part 744.21, to the People's Republic of +China. Licensee will not transfer any Product to any party listed on any of +the denied parties lists or specially designated nationals lists maintained +under said regulations without appropriate US government authorization to the +extent required by regulation. Licensee acknowledge that other countries may +have trade laws pertaining to import, use, export or distribution of +Products, and that compliance with same is Licensee responsibility. + +(d) Licensee may not use the Products if Licensee is barred from +receiving the Products under the laws of Canada, the United States or any +other country including the country in which Licensee are resident or in +which Licensee use the Products. + +13 GENERAL + +13.1 U.S. Government Users. If Licensee are acting on behalf of an agency +or instrumentality of the U.S. federal government, the Product, as +applicable, are "commercial computer software" and "commercial computer +software documentation" developed exclusively at private expense by SOLACE. +Pursuant to FAR 12.212 or DFARS 227 7202 and their successors, as applicable, +use, reproduction and disclosure of the Products is governed by the terms of +this Agreement. + +13.2 Entire Agreement. This Agreement, and the agreements and other +documents required to be delivered pursuant to this Agreement, constitute the +entire and exclusive agreement between SOLACE and Licensee, and sets out all +the covenants, promises, warranties, representations, conditions and +agreements between the Parties in connection with the subject matter of this +Agreement, and supersedes all prior agreements (whether written or oral, +pre-contractual or otherwise) and other communications between SOLACE and +Licensee. There are no covenants, promises, warranties, representations, +conditions or other agreements, whether oral or written, pre-contractual or +otherwise, express, implied or collateral, whether statutory or otherwise, +between the Parties in connection with the subject matter of this Agreement +except as specifically set forth in this Agreement and any document required +to be delivered pursuant to this Agreement. + +13.3 Amendments. This Agreement may be modified only by a written +amendment agreed to by both Licensee and SOLACE, except that SOLACE may +modify the Documentation from time to time, provided that SOLACE does not +materially lessen the description of the functionality of the Products as a +result of such modification. + +13.4 English Language. This Agreement is entered into solely in the +English language, and if for any reason any other language version is +prepared by any Party, it will be solely for convenience and the English +version will govern and control in all respects. If Licensee are located in +the province of Quebec, Canada, the following applies: The Parties hereby +confirm they have requested this Agreement and all related documents be +prepared in English. Les parties ont exigé que le présent contrat et tous +les documents connexes soient rédigés en anglais. + +13.5 Waiver. To be effective, any waiver by a Party of any of its rights +or any other Party's obligations under this Agreement must be made in a +writing signed by the Party to be charged with the waiver. No failure or +forbearance by any Party to insist upon or enforce performance by any other +Party of any of the provisions of this Agreement or to exercise any rights or +remedies under this Agreement or otherwise at law or in equity will be +construed as a waiver or relinquishment to any extent of such Party's right +to assert or rely upon any such provision, right, or remedy in that or any +other instance; rather, the same will be and remain in full force and effect. + A Party's waiver of a breach of any term will not be a waiver of any +subsequent breach of the same or another term. + +13.6 Cumulative Rights. The rights of each Party hereunder are cumulative +and no exercise or enforcement by a Party of any right or remedy hereunder +will preclude the exercise or enforcement by such Party of any other right or +remedy hereunder or which such Party is otherwise entitled by law to enforce. + +13.7 Severability. If, in any jurisdiction, any provision of this +Agreement or its application to any Party or circumstance is restricted, +prohibited or unenforceable, the provision will, as to that jurisdiction, be +ineffective only to the extent of the restriction, prohibition or +unenforceability without invalidating the remaining provisions of this +Agreement and without affecting the validity or enforceability of such +provision in any other jurisdiction, or without affecting its application to +other Parties or circumstances. + +13.8 Assignment. SOLACE may assign this Agreement or any of the benefits, +rights or obligations under this Agreement without the prior written consent +of the Licensee. Licensee may not assign this Agreement or any of the +benefits, rights or obligations under this Agreement without the prior +written consent of SOLACE. Any attempt by Licensee to so assign or transfer +is null and void. If SOLACE does consent to an assignment of this Agreement, +the transferee/assignee must be acceptable to SOLACE and agree to the terms +and conditions of this Agreement. + +13.9 Further Assurances. The Parties will, with reasonable diligence, do +all things and provide all such reasonable assurances as may be required to +consummate the transactions contemplated by this Agreement, and each Party +will provide such further documents or instruments required by any other +Party as may be reasonably necessary or desirable to effect the purpose of +this Agreement and carry out its provisions. + +13.10 Governing Law and Jurisdiction. This Agreement is governed and +interpreted in accordance with the laws of the Province of Ontario and the +laws of Canada applicable therein, without giving effect to its conflict of +laws provisions. Any Claim arising out of or related to this Agreement must +be brought exclusively in a federal or provincial court located in Ottawa, +Canada, and Licensee hereby consents to the jurisdiction and venue of such +courts. Each of the Parties irrevocably waives, to the fullest extent it may +effectively do so, the defence of an inconvenient forum to the maintenance of +such action, application or proceeding. The Parties will not raise any +objection to the venue of any action, application, reference or other +proceeding arising out of or related to this Agreement in the federal or +provincial courts sitting in Ottawa, including the objection that the +proceedings have been brought in an inconvenient forum. A final judgment in +any such action, application or proceeding is conclusive and may be enforced +in other jurisdictions by suit on the judgment or in any other manner +specified by law. The United Nations Convention on Contracts for the +International Sale of Goods is expressly disclaimed and will not apply. + +