From 853ac7f483dc6574cdf1f538630c28f01a68596f Mon Sep 17 00:00:00 2001 From: Karl Cardenas <29551334+karl-cardenas-coding@users.noreply.github.com> Date: Wed, 18 Dec 2024 08:00:22 -0700 Subject: [PATCH 1/7] docs: DOC-1528 (#5084) --- .../clusters/public-cloud/aws/required-iam-policies.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/docs-content/clusters/public-cloud/aws/required-iam-policies.md b/docs/docs-content/clusters/public-cloud/aws/required-iam-policies.md index 10808c4b16..d5c4aec200 100644 --- a/docs/docs-content/clusters/public-cloud/aws/required-iam-policies.md +++ b/docs/docs-content/clusters/public-cloud/aws/required-iam-policies.md @@ -343,6 +343,7 @@ The four core IAM policies are required for Palette to operate. "ec2:DescribeTags", "ec2:DescribeVolumesModifications", "ec2:DescribeKeyPairs", + "ec2:DeleteNetworkInterface", "iam:AttachGroupPolicy", "iam:CreatePolicy", "iam:CreatePolicyVersion", From 4182f127323787318211c54b0690c0017f5aacc6 Mon Sep 17 00:00:00 2001 From: Ben Radstone <56587332+benradstone@users.noreply.github.com> Date: Wed, 18 Dec 2024 16:48:46 +0000 Subject: [PATCH 2/7] docs: slack notification for release to production (gh-action) (#5083) * docs: slack notif draft for release gh-action * docs: amend slack notif description * docs: add slack notification for all jobs in release * docs: try ubuntu as runs-on * docs: set runs-on tags back * docs: fix URL formatting for slack notif * docs: remove test failure step * docs: add current step failure logic * docs: fix indentation * docs: add some step failures * docs: remove force failure * Apply suggestions from code review Co-authored-by: Karl Cardenas <29551334+karl-cardenas-coding@users.noreply.github.com> --------- Co-authored-by: Karl Cardenas <29551334+karl-cardenas-coding@users.noreply.github.com> --- .github/workflows/release.yaml | 60 ++++++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 3b6a6a32f3..53f582c5bf 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -57,10 +57,13 @@ jobs: node-version: "20" cache: "npm" - - run: npm ci - + - run: | + echo "CURRENT_STEP=npm ci" >> $GITHUB_ENV + npm ci + - name: Build run: | + echo "CURRENT_STEP=Build" >> $GITHUB_ENV touch .env make versions-ci make build-ci @@ -73,10 +76,24 @@ jobs: - name: Upload to AWS run: | + echo "CURRENT_STEP=Upload to AWS" >> $GITHUB_ENV aws s3 sync --cache-control 'public, max-age=604800' --exclude '*.html' --exclude '*.xml' --exclude build/scripts/ build/ s3://docs.spectrocloud.com --delete aws s3 sync --cache-control 'public, max-age=0, s-maxage=604800' build/ s3://docs.spectrocloud.com --delete aws cloudfront create-invalidation --distribution-id ${{ secrets.DISTRIBUTION_ID }} --paths "/*" + - name: Slack Notification on Failure + if: ${{ failure() }} + uses: rtCamp/action-slack-notify@v2.3.2 + env: + SLACK_WEBHOOK: ${{ secrets.SLACK_PRIVATE_TEAM_WEBHOOK }} + SLACK_USERNAME: "spectromate" + SLACK_ICON_EMOJI: ":robot_panic:" + SLACK_COLOR: "danger" + SLACKIFY_MARKDOWN: true + ENABLE_ESCAPES: true + SLACK_MESSAGE: "The self-hosted runner release job for `${{ github.workflow }}` in `${{ github.repository }}` failed at step: `${{ env.CURRENT_STEP }}`. [View details](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})." + + # Use this workflow if you want to use the GitHub-hosted large runner. Useful for scenarios when you need a change to deploy faster than the self-hosted runner can build it. build-large-runner: if: ${{ github.event.inputs.useGitHubHostedLargeRunner == 'true' && github.event_name != 'schedule' }} @@ -98,13 +115,14 @@ jobs: node-version: "20" cache: "npm" - - run: npm ci + - run: | + echo "CURRENT_STEP=npm ci" >> $GITHUB_ENV + npm ci - - name: Versions - run: | - name: Build run: | + echo "CURRENT_STEP=Build" >> $GITHUB_ENV touch .env make versions-ci make build-ci @@ -117,10 +135,22 @@ jobs: - name: Upload to AWS run: | + echo "CURRENT_STEP=Upload to AWS" >> $GITHUB_ENV aws s3 sync --cache-control 'public, max-age=604800' --exclude '*.html' --exclude '*.xml' --exclude build/scripts/ build/ s3://docs.spectrocloud.com --delete aws s3 sync --cache-control 'public, max-age=0, s-maxage=604800' build/ s3://docs.spectrocloud.com --delete aws cloudfront create-invalidation --distribution-id ${{ secrets.DISTRIBUTION_ID }} --paths "/*" + - name: Slack Notification on Failure + if: ${{ failure() }} + uses: rtCamp/action-slack-notify@v2.3.2 + env: + SLACK_WEBHOOK: ${{ secrets.SLACK_PRIVATE_TEAM_WEBHOOK }} + SLACK_USERNAME: "spectromate" + SLACK_ICON_EMOJI: ":robot_panic:" + SLACK_COLOR: "danger" + SLACKIFY_MARKDOWN: true + ENABLE_ESCAPES: true + SLACK_MESSAGE: "The large runner release job for `${{ github.workflow }}` in `${{ github.repository }}` failed at step: `${{ env.CURRENT_STEP }}`. [View details](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})." release: name: "Release" @@ -152,9 +182,25 @@ jobs: cache: "npm" - name: Install dependencies - run: npm ci + run: | + echo "CURRENT_STEP=Install dependencies" >> $GITHUB_ENV + npm ci - name: "release" env: GITHUB_TOKEN: ${{ steps.import-secrets.outputs.VAULT_GITHUB_TOKEN }} - run: npx semantic-release + run: | + echo "CURRENT_STEP=release" >> $GITHUB_ENV + npx semantic-release + + - name: Slack Notification on Failure + if: ${{ failure() }} + uses: rtCamp/action-slack-notify@v2.3.2 + env: + SLACK_WEBHOOK: ${{ secrets.SLACK_PRIVATE_TEAM_WEBHOOK }} + SLACK_USERNAME: "spectromate" + SLACK_ICON_EMOJI: ":robot_panic:" + SLACK_COLOR: "danger" + SLACKIFY_MARKDOWN: true + ENABLE_ESCAPES: true + SLACK_MESSAGE: "The release job for `${{ github.workflow }}` in `${{ github.repository }}` failed at step: `${{ env.CURRENT_STEP }}`. [View details](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})." \ No newline at end of file From 2d9492f0ee4b79c17930fb7d2c604548b2c089c3 Mon Sep 17 00:00:00 2001 From: Amanda Churi Filanowski Date: Thu, 19 Dec 2024 15:02:07 -0500 Subject: [PATCH 3/7] docs: DOC-1518: Getting Started cleanup (#5042) * Initial Getting Started cleanup * Updates to Deploy Cluster Profile page * Minor parallel fix and package.json output update for deploy custom add-on pack tutorial * Updates to scale cluster section * Copying certain AWS changes over to other provider tutorials * Updated filter image for Azure clusters * ci: auto-formatting prettier issues * Optimised images with calibre/image-actions * Fixed ableism with see * ci: auto-formatting prettier issues --------- Co-authored-by: achuribooks Co-authored-by: vault-token-factory-spectrocloud[bot] <133815545+vault-token-factory-spectrocloud[bot]@users.noreply.github.com> --- .../_cluster_observability.mdx | 2 +- ...create-cluster-profile_spacetastic-end.mdx | 2 +- ...eate-cluster-profile_spacetastic-intro.mdx | 2 +- ...rted_deploy-cluster-tf_spacetastic-end.mdx | 6 +- ...ed_deploy-cluster-tf_spacetastic-intro.mdx | 6 +- ...started_deploy-cluster_spacetastic-end.mdx | 8 +-- ...arted_deploy-cluster_spacetastic-intro.mdx | 6 +- ...started_landing-page_spacetastic-intro.mdx | 10 ++-- ...d_scale-secure-cluster_spacetastic-end.mdx | 8 +-- ...scale-secure-cluster_spacetastic-intro.mdx | 8 +-- ..._getting-started_setup_spacetastic-end.mdx | 2 +- ...started_update-cluster_spacetastic-end.mdx | 4 +- ...arted_update-cluster_spacetastic-intro.mdx | 2 +- .../aws/create-cluster-profile.md | 8 +-- .../getting-started/aws/deploy-k8s-cluster.md | 9 +-- .../aws/scale-secure-cluster.md | 22 +++---- .../getting-started/aws/update-k8s-cluster.md | 54 ++++++++--------- .../azure/create-cluster-profile.md | 8 +-- .../azure/deploy-k8s-cluster.md | 9 +-- .../azure/scale-secure-cluster.md | 22 +++---- .../azure/update-k8s-cluster.md | 56 ++++++++---------- .../gcp/create-cluster-profile.md | 8 +-- .../getting-started/gcp/deploy-k8s-cluster.md | 9 +-- .../gcp/scale-secure-cluster.md | 22 +++---- .../getting-started/gcp/update-k8s-cluster.md | 52 +++++++--------- .../vmware/create-cluster-profile.md | 8 +-- .../vmware/deploy-k8s-cluster.md | 9 +-- .../vmware/scale-secure-cluster.md | 22 +++---- .../vmware/update-k8s-cluster.md | 52 +++++++--------- .../registries/oci-registry/add-oci-packs.md | 2 +- .../tutorials/profiles/deploy-pack.md | 4 ++ ...ate-k8s-cluster_apply-frontend-filter.webp | Bin 70898 -> 62428 bytes ...ate-k8s-cluster_apply-frontend-filter.webp | Bin 58888 -> 28636 bytes 33 files changed, 208 insertions(+), 234 deletions(-) diff --git a/_partials/getting-started/_cluster_observability.mdx b/_partials/getting-started/_cluster_observability.mdx index e7b9a211c8..50d056d00c 100644 --- a/_partials/getting-started/_cluster_observability.mdx +++ b/_partials/getting-started/_cluster_observability.mdx @@ -3,7 +3,7 @@ partial_category: getting-started partial_name: cluster-observability --- -As we have seen throughout this tutorial, Palette exposes a set of workload metrics out-of-the-box to help cluster +As we have seen throughout this tutorial, Palette exposes a set of workload metrics out of the box to help cluster administrators better understand the resource utilization of the cluster. The in Palette are a snapshot in time and do not provide alerting capabilities. diff --git a/_partials/getting-started/_getting-started_create-cluster-profile_spacetastic-end.mdx b/_partials/getting-started/_getting-started_create-cluster-profile_spacetastic-end.mdx index c17ee7ba30..d15742ccf5 100644 --- a/_partials/getting-started/_getting-started_create-cluster-profile_spacetastic-end.mdx +++ b/_partials/getting-started/_getting-started_create-cluster-profile_spacetastic-end.mdx @@ -6,7 +6,7 @@ partial_name: spacetastic-create-cluster-profile-end Wren and Kai have created their first Palette cluster profile by following the steps described in this guide. They are in good spirits, as the process has gone smoothly. -> "The visual representation of cluster profiles in Palette is much clearer than our whiteboard." says Kai, glancing +> "The visual representation of cluster profiles in Palette is much clearer than our whiteboard," says Kai, glancing > back at the list they have created. "I can keep track of which versions we are using in production just by reviewing > the profile. What are your thoughts, Wren? Have you remained a Palette skeptic?" > diff --git a/_partials/getting-started/_getting-started_create-cluster-profile_spacetastic-intro.mdx b/_partials/getting-started/_getting-started_create-cluster-profile_spacetastic-intro.mdx index ef45a717c6..8be4d88b4a 100644 --- a/_partials/getting-started/_getting-started_create-cluster-profile_spacetastic-intro.mdx +++ b/_partials/getting-started/_getting-started_create-cluster-profile_spacetastic-intro.mdx @@ -10,7 +10,7 @@ begin to map out all the dependencies of their systems and infrastructure. > making a lot of design decisions myself, as I was Spacetastic's Founding Engineer. It's really interesting to look > back on how much we've built and grown since those days!" > -> Kai smiles and nods. "It's definitely been an out of this world ride!" they say. "I have a similar feeling when I +> Kai smiles and nods. "It's definitely been an out-of-this-world ride!" they say. "I have a similar feeling when I > think about the infrastructure that I built in the early days as Platform Engineer. I will add our infrastructure > layers to your list. This process has the added bonus of giving us a chance to review which dependencies need to be > updated, so Meera, our security expert, will be happy too." diff --git a/_partials/getting-started/_getting-started_deploy-cluster-tf_spacetastic-end.mdx b/_partials/getting-started/_getting-started_deploy-cluster-tf_spacetastic-end.mdx index ebe4ebd208..5e309be1e5 100644 --- a/_partials/getting-started/_getting-started_deploy-cluster-tf_spacetastic-end.mdx +++ b/_partials/getting-started/_getting-started_deploy-cluster-tf_spacetastic-end.mdx @@ -4,11 +4,11 @@ partial_name: spacetastic-deploy-cluster-tf-end --- Wren and Kai have followed this tutorial and have learned how Palette supports IaC through Terraform. They found the -essentials covered to be a great introduction to IaC and gives them the confidence to kick off this initiative at +essentials covered to be a great introduction to IaC, and it gives them the confidence to kick off this initiative at Spacetastic. -> "I'd say that deploying Palette clusters with Terraform is even more convenient than through the UI." says Kai. "The +> "I'd say that deploying Palette clusters with Terraform is even more convenient than through the UI," says Kai. "The > Palette Terraform provider includes a lot of the same functionality that the UI provides." > -> "Yes! I definitely agree. I'm a Terraform novice and I could follow along with this tutorial." says Wren. "This has +> "Yes! I definitely agree. I'm a Terraform novice and I could follow along with this tutorial," says Wren. "This has > definitely inspired me to make our IaC adoption a priority in the medium term future." diff --git a/_partials/getting-started/_getting-started_deploy-cluster-tf_spacetastic-intro.mdx b/_partials/getting-started/_getting-started_deploy-cluster-tf_spacetastic-intro.mdx index 0bb001ce83..7f7ea7f37a 100644 --- a/_partials/getting-started/_getting-started_deploy-cluster-tf_spacetastic-intro.mdx +++ b/_partials/getting-started/_getting-started_deploy-cluster-tf_spacetastic-intro.mdx @@ -4,15 +4,15 @@ partial_name: spacetastic-deploy-cluster-tf-intro --- After following the tutorials in the Getting Started section, the Spacetastic team have been have been impressed with -its capabilities. Wren, Founding Engineer, and Kai, Platform Engineer, have been discussing adopting IaC workflows and +Palette's capabilities. Wren, Founding Engineer, and Kai, Platform Engineer, have been discussing adopting IaC workflows and have been upskilling with Terraform throughout the past year. They are interested in learning if Palette can support IaC workflows too. > "While we're on the topic of platform improvements, it would be great to kick off our adoption of Infrastructure as -> Code at Spacetastic." says Wren. "I've been wanting to roll this out for a while, but we don't have that much in-house +> Code at Spacetastic," says Wren. "I've been wanting to roll this out for a while, but we don't have that much in-house > expertise." > -> "Yes, this would definitely be a big improvement to our processes." says Kai, Platform Engineer. "Some people might +> "Yes, this would definitely be a big improvement to our processes," says Kai, Platform Engineer. "Some people might > think that it slows down the development and release processes, due to the extra code reviews. However, the ability to > revert in the case of an outage more than makes up for this small drop in velocity." > diff --git a/_partials/getting-started/_getting-started_deploy-cluster_spacetastic-end.mdx b/_partials/getting-started/_getting-started_deploy-cluster_spacetastic-end.mdx index eaa1c44596..33659b4a1b 100644 --- a/_partials/getting-started/_getting-started_deploy-cluster_spacetastic-end.mdx +++ b/_partials/getting-started/_getting-started_deploy-cluster_spacetastic-end.mdx @@ -6,17 +6,17 @@ partial_name: spacetastic-deploy-cluster-end Wren and Kai have deployed their first cluster profile by following the steps described in this tutorial. They were impressed by how streamlined the process was and how the cluster profiles provided them with a deployment blueprint. -> "Deploying our first cluster with Palette was intuitive." says Wren. "It's ideal to find an external partner that can +> "Deploying our first cluster with Palette was intuitive," says Wren. "It's ideal to find an external partner that can > take care of our Kubernetes infrastructure and free us up to deliver more educational features. I definitely think > that Palette has the capabilities to take care of all the Kubernetes heavy lifting for us." > -> "I agree with you and I'm glad to hear you're not as skeptical anymore." says Kai, nodding and laughing. "From a +> "I agree with you, and I'm glad to hear you're not as skeptical anymore," says Kai, nodding and laughing. "From a > platform engineering perspective, I can say that cluster profiles will provide us with reliable deployments across > environments and even clouds, so I'm much more confident about our testing and deployment strategy." > -> Meera, Head of Cybersecurity, walks in holding a file. "I've done our security due diligence and I'm happy to report +> Meera, Head of Cybersecurity, walks in holding a file. "I've done our security due diligence, and I'm happy to report > that Spectro Cloud adheres to the highest security standards. I'm happy to approve Palette for use in our > organization." > > "It seems like we've found a great platform that can support us. Let's explore the rest of the Getting Started section -> to understand what else Palette has to offer." says Kai turning back to their monitor. +> to understand what else Palette has to offer," says Kai, turning back to their monitor. diff --git a/_partials/getting-started/_getting-started_deploy-cluster_spacetastic-intro.mdx b/_partials/getting-started/_getting-started_deploy-cluster_spacetastic-intro.mdx index 9792b01100..f47c056334 100644 --- a/_partials/getting-started/_getting-started_deploy-cluster_spacetastic-intro.mdx +++ b/_partials/getting-started/_getting-started_deploy-cluster_spacetastic-intro.mdx @@ -4,12 +4,12 @@ partial_name: spacetastic-deploy-cluster-intro --- After successfully creating their first cluster profile and mapping out their entire technology stack, Wren, Founding -Engineer and Kai, Platform Engineer, continue their Palette onboarding process. They are evaluating Palette as a -potential platform orchestration tool for all the production workloads at Spacetastic, who provide an astronomy +Engineer, and Kai, Platform Engineer, continue their Palette onboarding process. They are evaluating Palette as a +potential platform orchestration tool for all the production workloads at Spacetastic, which provides an astronomy education platform deployed on Kubernetes. > "The Getting Started section is a great way to learn about Palette. The hands-on approach is just what we need to get -> our first cluster deployed." says Kai, scrolling through the Spectro Cloud Docs. "Wren, do you have time to continue +> our first cluster deployed," says Kai, scrolling through the Spectro Cloud Docs. "Wren, do you have time to continue > our onboarding and get our first cluster deployed?" > > Wren sits down next to Kai and sips on a cup of coffee. "Now, we'll get a hands-on feel of the Palette developer diff --git a/_partials/getting-started/_getting-started_landing-page_spacetastic-intro.mdx b/_partials/getting-started/_getting-started_landing-page_spacetastic-intro.mdx index d8f04786e5..d1de5f9ddc 100644 --- a/_partials/getting-started/_getting-started_landing-page_spacetastic-intro.mdx +++ b/_partials/getting-started/_getting-started_landing-page_spacetastic-intro.mdx @@ -4,7 +4,7 @@ partial_name: spacetastic-landing-intro --- Spacetastic Ltd., our fictional example company, is on a mission to teach its users about space. They have assembled a -team of bright minds who are passionate about astronomy and the universe. They are a startup that is gaining popularity, +team of bright minds who are passionate about astronomy and the universe. They are a startup that is gaining popularity as they expand their dashboards and grow their subscribers. Their small team has been in charge of developing new features alongside scaling and maintaining their infrastructure, but they are dedicated to providing the best astronomy education platform on Planet Earth. @@ -12,11 +12,11 @@ education platform on Planet Earth. > "I'm the resident space expert around here!" says Anya, Lead Astrophycist, with a beaming smile. "My mission is to > make astrophysics, the science of space, accessible to everyone." > -> "I'm here to support you and your mission. I build all the dashboards, pages and features that bring your vast space +> "I'm here to support you and your mission. I build all the dashboards, pages, and features that bring your vast space > knowledge to our users in a beautiful visual format!" says Wren, Founding Engineer. > > Kai smiles and nods. "I work closely with both Wren and Anya. As Platform Engineer, I ensure that our platform is -> reliable and scalable for everyone around the world, and beyond!" +> reliable and scalable for everyone around the world and beyond!" > > Meera, Head of Cybersecurity, is the final member of the Spacetastic team. "Let's not forget about the security of our > platform. I make sure that our systems are designed and implemented with security in mind, the true SecDevOps way." @@ -29,7 +29,7 @@ reliability SLA of at least 99% uptime. The following diagram presents an overvi ![Spacetastic system diagram](/getting-started/getting-started_landing_spacetastic-systems.webp) -While the system architecture they have chosen was a great place to start, the team soon face common challenges that +While the system architecture they have chosen was a great place to start, the team soon faced common challenges that many growing organizations encounter with Kubernetes. > Wren hurriedly walks into the office, looking at their phone with a worried expression. "Users are reporting on social @@ -39,6 +39,6 @@ many growing organizations encounter with Kubernetes. > our services without further downtime, as soon as you are able to stabilize our platform." > > "Team, we need to rethink our platform engineering tools. We need a solution that can help us scale and deploy with -> confidence, ultimately supporting the growth of our company." says Kai with a determined look. +> confidence, ultimately supporting the growth of our company," says Kai with a determined look. ![Kubernetes challenges](/getting-started/getting-started_landing_kubernetes-challenges.webp) diff --git a/_partials/getting-started/_getting-started_scale-secure-cluster_spacetastic-end.mdx b/_partials/getting-started/_getting-started_scale-secure-cluster_spacetastic-end.mdx index 7c3ca2973a..5b190079fa 100644 --- a/_partials/getting-started/_getting-started_scale-secure-cluster_spacetastic-end.mdx +++ b/_partials/getting-started/_getting-started_scale-secure-cluster_spacetastic-end.mdx @@ -8,16 +8,16 @@ After going through the steps in the tutorial, Kai is confident in Palette's upg > "What have you found out, Kai?" says Meera walking over to Kai's desk. "Can I rely on Palette when a zero-day > vulnerability comes in?" > -> "Yes, I know how stressful it is when those are reported." says Kai with a sympathetic nod. "I found out that Palette +> "Yes, I know how stressful it is when those are reported," says Kai with a sympathetic nod. "I found out that Palette > has our security covered through their pack updates and scanning capabilities. Relying on this kind of tooling is -> invaluable to security conscious engineers like us." +> invaluable to security-conscious engineers like us." > -> "Excellent! These capabilities will be a great addition to our existing systems at Spacetastic." says Meera with a big +> "Excellent! These capabilities will be a great addition to our existing systems at Spacetastic," says Meera with a big > grin. > > "I'm so glad that we found a platform that can support everyone!" says Kai. "There is so much more to explore though. > I will keep reading through the Getting Started section and find out what additional capabilities Palette provides." > -> "Good thinking, Kai." says Meera, nodding. "We should maximize all of Palette's features now that we have implemented +> "Good thinking, Kai," says Meera, nodding. "We should maximize all of Palette's features now that we have implemented > it in production. We've got big ideas and goals on our company roadmap, so let's find out how Palette can help us > deliver them." diff --git a/_partials/getting-started/_getting-started_scale-secure-cluster_spacetastic-intro.mdx b/_partials/getting-started/_getting-started_scale-secure-cluster_spacetastic-intro.mdx index e9857ffba3..59c6ba611f 100644 --- a/_partials/getting-started/_getting-started_scale-secure-cluster_spacetastic-intro.mdx +++ b/_partials/getting-started/_getting-started_scale-secure-cluster_spacetastic-intro.mdx @@ -9,13 +9,13 @@ platform matures. They must ensure that their systems are patched, upgraded, sca These maintenance tasks must be automated and applied on a schedule, as the entire team wants to focus on providing Spacetastic features. -> "I've read your report on Palette adoption at Spacetastic." says Meera, who provides the security expertise at -> Spacetastic. I was impressed with the ability to roll out updates to all clusters using the same cluster profile. This +> "I've read your report on Palette adoption at Spacetastic," says Meera, who provides the security expertise at +> Spacetastic. "I was impressed with the ability to roll out updates to all clusters using the same cluster profile. This > will streamline our system upgrades and cluster patching. Keeping up with security best practices has never been more > important, now that we are growing faster than ever!" > -> "I agree. No matter how safe our coding practices are, we need to periodically review, patch and upgrade our -> dependencies." says Wren, who leads the engineering team at Spacetastic. +> "I agree. No matter how safe our coding practices are, we need to periodically review, patch, and upgrade our +> dependencies," says Wren, who leads the engineering team at Spacetastic. > > Kai nods, scrolling through the Palette Docs. "Team, Palette has more security and Day-2 operation support than we > have explored so far. I will continue their Getting Started section and report back with my findings." \ No newline at end of file diff --git a/_partials/getting-started/_getting-started_setup_spacetastic-end.mdx b/_partials/getting-started/_getting-started_setup_spacetastic-end.mdx index 8e181053d6..e08f1c3c16 100644 --- a/_partials/getting-started/_getting-started_setup_spacetastic-end.mdx +++ b/_partials/getting-started/_getting-started_setup_spacetastic-end.mdx @@ -6,7 +6,7 @@ partial_name: spacetastic-setup-end After following the detailed Palette setup instructions, the Spacetastic team have added their cloud accounts on the Palette dashboard. They are ready to learn about Palette. -> "The Spectro Cloud team has provided our Palette accounts" says Kai. "I have followed their setup guide and have added +> "The Spectro Cloud team has provided our Palette accounts," says Kai. "I have followed their setup guide and have added > our cloud accounts. I can already tell at a first glance that they offer many Kubernetes customization features." > > Wren joins Kai in looking at the Palette dashboard. "I'm interested to learn more, but I never believe in _magic_ diff --git a/_partials/getting-started/_getting-started_update-cluster_spacetastic-end.mdx b/_partials/getting-started/_getting-started_update-cluster_spacetastic-end.mdx index fc57bcb5f0..a1bbd23cc9 100644 --- a/_partials/getting-started/_getting-started_update-cluster_spacetastic-end.mdx +++ b/_partials/getting-started/_getting-started_update-cluster_spacetastic-end.mdx @@ -6,8 +6,8 @@ partial_name: spacetastic-update-cluster-end Wren and Kai have followed this tutorial and now have a great understanding of what cluster profile updates mean to deployed clusters. They are impressed with Palette's cluster management capabilities. -> "Neat! Palette's cluster profiles allow us to review all updates we apply to our clusters." says Kai. "I can finally +> "Neat! Palette's cluster profiles allow us to review all updates we apply to our clusters," says Kai. "I can finally > take my vacation days, once we can safely maintain our clusters." > -> "Don't I know the feeling?" laughs Wren. "I think we could all use more vacations, quiet weekends and less excitement +> "Don't I know the feeling?" laughs Wren. "I think we could all use more vacations, quiet weekends, and less excitement > when it comes to the Spacetastic platform." diff --git a/_partials/getting-started/_getting-started_update-cluster_spacetastic-intro.mdx b/_partials/getting-started/_getting-started_update-cluster_spacetastic-intro.mdx index 9531a8216f..68eab7bbec 100644 --- a/_partials/getting-started/_getting-started_update-cluster_spacetastic-intro.mdx +++ b/_partials/getting-started/_getting-started_update-cluster_spacetastic-intro.mdx @@ -12,7 +12,7 @@ of the Spacetastic platform and infrastructure. The team have identified the fol > Wren, Founding Engineer, and Kai, Platform Engineer, have been learning and experimenting with Palette. > -> "The streamlined deployment process is just one part of the improvements we've got planned for our platform." says +> "The streamlined deployment process is just one part of the improvements we've got planned for our platform," says > Kai. "I'm interested to learn how Palette's cluster profiles behave when applying updates and other changes to our > clusters." > diff --git a/docs/docs-content/getting-started/aws/create-cluster-profile.md b/docs/docs-content/getting-started/aws/create-cluster-profile.md index 157352ac4f..91880d9e30 100644 --- a/docs/docs-content/getting-started/aws/create-cluster-profile.md +++ b/docs/docs-content/getting-started/aws/create-cluster-profile.md @@ -10,9 +10,9 @@ tags: ["getting-started", "aws"] Palette offers profile-based management for Kubernetes, enabling consistency, repeatability, and operational efficiency across multiple clusters. A cluster profile allows you to customize the cluster infrastructure stack, allowing you to -choose the desired Operating System (OS), Kubernetes, Container Network Interfaces (CNI), Container Storage Interfaces -(CSI). You can further customize the stack with add-on application layers. For more information about cluster profile -types, refer to [Cluster Profiles](../introduction.md#cluster-profiles). +choose the desired Operating System (OS), Kubernetes, Container Network Interfaces (CNIs), and Container Storage +Interfaces (CSIs). You can further customize the stack with add-on application layers. For more information about +cluster profile types, refer to [Cluster Profiles](../introduction.md#cluster-profiles). In this tutorial, you create a full profile directly from the Palette dashboard. Then, you add a layer to your cluster profile by using a [community pack](../../integrations/community_packs.md) to deploy a web application. The concepts you @@ -104,8 +104,6 @@ preset. Replace these values with your own base64 encoded values. The [_hello-universe_](https://github.com/spectrocloud/hello-universe?tab=readme-ov-file#single-load-balancer) repository provides an unencoded token that you can use. -Click on **Confirm Updates**. The manifest editor closes. - Click on **Confirm & Create** to save the manifest. Then, click on **Save Changes** to save this new layer to the cluster profile. diff --git a/docs/docs-content/getting-started/aws/deploy-k8s-cluster.md b/docs/docs-content/getting-started/aws/deploy-k8s-cluster.md index 43384186f6..7b8eea95ae 100644 --- a/docs/docs-content/getting-started/aws/deploy-k8s-cluster.md +++ b/docs/docs-content/getting-started/aws/deploy-k8s-cluster.md @@ -38,7 +38,8 @@ To complete this tutorial, you will need the following. The following steps will guide you through deploying the cluster infrastructure. -Navigate to the left **Main Menu** and select **Clusters**. Click on **Create Cluster**. +Navigate to the left **Main Menu** and select **Clusters**. Click on **Create Cluster**. If there are existing clusters, +choose **Add New Cluster**. ![Palette clusters overview page](/getting-started/getting-started_deploy-k8s-cluster_new_cluster.webp) @@ -106,9 +107,9 @@ Navigate to the left **Main Menu** and select **Clusters**. ![Update the cluster](/getting-started/aws/getting-started_deploy-k8s-cluster_create_cluster.webp) -The cluster deployment process can take 15 to 30 min. The deployment time varies depending on the cloud provider, -cluster profile, cluster size, and the node pool configurations provided. You can learn more about the deployment -progress by reviewing the event log. Click on the **Events** tab to view the log. +The cluster deployment process can take 15 to 30 minutes. Deployment time varies depending on the cloud provider, +cluster profile, cluster size, and node pool configurations provided. You can learn more about the deployment progress +by reviewing the event log. Choose your cluster and select the **Events** tab to view the log. ![Update the cluster](/getting-started/aws/getting-started_deploy-k8s-cluster_event_log.webp) diff --git a/docs/docs-content/getting-started/aws/scale-secure-cluster.md b/docs/docs-content/getting-started/aws/scale-secure-cluster.md index 8d1715559d..0f5bfa7d1a 100644 --- a/docs/docs-content/getting-started/aws/scale-secure-cluster.md +++ b/docs/docs-content/getting-started/aws/scale-secure-cluster.md @@ -10,8 +10,8 @@ tags: ["getting-started", "aws", "tutorial"] Palette has in-built features to help with the automation of Day-2 operations. Upgrading and maintaining a deployed cluster is typically complex because you need to consider any possible impact on service availability. Palette provides -out-of-the-box functionality for upgrades, observability, granular Role Based Access Control (RBAC), backup and security -scans. +out-of-the-box functionality for upgrades, observability, granular Role Based Access Control (RBAC), backup, and +security scans. This tutorial will teach you how to use the Palette UI to perform scale and maintenance tasks on your clusters. You will learn how to create Palette projects and teams, import a cluster profile, safely upgrade the Kubernetes version of a @@ -33,9 +33,9 @@ Additionally, you should install kubectl locally. Use the Kubernetes ## Create Palette Projects Palette projects help you organize and manage cluster resources, providing logical groupings. They also allow you to -manage user access control through Role Based Access Control (RBAC). You can assign users and teams with specific roles -to specific projects. All resources created within a project are scoped to that project and only available to that -project, but a tenant can have multiple projects. +manage user access control through RBAC. You can assign users and teams with specific roles to specific projects. All +resources created within a project are scoped to that project and only available to that project, but a tenant can have +multiple projects. Log in to [Palette](https://console.spectrocloud.com). @@ -407,18 +407,18 @@ Switch back to Palette in your web browser. Navigate to the left **Main Menu** a cluster profile deployed to your cluster, named `aws-profile`. Ensure that the **1.1.0** version is selected. Click on the **hellouniverse 1.2.0** layer. The manifest editor appears. Set the -`manifests.hello-universe.ui.useTolerations` field on line 20 to `true`. Then, set the -`manifests.hello-universe.ui.effect` field on line 22 to `NoExecute`. This toleration describes that the UI pods of -Hello Universe will tolerate the taint with the key `app`, value `ui` and effect `NoExecute`. The tolerations of the UI +`manifests.hello-universe.ui.useTolerations` field on line 19 to `true`. Then, set the +`manifests.hello-universe.ui.effect` field on line 21 to `NoExecute`. This toleration describes that the UI pods of +Hello Universe will tolerate the taint with the effect `NoExecute`, key `app`, and value `ui`. The tolerations of the UI pods should be as below. ```yaml ui: useTolerations: true tolerations: - effect: NoExecute - key: app - value: ui + effect: NoExecute + key: app + value: ui ``` Click on **Confirm Updates**. The manifest editor closes. Then, click on **Save Changes** to persist your changes. diff --git a/docs/docs-content/getting-started/aws/update-k8s-cluster.md b/docs/docs-content/getting-started/aws/update-k8s-cluster.md index 2368860d3f..71fd1f63ad 100644 --- a/docs/docs-content/getting-started/aws/update-k8s-cluster.md +++ b/docs/docs-content/getting-started/aws/update-k8s-cluster.md @@ -64,17 +64,12 @@ panel. ![Image that shows how to add a cluster tag](/getting-started/aws/getting-started_update-k8s-cluster_add-service-tag.webp) -Navigate to the left **Main Menu** and select **Clusters** to view your deployed clusters. Click on **Add Filter**, then -select the **Add custom filter** option. - -Use the drop-down boxes to fill in the values of the filter. Select **Tags** in the left-hand **drop-down Menu**. Select -**is** in the middle **drop-down Menu**. Fill in **service:hello-universe-frontend** in the right-hand input box. - -Click on **Apply Filter**. +Navigate to the left **Main Menu** and select **Clusters** to view your deployed clusters. Click the **filter** icon to +expand the **All Filters** pane, and below **Tags**, enter **service:hello-universe-frontend**. ![Image that shows how to add a frontend service filter](/getting-started/aws/getting-started_update-k8s-cluster_apply-frontend-filter.webp) -Once you apply the filter, only the `aws-cluster` with this tag is displayed. +Only the `aws-cluster` with this tag is displayed. ## Version Cluster Profiles @@ -117,8 +112,7 @@ Click on **Confirm & Create**. The manifest editor closes. Click on **Save Changes** to finish the configuration of this cluster profile version. -Navigate to the left **Main Menu** and select **Clusters**. Filter for the cluster with the -**service:hello-universe-frontend** tag. Select it to view its **Overview** tab. +Navigate to the left **Main Menu** and select **Clusters**. Select the `aws-cluster` to view its **Overview** tab. Select the **Profile** tab of this cluster. You can select a new version of your cluster profile by using the version dropdown. @@ -138,7 +132,7 @@ backups before you make any cluster profile version changes in your production e ::: Palette now makes the required changes to your cluster according to the specifications of the configured cluster profile -version. Once your changes have completed, Palette marks your layers with the green status indicator. The Kubecost pack +version. Once your changes are applied, Palette marks your layers with the green status indicator. The Kubecost pack will be successfully deployed. ![Image that shows completed cluster profile updates](/getting-started/aws/getting-started_update-k8s-cluster_completed-cluster-updates.webp) @@ -181,17 +175,16 @@ the time to recovery in the event of an incident. The process to roll back to a previous version is identical to the process for applying a new version. -Navigate to the left **Main Menu** and select **Clusters**. Filter for the cluster with the -**service:hello-universe-frontend** tag. Select it to view its **Overview** tab. +Navigate to the left **Main Menu** and select **Clusters**. Select the `aws-cluster` to view its **Overview** tab. Select the **Profile** tab. This cluster is currently deployed using cluster profile version **1.1.0**. Select the -option **1.0.0** in the version dropdown. This process is the reverse of what you have done in the previous section, +option **1.0.0** in the version dropdown. This process is the reverse of what you did in the previous section, [Version Cluster Profiles](#version-cluster-profiles). Click on **Save** to confirm your changes. Palette now makes the changes required for the cluster to return to the state specified in version **1.0.0** of your -cluster profile. Once your changes have completed, Palette marks your layers with the green status indicator. +cluster profile. Once your changes are applied, Palette marks your layers with the green status indicator. ![Cluster details page with service URL highlighted](/getting-started/aws/getting-started_deploy-k8s-cluster_service_url.webp) @@ -203,11 +196,10 @@ choose to apply your changes at a convenient time. The previous state of the cluster profile will not be saved once it is overwritten. -Navigate to the left **Main Menu** and select **Clusters**. Filter for the cluster with the tag -**service:hello-universe-frontend**. Select it to view its **Overview** tab. +Navigate to the left **Main Menu** and select **Clusters**. Select the `aws-cluster` to view its **Overview** tab. -Select the **Profile** tab. Then, select the **hello-universe** pack. Change the `replicas` field to `2` on line `15`. -Click on **Save**. The editor closes. +Select the **Profile** tab. Then, select the **hello-universe** pack. Change the `replicas` field on line `15` to `2` +and **Save** your changes. The editor is closed. This cluster now contains an override over its cluster profile. Palette uses the configuration you have just provided for the single cluster over its cluster profile and begins making the appropriate changes. @@ -215,20 +207,20 @@ for the single cluster over its cluster profile and begins making the appropriat Once these changes are complete, select the **Workloads** tab. Then, select the **hello-universe** namespace. Two **ui** pods are available, instead of the one specified by your cluster profile. Your override has been successfully -applied. +applied. If your changes are not displayed, use the **refresh** icon. Navigate to the left **Main Menu** and select **Profiles** to view the cluster profile page. Find the cluster profile corresponding to your _hello-universe-frontend_ cluster. It is named `aws-profile`. Click on it to view its details. Select **1.0.0** in the version dropdown. -Select the **hello-universe** pack. The editor appears. Change the `replicas` field to `3` on line `15`. Click on -**Confirm Updates**. The editor closes. +Select the **hello-universe** pack. Change the `replicas` field on line `15` to `3`. Click on **Confirm Updates**. The +editor is closed. Click on **Save Changes** to confirm the changes you have made to your profile. -Navigate to the left **Main Menu** and select **Clusters**. Filter for the with the **service:hello-universe-frontend** -tag. Palette indicates that the cluster associated with the cluster profile you updated has updates available. +Navigate to the left **Main Menu** and select **Clusters**. Palette indicates that the cluster associated with the +cluster profile you edited has updates available. ![Image that shows the pending updates ](/getting-started/aws/getting-started_update-k8s-cluster_pending-update-clusters-view.webp) @@ -236,9 +228,10 @@ Select this cluster to open its **Overview** tab. Click on **Updates** to begin ![Image that shows the Updates button](/getting-started/aws/getting-started_update-k8s-cluster_updates-available-button-cluster-overview.webp) -A dialog appears which shows the changes made in this update. Review the changes and ensure the only change is the -`replicas` field value. The pending update removes your cluster override and sets the `replicas` field to `3`. At this -point, you can choose to apply the pending changes or keep it by modifying the right-hand side of the dialog. +A dialog appears, showing a summary of packs changed. Select **Review changes in Editor** to review your changes. Ensure +the only change is the `replicas` field value. The pending update removes your cluster override and sets the `replicas` +field to `3`. At this point, you can choose to apply the pending changes or make additional changes by modifying the +**Pending Configuration** pane on the right side of the editor. ![Image that shows the available updates dialog ](/getting-started/aws/getting-started_update-k8s-cluster_available-updates-dialog.webp) @@ -247,7 +240,8 @@ Click on **Apply Changes** once you have finished reviewing your changes. Palette updates your cluster according to cluster profile specifications. Once these changes are complete, select the **Workloads** tab. Then, select the **hello-universe** namespace. -Three **ui** pods are available. The cluster profile update is now reflected by your cluster. +Three **ui** pods are available. The cluster profile update is now reflected by your cluster. If your changes are not +displayed, use the **refresh** icon. ## Cluster Observability @@ -282,8 +276,8 @@ selection to remove the cluster profile. ## Wrap-Up In this tutorial, you created deployed cluster profile updates. After the cluster was deployed to AWS, you updated the -cluster profile through three different methods: create a new cluster profile version, update a cluster profile in -place, and cluster profile overrides. After you made your changes, the Hello Universe application functioned as a +cluster profile through three different methods: creating a new cluster profile version, updating a cluster profile in +place, and using cluster profile overrides. After you made your changes, the Hello Universe application functioned as a three-tier application with a REST API backend server. Cluster profiles provide consistency during the cluster creation process, as well as when maintaining your clusters. diff --git a/docs/docs-content/getting-started/azure/create-cluster-profile.md b/docs/docs-content/getting-started/azure/create-cluster-profile.md index 020446c937..3a49df8a92 100644 --- a/docs/docs-content/getting-started/azure/create-cluster-profile.md +++ b/docs/docs-content/getting-started/azure/create-cluster-profile.md @@ -10,9 +10,9 @@ tags: ["getting-started", "azure"] Palette offers profile-based management for Kubernetes, enabling consistency, repeatability, and operational efficiency across multiple clusters. A cluster profile allows you to customize the cluster infrastructure stack, allowing you to -choose the desired Operating System (OS), Kubernetes, Container Network Interfaces (CNI), Container Storage Interfaces -(CSI). You can further customize the stack with add-on application layers. For more information about cluster profile -types, refer to [Cluster Profiles](../introduction.md#cluster-profiles). +choose the desired Operating System (OS), Kubernetes, Container Network Interfaces (CNIs), and Container Storage +Interfaces (CSIs). You can further customize the stack with add-on application layers. For more information about +cluster profile types, refer to [Cluster Profiles](../introduction.md#cluster-profiles). In this tutorial, you create a full profile directly from the Palette dashboard. Then, you add a layer to your cluster profile by using a [community pack](../../integrations/community_packs.md) to deploy a web application. The concepts you @@ -103,8 +103,6 @@ preset. Replace these values with your own base64 encoded values. The [_hello-universe_](https://github.com/spectrocloud/hello-universe?tab=readme-ov-file#single-load-balancer) repository provides an unencoded token that you can use. -Click on **Confirm Updates**. The manifest editor closes. - Click on **Confirm & Create** to save the manifest. Then, click on **Save Changes** to save this new layer to the cluster profile. diff --git a/docs/docs-content/getting-started/azure/deploy-k8s-cluster.md b/docs/docs-content/getting-started/azure/deploy-k8s-cluster.md index 4f6aae3c10..dcdeba215f 100644 --- a/docs/docs-content/getting-started/azure/deploy-k8s-cluster.md +++ b/docs/docs-content/getting-started/azure/deploy-k8s-cluster.md @@ -38,7 +38,8 @@ To complete this tutorial, you will need the following. The following steps will guide you through deploying the cluster infrastructure. -Navigate to the left **Main Menu** and select **Clusters**. Click on **Create Cluster**. +Navigate to the left **Main Menu** and select **Clusters**. Click on **Create Cluster**. If there are existing clusters, +choose **Add New Cluster**. ![Palette clusters overview page](/getting-started/getting-started_deploy-k8s-cluster_new_cluster.webp) @@ -105,9 +106,9 @@ Navigate to the left **Main Menu** and select **Clusters**. ![Update the cluster](/getting-started/azure/getting-started_deploy-k8s-cluster_create_cluster.webp) -The cluster deployment process can take 15 to 30 min. The deployment time varies depending on the cloud provider, -cluster profile, cluster size, and the node pool configurations provided. You can learn more about the deployment -progress by reviewing the event log. Click on the **Events** tab to view the log. +The cluster deployment process can take 15 to 30 minutes. Deployment time varies depending on the cloud provider, +cluster profile, cluster size, and node pool configurations provided. You can learn more about the deployment progress +by reviewing the event log. Choose your cluster and select the **Events** tab to view the log. ![Update the cluster](/getting-started/azure/getting-started_deploy-k8s-cluster_event_log.webp) diff --git a/docs/docs-content/getting-started/azure/scale-secure-cluster.md b/docs/docs-content/getting-started/azure/scale-secure-cluster.md index d31fda731e..e19df548a0 100644 --- a/docs/docs-content/getting-started/azure/scale-secure-cluster.md +++ b/docs/docs-content/getting-started/azure/scale-secure-cluster.md @@ -10,8 +10,8 @@ tags: ["getting-started", "azure", "tutorial"] Palette has in-built features to help with the automation of Day-2 operations. Upgrading and maintaining a deployed cluster is typically complex because you need to consider any possible impact on service availability. Palette provides -out-of-the-box functionality for upgrades, observability, granular Role Based Access Control (RBAC), backup and security -scans. +out-of-the-box functionality for upgrades, observability, granular Role Based Access Control (RBAC), backup, and +security scans. This tutorial will teach you how to use the Palette UI to perform scale and maintenance tasks on your clusters. You will learn how to create Palette projects and teams, import a cluster profile, safely upgrade the Kubernetes version of a @@ -33,9 +33,9 @@ Additionally, you should install kubectl locally. Use the Kubernetes ## Create Palette Projects Palette projects help you organize and manage cluster resources, providing logical groupings. They also allow you to -manage user access control through Role Based Access Control (RBAC). You can assign users and teams with specific roles -to specific projects. All resources created within a project are scoped to that project and only available to that -project, but a tenant can have multiple projects. +manage user access control through RBAC. You can assign users and teams with specific roles to specific projects. All +resources created within a project are scoped to that project and only available to that project, but a tenant can have +multiple projects. Log in to [Palette](https://console.spectrocloud.com). @@ -408,18 +408,18 @@ Switch back to Palette in your web browser. Navigate to the left **Main Menu** a cluster profile deployed to your cluster, named `azure-profile`. Ensure that the **1.1.0** version is selected. Click on the **hellouniverse 1.2.0** layer. The manifest editor appears. Set the -`manifests.hello-universe.ui.useTolerations` field on line 20 to `true`. Then, set the -`manifests.hello-universe.ui.effect` field on line 22 to `NoExecute`. This toleration describes that the UI pods of -Hello Universe will tolerate the taint with the key `app`, value `ui` and effect `NoExecute`. The tolerations of the UI +`manifests.hello-universe.ui.useTolerations` field on line 19 to `true`. Then, set the +`manifests.hello-universe.ui.effect` field on line 21 to `NoExecute`. This toleration describes that the UI pods of +Hello Universe will tolerate the taint with the effect `NoExecute`, key `app`, and value `ui`. The tolerations of the UI pods should be as below. ```yaml ui: useTolerations: true tolerations: - effect: NoExecute - key: app - value: ui + effect: NoExecute + key: app + value: ui ``` Click on **Confirm Updates**. The manifest editor closes. Then, click on **Save Changes** to persist your changes. diff --git a/docs/docs-content/getting-started/azure/update-k8s-cluster.md b/docs/docs-content/getting-started/azure/update-k8s-cluster.md index 13d87a3c66..5db7bf1408 100644 --- a/docs/docs-content/getting-started/azure/update-k8s-cluster.md +++ b/docs/docs-content/getting-started/azure/update-k8s-cluster.md @@ -64,17 +64,12 @@ panel. ![Image that shows how to add a cluster tag](/getting-started/azure/getting-started_update-k8s-cluster_add-service-tag.webp) -Navigate to the left **Main Menu** and select **Clusters** to view your deployed clusters. Click on **Add Filter**, then -select the **Add custom filter** option. - -Use the drop-down boxes to fill in the values of the filter. Select **Tags** in the left-hand **drop-down Menu**. Select -**is** in the middle **drop-down Menu**. Fill in **service:hello-universe-frontend** in the right-hand input box. - -Click on **Apply Filter**. +Navigate to the left **Main Menu** and select **Clusters** to view your deployed clusters. Click the **filter** icon to +expand the **All Filters** pane, and below **Tags**, enter **service:hello-universe-frontend**. ![Image that shows how to add a frontend service filter](/getting-started/azure/getting-started_update-k8s-cluster_apply-frontend-filter.webp) -Once you apply the filter, only the `azure-cluster` with this tag is displayed. +Only the `azure-cluster` with this tag is displayed. ## Version Cluster Profiles @@ -117,8 +112,7 @@ Click on **Confirm & Create**. The manifest editor closes. Click on **Save Changes** to finish the configuration of this cluster profile version. -Navigate to the left **Main Menu** and select **Clusters**. Filter for the cluster with the -**service:hello-universe-frontend** tag. Select it to view its **Overview** tab. +Navigate to the left **Main Menu** and select **Clusters**. Select the `azure-cluster` to view its **Overview** tab. Select the **Profile** tab of this cluster. You can select a new version of your cluster profile by using the version dropdown. @@ -138,7 +132,7 @@ backups before you make any cluster profile version changes in your production e ::: Palette now makes the required changes to your cluster according to the specifications of the configured cluster profile -version. Once your changes have completed, Palette marks your layers with the green status indicator. The Kubecost pack +version. Once your changes are applied, Palette marks your layers with the green status indicator. The Kubecost pack will be successfully deployed. ![Image that shows completed cluster profile updates](/getting-started/azure/getting-started_update-k8s-cluster_completed-cluster-updates.webp) @@ -182,17 +176,16 @@ the time to recovery in the event of an incident. The process to roll back to a previous version is identical to the process for applying a new version. -Navigate to the left **Main Menu** and select **Clusters**. Filter for the cluster with the -**service:hello-universe-frontend** tag. Select it to view its **Overview** tab. +Navigate to the left **Main Menu** and select **Clusters**. Select the `azure-cluster` to view its **Overview** tab. Select the **Profile** tab. This cluster is currently deployed using cluster profile version **1.1.0**. Select the -option **1.0.0** in the version dropdown. This process is the reverse of what you have done in the previous section, +option **1.0.0** in the version dropdown. This process is the reverse of what you did in the previous section, [Version Cluster Profiles](#version-cluster-profiles). Click on **Save** to confirm your changes. Palette now makes the changes required for the cluster to return to the state specified in version **1.0.0** of your -cluster profile. Once your changes have completed, Palette marks your layers with the green status indicator. +cluster profile. Once your changes are applied, Palette marks your layers with the green status indicator. ![Cluster details page with service URL highlighted](/getting-started/azure/getting-started_update-k8s-cluster_rollback.webp) @@ -204,11 +197,10 @@ choose to apply your changes at a convenient time. The previous state of the cluster profile will not be saved once it is overwritten. -Navigate to the left **Main Menu** and select **Clusters**. Filter for the cluster with the tag -**service:hello-universe-frontend**. Select it to view its **Overview** tab. +Navigate to the left **Main Menu** and select **Clusters**. Select the `azure-cluster` to view its **Overview** tab. -Select the **Profile** tab. Then, select the **hello-universe** pack. Change the `replicas` field to `2` on line `15`. -Click on **Save**. The editor closes. +Select the **Profile** tab. Then, select the **hello-universe** pack. Change the `replicas` field on line `15` to `2` +and **Save** your changes. The editor is closed. This cluster now contains an override over its cluster profile. Palette uses the configuration you have just provided for the single cluster over its cluster profile and begins making the appropriate changes. @@ -216,20 +208,20 @@ for the single cluster over its cluster profile and begins making the appropriat Once these changes are complete, select the **Workloads** tab. Then, select the **hello-universe** namespace. Two **ui** pods are available, instead of the one specified by your cluster profile. Your override has been successfully -applied. +applied. If your changes are not displayed, use the **refresh** icon. Navigate to the left **Main Menu** and select **Profiles** to view the cluster profile page. Find the cluster profile corresponding to your _hello-universe-frontend_ cluster, named `azure-profile`. Click on it to view its details. Select **1.0.0** in the version dropdown. -Select the **hello-universe** pack. The editor appears. Change the `replicas` field to `3` on line `15`. Click on -**Confirm Updates**. The editor closes. +Select the **hello-universe** pack. Change the `replicas` field on line `15` to `3`. Click on **Confirm Updates**. The +editor is closed. Click on **Save Changes** to confirm the changes you have made to your profile. -Navigate to the left **Main Menu** and select **Clusters**. Filter for the with the **service:hello-universe-frontend** -tag. Palette indicates that the cluster associated with the cluster profile you updated has updates available. +Navigate to the left **Main Menu** and select **Clusters**. Palette indicates that the cluster associated with the +cluster profile you edited has updates available. ![Image that shows the pending updates ](/getting-started/azure/getting-started_update-k8s-cluster_pending-update-clusters-view.webp) @@ -237,11 +229,10 @@ Select this cluster to open its **Overview** tab. Click on **Updates** to begin ![Image that shows the Updates button](/getting-started/azure/getting-started_update-k8s-cluster_updates-available-button-cluster-overview.webp) -A dialog appears which shows the changes made in this update. Click on **Review changes in Editor**. As previously, -Palette displays the changes, with the current configuration on the left and the incoming configuration on the right. - -Review the changes and ensure the only change is the `replicas` field value. You can choose to maintain your cluster -override or apply the incoming cluster profile update. +A dialog appears, showing a summary of packs changed. Select **Review changes in Editor** to review your changes. Ensure +the only change is the `replicas` field value. The pending update removes your cluster override and sets the `replicas` +field to `3`. At this point, you can choose to apply the pending changes or make additional changes by modifying the +**Pending Configuration** pane on the right side of the editor. ![Image that shows the available updates dialog ](/getting-started/azure/getting-started_update-k8s-cluster_available-updates-dialog.webp) @@ -250,7 +241,8 @@ Click on **Apply Changes** once you have finished reviewing your changes. This r Palette updates your cluster according to cluster profile specifications. Once these changes are complete, select the **Workloads** tab. Then, select the **hello-universe** namespace. -Three **ui** pods are available. The cluster profile update is now reflected by your cluster. +Three **ui** pods are available. The cluster profile update is now reflected by your cluster. If your changes are not +displayed, use the **refresh** icon. ## Cluster Observability @@ -285,8 +277,8 @@ selection to remove the cluster profile. ## Wrap-Up In this tutorial, you created deployed cluster profile updates. After the cluster was deployed to Azure, you updated the -cluster profile through three different methods: create a new cluster profile version, update a cluster profile in -place, and cluster profile overrides. After you made your changes, the Hello Universe application functioned as a +cluster profile through three different methods: creating a new cluster profile version, updating a cluster profile in +place, and using cluster profile overrides. After you made your changes, the Hello Universe application functioned as a three-tier application with a REST API backend server. Cluster profiles provide consistency during the cluster creation process, as well as when maintaining your clusters. diff --git a/docs/docs-content/getting-started/gcp/create-cluster-profile.md b/docs/docs-content/getting-started/gcp/create-cluster-profile.md index a63d7c82de..b1c069f7f8 100644 --- a/docs/docs-content/getting-started/gcp/create-cluster-profile.md +++ b/docs/docs-content/getting-started/gcp/create-cluster-profile.md @@ -10,9 +10,9 @@ tags: ["getting-started", "gcp"] Palette offers profile-based management for Kubernetes, enabling consistency, repeatability, and operational efficiency across multiple clusters. A cluster profile allows you to customize the cluster infrastructure stack, allowing you to -choose the desired Operating System (OS), Kubernetes, Container Network Interfaces (CNI), Container Storage Interfaces -(CSI). You can further customize the stack with add-on application layers. For more information about cluster profile -types, refer to [Cluster Profiles](../introduction.md#cluster-profiles). +choose the desired Operating System (OS), Kubernetes, Container Network Interfaces (CNIs), and Container Storage +Interfaces (CSIs). You can further customize the stack with add-on application layers. For more information about +cluster profile types, refer to [Cluster Profiles](../introduction.md#cluster-profiles). In this tutorial, you create a full profile directly from the Palette dashboard. Then, you add a layer to your cluster profile by using a [community pack](../../integrations/community_packs.md) to deploy a web application. The concepts you @@ -104,8 +104,6 @@ preset. Replace these values with your own base64 encoded values. The [_hello-universe_](https://github.com/spectrocloud/hello-universe?tab=readme-ov-file#single-load-balancer) repository provides an unencoded token that you can use. -Click on **Confirm Updates**. The manifest editor closes. - Click on **Confirm & Create** to save the manifest. Then, click on **Save Changes** to save this new layer to the cluster profile. diff --git a/docs/docs-content/getting-started/gcp/deploy-k8s-cluster.md b/docs/docs-content/getting-started/gcp/deploy-k8s-cluster.md index 3ed182ef53..b4a72d47e5 100644 --- a/docs/docs-content/getting-started/gcp/deploy-k8s-cluster.md +++ b/docs/docs-content/getting-started/gcp/deploy-k8s-cluster.md @@ -38,7 +38,8 @@ To complete this tutorial, you will need the following. The following steps will guide you through deploying the cluster infrastructure. -Navigate to the left **Main Menu** and select **Clusters**. Click on **Create Cluster**. +Navigate to the left **Main Menu** and select **Clusters**. Click on **Create Cluster**. If there are existing clusters, +choose **Add New Cluster**. ![Palette clusters overview page](/getting-started/getting-started_deploy-k8s-cluster_new_cluster.webp) @@ -106,9 +107,9 @@ Navigate to the left **Main Menu** and select **Clusters**. ![Update the cluster](/getting-started/gcp/getting-started_deploy-k8s-cluster_new_cluster.webp) -The cluster deployment process can take 15 to 30 min. The deployment time varies depending on the cloud provider, -cluster profile, cluster size, and the node pool configurations provided. You can learn more about the deployment -progress by reviewing the event log. Click on the **Events** tab to view the log. +The cluster deployment process can take 15 to 30 minutes. Deployment time varies depending on the cloud provider, +cluster profile, cluster size, and node pool configurations provided. You can learn more about the deployment progress +by reviewing the event log. Choose your cluster and select the **Events** tab to view the log. ![Update the cluster](/getting-started/gcp/getting-started_deploy-k8s-cluster_event_log.webp) diff --git a/docs/docs-content/getting-started/gcp/scale-secure-cluster.md b/docs/docs-content/getting-started/gcp/scale-secure-cluster.md index 9154008d0a..e0aae63af2 100644 --- a/docs/docs-content/getting-started/gcp/scale-secure-cluster.md +++ b/docs/docs-content/getting-started/gcp/scale-secure-cluster.md @@ -10,8 +10,8 @@ tags: ["getting-started", "gcp", "tutorial"] Palette has in-built features to help with the automation of Day-2 operations. Upgrading and maintaining a deployed cluster is typically complex because you need to consider any possible impact on service availability. Palette provides -out-of-the-box functionality for upgrades, observability, granular Role Based Access Control (RBAC), backup and security -scans. +out-of-the-box functionality for upgrades, observability, granular Role Based Access Control (RBAC), backup, and +security scans. This tutorial will teach you how to use the Palette UI to perform scale and maintenance tasks on your clusters. You will learn how to create Palette projects and teams, import a cluster profile, safely upgrade the Kubernetes version of a @@ -33,9 +33,9 @@ Additionally, you should install kubectl locally. Use the Kubernetes ## Create Palette Projects Palette projects help you organize and manage cluster resources, providing logical groupings. They also allow you to -manage user access control through Role Based Access Control (RBAC). You can assign users and teams with specific roles -to specific projects. All resources created within a project are scoped to that project and only available to that -project, but a tenant can have multiple projects. +manage user access control through RBAC. You can assign users and teams with specific roles to specific projects. All +resources created within a project are scoped to that project and only available to that project, but a tenant can have +multiple projects. Log in to [Palette](https://console.spectrocloud.com). @@ -408,18 +408,18 @@ Switch back to Palette in your web browser. Navigate to the left **Main Menu** a cluster profile deployed to your cluster, named `gcp-profile`. Ensure that the **1.1.0** version is selected. Click on the **hellouniverse 1.2.0** layer. The manifest editor appears. Set the -`manifests.hello-universe.ui.useTolerations` field on line 20 to `true`. Then, set the -`manifests.hello-universe.ui.effect` field on line 22 to `NoExecute`. This toleration describes that the UI pods of -Hello Universe will tolerate the taint with the key `app`, value `ui` and effect `NoExecute`. The tolerations of the UI +`manifests.hello-universe.ui.useTolerations` field on line 19 to `true`. Then, set the +`manifests.hello-universe.ui.effect` field on line 21 to `NoExecute`. This toleration describes that the UI pods of +Hello Universe will tolerate the taint with the effect `NoExecute`, key `app`, and value `ui`. The tolerations of the UI pods should be as below. ```yaml ui: useTolerations: true tolerations: - effect: NoExecute - key: app - value: ui + effect: NoExecute + key: app + value: ui ``` Click on **Confirm Updates**. The manifest editor closes. Then, click on **Save Changes** to persist your changes. diff --git a/docs/docs-content/getting-started/gcp/update-k8s-cluster.md b/docs/docs-content/getting-started/gcp/update-k8s-cluster.md index 2478a4e09c..b23b67c619 100644 --- a/docs/docs-content/getting-started/gcp/update-k8s-cluster.md +++ b/docs/docs-content/getting-started/gcp/update-k8s-cluster.md @@ -64,17 +64,12 @@ panel. ![Image that shows how to add a cluster tag](/getting-started/gcp/getting-started_update-k8s-cluster_add-service-tag.webp) -Navigate to the left **Main Menu** and select **Clusters** to view your deployed clusters. Click on **Add Filter**, then -select the **Add custom filter** option. - -Use the drop-down boxes to fill in the values of the filter. Select **Tags** in the left-hand **drop-down Menu**. Select -**is** in the middle **drop-down Menu**. Fill in **service:hello-universe-frontend** in the right-hand input box. - -Click on **Apply Filter**. +Navigate to the left **Main Menu** and select **Clusters** to view your deployed clusters. Click the **filter** icon to +expand the **All Filters** pane, and below **Tags**, enter **service:hello-universe-frontend**. ![Image that shows how to add a frontend service filter](/getting-started/gcp/getting-started_update-k8s-cluster_apply-frontend-filter.webp) -Once you apply the filter, only the `gcp-cluster` with this tag is displayed. +Only the `gcp-cluster` with this tag is displayed. ## Version Cluster Profiles @@ -117,8 +112,7 @@ Click on **Confirm & Create**. The manifest editor closes. Click on **Save Changes** to finish the configuration of this cluster profile version. -Navigate to the left **Main Menu** and select **Clusters**. Filter for the cluster with the -**service:hello-universe-frontend** tag. Select it to view its **Overview** tab. +Navigate to the left **Main Menu** and select **Clusters**. Select the `gcp-cluster` to view its **Overview** tab. Select the **Profile** tab of this cluster. You can select a new version of your cluster profile by using the version dropdown. @@ -138,7 +132,7 @@ backups before you make any cluster profile version changes in your production e ::: Palette now makes the required changes to your cluster according to the specifications of the configured cluster profile -version. Once your changes have completed, Palette marks your layers with the green status indicator. The Kubecost pack +version. Once your changes are applied, Palette marks your layers with the green status indicator. The Kubecost pack will be successfully deployed. ![Image that shows completed cluster profile updates](/getting-started/gcp/getting-started_update-k8s-cluster_completed-cluster-updates.webp) @@ -181,17 +175,16 @@ the time to recovery in the event of an incident. The process to roll back to a previous version is identical to the process for applying a new version. -Navigate to the left **Main Menu** and select **Clusters**. Filter for the cluster with the -**service:hello-universe-frontend** tag. Select it to view its **Overview** tab. +Navigate to the left **Main Menu** and select **Clusters**. Select the `gcp-cluster` to view its **Overview** tab. Select the **Profile** tab. This cluster is currently deployed using cluster profile version **1.1.0**. Select the -option **1.0.0** in the version dropdown. This process is the reverse of what you have done in the previous section, +option **1.0.0** in the version dropdown. This process is the reverse of what you did in the previous section, [Version Cluster Profiles](#version-cluster-profiles). Click on **Save** to confirm your changes. Palette now makes the changes required for the cluster to return to the state specified in version **1.0.0** of your -cluster profile. Once your changes have completed, Palette marks your layers with the green status indicator. +cluster profile. Once your changes are applied, Palette marks your layers with the green status indicator. ![Cluster details page with service URL highlighted](/getting-started/gcp/getting-started_deploy-k8s-cluster_service_url.webp) @@ -203,11 +196,10 @@ choose to apply your changes at a convenient time. The previous state of the cluster profile will not be saved once it is overwritten. -Navigate to the left **Main Menu** and select **Clusters**. Filter for the cluster with the tag -**service:hello-universe-frontend**. Select it to view its **Overview** tab. +Navigate to the left **Main Menu** and select **Clusters**. Select the `gcp-cluster` to view its **Overview** tab. -Select the **Profiles** tab. Then, select the **hello-universe** pack. Change the `replicas` field to `2` on line `15`. -Click on **Save**. The editor closes. +Select the **Profile** tab. Then, select the **hello-universe** pack. Change the `replicas` field on line `15` to `2` +and **Save** your changes. The editor is closed. This cluster now contains an override over its cluster profile. Palette uses the configuration you have just provided for the single cluster over its cluster profile and begins making the appropriate changes. @@ -215,15 +207,15 @@ for the single cluster over its cluster profile and begins making the appropriat Once these changes are complete, select the **Workloads** tab. Then, select the **hello-universe** namespace. Two **ui** pods are available, instead of the one specified by your cluster profile. Your override has been successfully -applied. +applied. If your changes are not displayed, use the **refresh** icon. Navigate to the left **Main Menu** and select **Profiles** to view the cluster profile page. Find the cluster profile corresponding to your _hello-universe-frontend_ cluster, named `gcp-profile`. Click on it to view its details. Select **1.0.0** in the version dropdown. -Select the **hello-universe** pack. The editor appears. Change the `replicas` field to `3` on line `15`. Click on -**Confirm Updates**. The editor closes. +Select the **hello-universe** pack. Change the `replicas` field on line `15` to `3`. Click on **Confirm Updates**. The +editor is closed. Click on **Save Changes** to confirm the changes you have made to your profile. @@ -237,9 +229,10 @@ Select this cluster to open its **Overview** tab. Click on **Updates** to begin ![Image that shows the Updates button](/getting-started/gcp/getting-started_update-k8s-cluster_updates-available-button-cluster-overview.webp) -A dialog appears which shows the changes made in this update. Review the changes and ensure the only change is the -`replicas` field value. The pending update removes your cluster override and sets the `replicas` field to `3`. At this -point, you can choose to apply the pending changes or keep it by modifying the right-hand side of the dialog. +A dialog appears, showing a summary of packs changed. Select **Review changes in Editor** to review your changes. Ensure +the only change is the `replicas` field value. The pending update removes your cluster override and sets the `replicas` +field to `3`. At this point, you can choose to apply the pending changes or make additional changes by modifying the +**Pending Configuration** pane on the right side of the editor. ![Image that shows the available updates dialog ](/getting-started/gcp/getting-started_update-k8s-cluster_available-updates-dialog.webp) @@ -248,7 +241,8 @@ Click on **Apply Changes** once you have finished reviewing your changes. Palette updates your cluster according to cluster profile specifications. Once these changes are complete, select the **Workloads** tab. Then, select the **hello-universe** namespace. -Three **ui** pods are available. The cluster profile update is now reflected by your cluster. +Three **ui** pods are available. The cluster profile update is now reflected by your cluster. If your changes are not +displayed, use the **refresh** icon. ## Cluster Observability @@ -282,9 +276,9 @@ selection to remove the cluster profile. ## Wrap-Up -In this tutorial, you created deployed cluster profile updates. After the cluster was deployed to AWS, you updated the -cluster profile through three different methods: create a new cluster profile version, update a cluster profile in -place, and cluster profile overrides. After you made your changes, the Hello Universe application functioned as a +In this tutorial, you created deployed cluster profile updates. After the cluster was deployed to GCP, you updated the +cluster profile through three different methods: creating a new cluster profile version, updating a cluster profile in +place, and using cluster profile overrides. After you made your changes, the Hello Universe application functioned as a three-tier application with a REST API backend server. Cluster profiles provide consistency during the cluster creation process, as well as when maintaining your clusters. diff --git a/docs/docs-content/getting-started/vmware/create-cluster-profile.md b/docs/docs-content/getting-started/vmware/create-cluster-profile.md index 6d106cb062..ad27a732a0 100644 --- a/docs/docs-content/getting-started/vmware/create-cluster-profile.md +++ b/docs/docs-content/getting-started/vmware/create-cluster-profile.md @@ -10,9 +10,9 @@ tags: ["getting-started", "vmware"] Palette offers profile-based management for Kubernetes, enabling consistency, repeatability, and operational efficiency across multiple clusters. A cluster profile allows you to customize the cluster infrastructure stack, allowing you to -choose the desired Operating System (OS), Kubernetes, Container Network Interfaces (CNI), Container Storage Interfaces -(CSI). You can further customize the stack with add-on application layers. For more information about cluster profile -types, refer to [Cluster Profiles](../introduction.md#cluster-profiles). +choose the desired Operating System (OS), Kubernetes, Container Network Interfaces (CNIs), and Container Storage +Interfaces (CSIs). You can further customize the stack with add-on application layers. For more information about +cluster profile types, refer to [Cluster Profiles](../introduction.md#cluster-profiles). In this tutorial, you create a full profile directly from the Palette dashboard. Then, you add a layer to your cluster profile by using a [community pack](../../integrations/community_packs.md) to deploy a web application. The concepts you @@ -129,8 +129,6 @@ preset. Replace these values with your own base64 encoded values. The [_hello-universe_](https://github.com/spectrocloud/hello-universe?tab=readme-ov-file#single-load-balancer) repository provides an unencoded token that you can use. -Click on **Confirm Updates**. The manifest editor closes. - Click on **Confirm & Create** to save the manifest. Then, click on **Save Changes** to save this new layer to the cluster profile. diff --git a/docs/docs-content/getting-started/vmware/deploy-k8s-cluster.md b/docs/docs-content/getting-started/vmware/deploy-k8s-cluster.md index 28b6d8437c..7b15deb9ad 100644 --- a/docs/docs-content/getting-started/vmware/deploy-k8s-cluster.md +++ b/docs/docs-content/getting-started/vmware/deploy-k8s-cluster.md @@ -41,7 +41,8 @@ To complete this tutorial, you will need the following. The following steps will guide you through deploying the cluster infrastructure. -Navigate to the left **Main Menu** and select **Clusters**. Click on **Create Cluster**. +Navigate to the left **Main Menu** and select **Clusters**. Click on **Create Cluster**. If there are existing clusters, +choose **Add New Cluster**. ![Palette clusters overview page](/getting-started/getting-started_deploy-k8s-cluster_new_cluster.webp) @@ -106,9 +107,9 @@ Navigate to the left **Main Menu** and select **Clusters**. ![Update the cluster](/getting-started/vmware/getting-started_deploy-k8s-cluster_new_cluster.webp) -The cluster deployment process can take 15 to 30 min. The deployment time varies depending on the cloud provider, -cluster profile, cluster size, and the node pool configurations provided. You can learn more about the deployment -progress by reviewing the event log. Click on the **Events** tab to view the log. +The cluster deployment process can take 15 to 30 minutes. Deployment time varies depending on the cloud provider, +cluster profile, cluster size, and node pool configurations provided. You can learn more about the deployment progress +by reviewing the event log. Choose your cluster and select the **Events** tab to view the log. ![Update the cluster](/getting-started/vmware/getting-started_deploy-k8s-cluster_event_log.webp) diff --git a/docs/docs-content/getting-started/vmware/scale-secure-cluster.md b/docs/docs-content/getting-started/vmware/scale-secure-cluster.md index 3b25311dcc..0d8f2c7cd2 100644 --- a/docs/docs-content/getting-started/vmware/scale-secure-cluster.md +++ b/docs/docs-content/getting-started/vmware/scale-secure-cluster.md @@ -10,8 +10,8 @@ tags: ["getting-started", "vmware", "tutorial"] Palette has in-built features to help with the automation of Day-2 operations. Upgrading and maintaining a deployed cluster is typically complex because you need to consider any possible impact on service availability. Palette provides -out-of-the-box functionality for upgrades, observability, granular Role Based Access Control (RBAC), backup and security -scans. +out-of-the-box functionality for upgrades, observability, granular Role Based Access Control (RBAC), backup, and +security scans. This tutorial will teach you how to use the Palette UI to perform scale and maintenance tasks on your clusters. You will learn how to create Palette projects and teams, import a cluster profile, safely upgrade the Kubernetes version of a @@ -36,9 +36,9 @@ Additionally, you should install kubectl locally. Use the Kubernetes ## Create Palette Projects Palette projects help you organize and manage cluster resources, providing logical groupings. They also allow you to -manage user access control through Role Based Access Control (RBAC). You can assign users and teams with specific roles -to specific projects. All resources created within a project are scoped to that project and only available to that -project, but a tenant can have multiple projects. +manage user access control through RBAC. You can assign users and teams with specific roles to specific projects. All +resources created within a project are scoped to that project and only available to that project, but a tenant can have +multiple projects. Log in to [Palette](https://console.spectrocloud.com). @@ -423,18 +423,18 @@ Switch back to Palette in your web browser. Navigate to the left **Main Menu** a cluster profile deployed to your cluster, named `vmware-profile`. Ensure that the **1.1.0** version is selected. Click on the **hellouniverse 1.2.0** layer. The manifest editor appears. Set the -`manifests.hello-universe.ui.useTolerations` field on line 20 to `true`. Then, set the -`manifests.hello-universe.ui.effect` field on line 22 to `NoExecute`. This toleration describes that the UI pods of -Hello Universe will tolerate the taint with the key `app`, value `ui` and effect `NoExecute`. The tolerations of the UI +`manifests.hello-universe.ui.useTolerations` field on line 19 to `true`. Then, set the +`manifests.hello-universe.ui.effect` field on line 21 to `NoExecute`. This toleration describes that the UI pods of +Hello Universe will tolerate the taint with the effect `NoExecute`, key `app`, and value `ui`. The tolerations of the UI pods should be as below. ```yaml ui: useTolerations: true tolerations: - effect: NoExecute - key: app - value: ui + effect: NoExecute + key: app + value: ui ``` Click on **Confirm Updates**. The manifest editor closes. Then, click on **Save Changes** to persist your changes. diff --git a/docs/docs-content/getting-started/vmware/update-k8s-cluster.md b/docs/docs-content/getting-started/vmware/update-k8s-cluster.md index 7e9fa10d36..668319df46 100644 --- a/docs/docs-content/getting-started/vmware/update-k8s-cluster.md +++ b/docs/docs-content/getting-started/vmware/update-k8s-cluster.md @@ -64,17 +64,12 @@ panel. ![Image that shows how to add a cluster tag](/getting-started/vmware/getting-started_update-k8s-cluster_add-service-tag.webp) -Navigate to the left **Main Menu** and select **Clusters** to view your deployed clusters. Click on **Add Filter**, then -select the **Add custom filter** option. - -Use the drop-down boxes to fill in the values of the filter. Select **Tags** in the left-hand **drop-down Menu**. Select -**is** in the middle **drop-down Menu**. Fill in **service:hello-universe-frontend** in the right-hand input box. - -Click on **Apply Filter**. +Navigate to the left **Main Menu** and select **Clusters** to view your deployed clusters. Click the **filter** icon to +expand the **All Filters** pane, and below **Tags**, enter **service:hello-universe-frontend**. ![Image that shows how to add a frontend service filter](/getting-started/vmware/getting-started_update-k8s-cluster_apply-frontend-filter.webp) -Once you apply the filter, only the `vmware-cluster` with this tag is displayed. +Only the `vmware-cluster` with this tag is displayed. ## Version Cluster Profiles @@ -117,8 +112,7 @@ Click on **Confirm & Create**. The manifest editor closes. Click on **Save Changes** to finish the configuration of this cluster profile version. -Navigate to the left **Main Menu** and select **Clusters**. Filter for the cluster with the -**service:hello-universe-frontend** tag. Select it to view its **Overview** tab. +Navigate to the left **Main Menu** and select **Clusters**. Select the `vmware-cluster` to view its **Overview** tab. Select the **Profile** tab of this cluster. You can select a new version of your cluster profile by using the version dropdown. @@ -138,7 +132,7 @@ backups before you make any cluster profile version changes in your production e ::: Palette now makes the required changes to your cluster according to the specifications of the configured cluster profile -version. Once your changes have completed, Palette marks your layers with the green status indicator. The Kubecost pack +version. Once your changes are applied, Palette marks your layers with the green status indicator. The Kubecost pack will be successfully deployed. ![Image that shows completed cluster profile updates](/getting-started/vmware/getting-started_update-k8s-cluster_completed-cluster-updates.webp) @@ -183,11 +177,10 @@ the time to recovery in the event of an incident. The process to roll back to a previous version is identical to the process for applying a new version. -Navigate to the left **Main Menu** and select **Clusters**. Filter for the cluster with the -**service:hello-universe-frontend** tag. Select it to view its **Overview** tab. +Navigate to the left **Main Menu** and select **Clusters**. Select the `vmware-cluster` to view its **Overview** tab. Select the **Profile** tab. This cluster is currently deployed using cluster profile version **1.1.0**. Select the -option **1.0.0** in the version dropdown. This process is the reverse of what you have done in the previous section, +option **1.0.0** in the version dropdown. This process is the reverse of what you did in the previous section, [Version Cluster Profiles](#version-cluster-profiles). Click on **Review & Save** to confirm your changes. The **Changes Summary** dialog appears again. @@ -198,7 +191,7 @@ application configuration. Click on **Apply Changes**. Select the **Overview** tab. Palette now makes the changes required for the cluster to return to the state specified in version **1.0.0** of your -cluster profile. Once your changes have completed, Palette marks your layers with the green status indicator. +cluster profile. Once your changes are applied, Palette marks your layers with the green status indicator. ![Cluster details page](/getting-started/vmware/getting-started_update-k8s-cluster_cluster-details.webp) @@ -210,11 +203,10 @@ choose to apply your changes at a convenient time. The previous state of the cluster profile will not be saved once it is overwritten. -Navigate to the left **Main Menu** and select **Clusters**. Filter for the cluster with the tag -**service:hello-universe-frontend**. Select it to view its **Overview** tab. +Navigate to the left **Main Menu** and select **Clusters**. Select the `vmware-cluster` to view its **Overview** tab. -Select the **Profiles** tab. Then, select the **hello-universe** pack. Change the `replicas` field to `2` on line `15`. -Click on **Save**. The editor closes. +Select the **Profile** tab. Then, select the **hello-universe** pack. Change the `replicas` field on line `15` to `2` +and **Save** your changes. The editor is closed. This cluster now contains an override over its cluster profile. Palette uses the configuration you have just provided for the single cluster over its cluster profile and begins making the appropriate changes. @@ -222,15 +214,15 @@ for the single cluster over its cluster profile and begins making the appropriat Once these changes are complete, select the **Workloads** tab. Then, select the **hello-universe** namespace. Two **ui** pods are available, instead of the one specified by your cluster profile. Your override has been successfully -applied. +applied. If your changes are not displayed, use the **refresh** icon. Navigate to the left **Main Menu** and select **Profiles** to view the cluster profile page. Find the cluster profile corresponding to your _hello-universe-frontend_ cluster, named `vmware-profile`. Click on it to view its details. Select **1.0.0** in the version dropdown. -Select the **hello-universe** pack. The editor appears. Change the `replicas` field to `3` on line `15`. Click on -**Confirm Updates**. The editor closes. +Select the **hello-universe** pack. Change the `replicas` field on line `15` to `3`. Click on **Confirm Updates**. The +editor is closed. Click on **Save Changes** to confirm the changes you have made to your profile. @@ -244,9 +236,10 @@ Select this cluster to open its **Overview** tab. Click on **Updates** to begin ![Image that shows the Updates button](/getting-started/vmware/getting-started_update-k8s-cluster_updates-available-button-cluster-overview.webp) -A dialog appears which shows the changes made in this update. Review the changes and ensure the only change is the -`replicas` field value. The pending update removes your cluster override and sets the `replicas` field to `3`. At this -point, you can choose to apply the pending changes or keep it by modifying the right-hand side of the dialog. +A dialog appears, showing a summary of packs changed. Select **Review changes in Editor** to review your changes. Ensure +the only change is the `replicas` field value. The pending update removes your cluster override and sets the `replicas` +field to `3`. At this point, you can choose to apply the pending changes or make additional changes by modifying the +**Pending Configuration** pane on the right side of the editor. ![Image that shows the available updates dialog ](/getting-started/vmware/getting-started_update-k8s-cluster_available-updates-dialog.webp) @@ -255,7 +248,8 @@ Click on **Confirm updates** once you have finished reviewing your changes. Palette updates your cluster according to cluster profile specifications. Once these changes are complete, select the **Workloads** tab. Then, select the **hello-universe** namespace. -Three **ui** pods are available. The cluster profile update is now reflected by your cluster. +Three **ui** pods are available. The cluster profile update is now reflected by your cluster. If your changes are not +displayed, use the **refresh** icon. ## Cluster Observability @@ -292,9 +286,9 @@ selection to remove the cluster profile. ## Wrap-Up In this tutorial, you created deployed cluster profile updates. After the cluster was deployed to VMware, you updated -the cluster profile through three different methods: create a new cluster profile version, update a cluster profile in -place, and cluster profile overrides. After you made your changes, the Hello Universe application functioned as a -three-tier application with a REST API backend server. +the cluster profile through three different methods: creating a new cluster profile version, updating a cluster profile +in place, and using cluster profile overrides. After you made your changes, the Hello Universe application functioned as +a three-tier application with a REST API backend server. Cluster profiles provide consistency during the cluster creation process, as well as when maintaining your clusters. They can be versioned to keep a record of previously working cluster states, giving you visibility when updating or diff --git a/docs/docs-content/registries-and-packs/registries/oci-registry/add-oci-packs.md b/docs/docs-content/registries-and-packs/registries/oci-registry/add-oci-packs.md index 0d1828f351..da22ef0afd 100644 --- a/docs/docs-content/registries-and-packs/registries/oci-registry/add-oci-packs.md +++ b/docs/docs-content/registries-and-packs/registries/oci-registry/add-oci-packs.md @@ -72,7 +72,7 @@ For guidance on how to add a custom pack to an OCI pack registry, check out the } ``` - ## Add OCI Packs Registry +## Add OCI Packs Registry Use the following steps to add an OCI Packs registry to Palette. Select the tab that corresponds to the type of OCI registry you are adding. diff --git a/docs/docs-content/tutorials/profiles/deploy-pack.md b/docs/docs-content/tutorials/profiles/deploy-pack.md index 13dba8b9d4..ff45c8526f 100644 --- a/docs/docs-content/tutorials/profiles/deploy-pack.md +++ b/docs/docs-content/tutorials/profiles/deploy-pack.md @@ -230,6 +230,10 @@ Review each of the following five files in the **hello-universe-pack** folder. ```json { "addonType": "app services", + "annotations": { + "source": "community", + "contributor": "spectrocloud", + } "cloudTypes": ["all"], "displayName": "Hello Universe", "kubeManifests": ["manifests/hello-universe.yaml"], diff --git a/static/assets/docs/images/getting-started/aws/getting-started_update-k8s-cluster_apply-frontend-filter.webp b/static/assets/docs/images/getting-started/aws/getting-started_update-k8s-cluster_apply-frontend-filter.webp index 9bf322392a6a1803c3a820c368b57597cb5a511d..2f1cdb8010b3836936718456efaa26b9ea33fb4f 100644 GIT binary patch literal 62428 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 z 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

#T-WS|E9YBf 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

I>uzj2v=&B)K zTc|Y1;P&;+gI%TFT68f}Bl(LpXn_)a$Qoui|4@oX!f(HoWY7+i0Y~f>j0swxZ(YAXRE*VEg|x#d=Rs{+65I;Sn6ZTshZh9; z)@;?z$H&(%0eUd|DEa^)h^vs4*W}uqCVp%^vDmyr%^MhZ4DJrrc7<>{b%Xsr-&pYa@T%kGtM0GrI_n4rYHYLeo(25 zeN&JoU+`tywr$(f{MwwhjcMD~v~AnAZBE<#rtN9Fw}1bajo62c*w?)e6%|<(SvTus zR@}HzdCnC+x(~BBUqkOP56Tst#h%`uWKO?LR2Nq6Ib4Q?9e)DzxK<`{5+;q(xH-~W zXg2~ZP#ip0zs0-ETftvEFc2RrNErC!_o`iJf&AH(k0 z?~qv)Ic!!TW)D5c3JyOV+92`8301TgSo83y)nneuempB`H~k11ZTzkJ?+1f}WKwj6 z*);1(I}2R zg){-eGO53}u=&ANZF|WJ_w(sCVfJfQXuidCMG^M`RRJl*=of`QokKX4HmJ~`$ntGQ-=1@Cs+gcwKa*ElUW%DInV zKa5{~0$n4EprH@BqK5-AL65jgEwI@fzM^xQBR{2z7^|&Z;6uz{vD)w>M9jlw;pw~UBc5<3=2k!t?l70gQgF^2tck+@+JuZGj_pQ8wq%b~O zRSFq_*n-kwbrNjxA8*m+%Z3jbW$VL84SL z)zeH9eN^9(C@h#GizzcKL|<7t;VS+GIV~l`tjpRa5wnuNTR7KTQ2@8zU0svjpO=XO zamZAdmAWsh0#1}6; zALF_hYJY{8F9vq&x0q<<41tMmdOvIC8arRjbJ6KKE@MhsQfgh$D!r`ku5Y~`pC|mU zoET51m+1v@mtX^^yK_4zqyeNKm$OkgMKt8Yna)hoo(LrChS!_Ly7(u2B$_6E?MbCl z`}tXT2!Em>C24lIiFuPLMRt(ft@m?ZH5TmJ3LD0YttG>&+Q059H!FY_n-lV3u82Ho z)2*J%r*@%pq{#Rkn`5chgsIdG_gf-7E5*O(!Vy_qg(Q2zII!-e>geM67TiX99MIXz z^cJ7S(I4JAI~iqWL2&yQ`zTEK_U~5%E|u!E-2RJFbQ>5&T6#?E^9eB(edwi|gBrNH z_hkf*qP2qXQG^;+EU#z7F=~m$M!&sr8~c5fVrXKq(i~WU3&t{M)mV#65;oz8={p>v zUyAWal>-RQL=_RNPAEi|00cuu-M2g$7^tN@R?U~=N(9iD2z}=Y4 zfL0l|nyoq%dpJb23NLln&LjrwyjgG(bO?2S&`RHy8N%_S#p|{!2nt<}jYWJxYPKIc zaGgz&^exv95rME?_TvVCaJ=lB4tZ45BDC9;gzjhwA!#Imy?jJqQWt|~&2K*Xiw%9m zeV^o{31EWAq8x9oKh9!-^5j$m}NIrx!-hRtF{}+t95iR~)V+?|`Muo67>!D?1Q+3FXh~6E-OFk®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 UMqaqsN@QMw{FDbU2VGzQ0CktV*8l(j literal 58888 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 From 032bbde41b01dd6bb268e8c414b068b1bd0c6c56 Mon Sep 17 00:00:00 2001 From: caroldelwing Date: Fri, 20 Dec 2024 10:20:42 -0300 Subject: [PATCH 4/7] chore: upgrade docusaurus-theme-openapi-docs plugin (#5111) * chore: upgrade docusaurus-theme-openapi-docs plugin * docs: trigger visual tests --- package-lock.json | 913 ++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 483 insertions(+), 432 deletions(-) diff --git a/package-lock.json b/package-lock.json index 69a132f5b2..6b1c670e26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "spectro-cloud-docs", - "version": "4.5.5", + "version": "4.5.11", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "spectro-cloud-docs", - "version": "4.5.5", + "version": "4.5.11", "dependencies": { "@ant-design/icons": "^5.5.1", "@commitlint/cli": "^19.5.0", @@ -27,7 +27,7 @@ "clsx": "^1.2.1", "docusaurus-plugin-image-zoom": "^2.0.0", "docusaurus-plugin-sass": "^0.2.5", - "docusaurus-theme-openapi-docs": "0.0.0-949", + "docusaurus-theme-openapi-docs": "^4.3.1", "fuse.js": "^6.6.2", "node-fetch": "^3.1.0", "p-ratelimit": "^1.0.1", @@ -46,9 +46,9 @@ "@playwright/test": "^1.49.0", "@semantic-release/changelog": "^6.0.1", "@semantic-release/exec": "^6.0.3", - "@semantic-release/git": "*", - "@semantic-release/github": "*", - "@semantic-release/npm": "*", + "@semantic-release/git": "latest", + "@semantic-release/github": "latest", + "@semantic-release/npm": "latest", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.0.1", "@tsconfig/docusaurus": "^2.0.3", @@ -592,10 +592,10 @@ } }, "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "11.7.2", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.7.2.tgz", - "integrity": "sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==", - "license": "MIT", + "version": "11.7.3", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.7.3.tgz", + "integrity": "sha512-WApSdLdXEBb/1FUPca2lteASewEfpjEYJ8oXZP+0gExK5qSfsEKBKcA+WjY6Q4wvXwyv0+W6Kvc372pSceib9w==", + "peer": true, "dependencies": { "@jsdevtools/ono": "^7.1.3", "@types/json-schema": "^7.0.15", @@ -7519,13 +7519,13 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz", "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==", - "license": "MIT" + "peer": true }, "node_modules/@faker-js/faker": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-5.5.3.tgz", "integrity": "sha512-R11tGE6yIFwqpaIqcfkcg7AICXzFg14+5h5v0TfF/9+RMDL6jhzCy/pxHVOfbALGdtVYdt6JdR21tuxEgl34dw==", - "license": "MIT" + "deprecated": "Please update to a newer version." }, "node_modules/@floating-ui/core": { "version": "1.6.0", @@ -7601,7 +7601,8 @@ }, "node_modules/@hookform/error-message": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@hookform/error-message/-/error-message-2.0.1.tgz", + "integrity": "sha512-U410sAr92xgxT1idlu9WWOVjndxLdgPUHEB8Schr27C9eh7/xUnITWpCMF93s+lGiG++D4JnbSnrb5A21AdSNg==", "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0", @@ -8021,7 +8022,6 @@ }, "node_modules/@isaacs/cliui": { "version": "8.0.2", - "dev": true, "license": "ISC", "dependencies": { "string-width": "^5.1.2", @@ -8037,7 +8037,6 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.0.1", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -8048,7 +8047,6 @@ }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -8835,7 +8833,7 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "license": "MIT" + "peer": true }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", @@ -9765,7 +9763,6 @@ }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", - "dev": true, "license": "MIT", "optional": true, "engines": { @@ -9989,7 +9986,7 @@ "version": "8.11.2", "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz", "integrity": "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==", - "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -10002,24 +9999,23 @@ } }, "node_modules/@redocly/config": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.16.0.tgz", - "integrity": "sha512-t9jnODbUcuANRSl/K4L9nb12V+U5acIHnVSl26NWrtSdDZVtoqUXk2yGFPZzohYf62cCfEQUT8ouJ3bhPfpnJg==", - "license": "MIT" + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.17.1.tgz", + "integrity": "sha512-CEmvaJuG7pm2ylQg53emPmtgm4nW2nxBgwXzbVEHpGas/lGnMyN8Zlkgiz6rPw0unASg6VW3wlz27SOL5XFHYQ==", + "peer": true }, "node_modules/@redocly/openapi-core": { - "version": "1.25.11", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.25.11.tgz", - "integrity": "sha512-bH+a8izQz4fnKROKoX3bEU8sQ9rjvEIZOqU6qTmxlhOJ0NsKa5e+LmU18SV0oFeg5YhWQhhEDihXkvKJ1wMMNQ==", - "license": "MIT", + "version": "1.26.1", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.26.1.tgz", + "integrity": "sha512-xRuVZqMVRFzqjbUCpOTra4tbnmQMWsya996omZMV3WgD084Z6OWB3FXflhAp93E/yAmbWlWZpddw758AyoaLSw==", + "peer": true, "dependencies": { "@redocly/ajv": "^8.11.2", - "@redocly/config": "^0.16.0", + "@redocly/config": "^0.17.0", "colorette": "^1.2.0", "https-proxy-agent": "^7.0.4", "js-levenshtein": "^1.1.6", "js-yaml": "^4.1.0", - "lodash.isequal": "^4.5.0", "minimatch": "^5.0.1", "node-fetch": "^2.6.1", "pluralize": "^8.0.0", @@ -10034,7 +10030,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", + "peer": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -10054,19 +10050,19 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" + "peer": true }, "node_modules/@redocly/openapi-core/node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" + "peer": true }, "node_modules/@redocly/openapi-core/node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", + "peer": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -10074,7 +10070,8 @@ }, "node_modules/@reduxjs/toolkit": { "version": "1.9.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", + "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==", "dependencies": { "immer": "^9.0.21", "redux": "^4.2.1", @@ -12002,8 +11999,9 @@ "license": "MIT" }, "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.5", - "license": "MIT", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.6.tgz", + "integrity": "sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==", "dependencies": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" @@ -12155,7 +12153,8 @@ }, "node_modules/@types/parse5": { "version": "6.0.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==" }, "node_modules/@types/postcss-modules-local-by-default": { "version": "4.0.2", @@ -12209,8 +12208,9 @@ } }, "node_modules/@types/react-redux": { - "version": "7.1.33", - "license": "MIT", + "version": "7.1.34", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.34.tgz", + "integrity": "sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==", "dependencies": { "@types/hoist-non-react-statics": "^3.3.0", "@types/react": "*", @@ -12921,7 +12921,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" }, @@ -13026,7 +13025,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", - "license": "MIT", + "peer": true, "peerDependencies": { "ajv": "^8.5.0" }, @@ -13139,7 +13138,6 @@ "version": "0.6.6", "resolved": "https://registry.npmjs.org/allof-merge/-/allof-merge-0.6.6.tgz", "integrity": "sha512-116eZBf2he0/J4Tl7EYMz96I5Anaeio+VL0j/H2yxW9CoYQAMMv8gYcwkVRoO7XfIOv/qzSTfVzDVGAYxKFi3g==", - "license": "MIT", "dependencies": { "json-crawl": "^0.5.3" } @@ -13714,7 +13712,6 @@ "version": "4.10.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "license": "MIT", "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -13724,14 +13721,12 @@ "node_modules/asn1.js/node_modules/bn.js": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", - "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", - "license": "MIT" + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" }, "node_modules/assert": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "is-nan": "^1.3.2", @@ -13772,7 +13767,7 @@ "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "license": "MIT" + "peer": true }, "node_modules/async-done": { "version": "1.3.2", @@ -15084,8 +15079,7 @@ "node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "license": "MIT" + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, "node_modules/body-parser": { "version": "1.20.3", @@ -15280,8 +15274,7 @@ "node_modules/brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "license": "MIT" + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, "node_modules/browser-process-hrtime": { "version": "1.0.0", @@ -15292,7 +15285,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "license": "MIT", "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -15306,7 +15298,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "license": "MIT", "dependencies": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -15317,7 +15308,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -15329,7 +15319,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", - "license": "MIT", "dependencies": { "bn.js": "^5.2.1", "randombytes": "^2.1.0", @@ -15343,7 +15332,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz", "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==", - "license": "ISC", "dependencies": { "bn.js": "^5.2.1", "browserify-rsa": "^4.1.0", @@ -15363,14 +15351,12 @@ "node_modules/browserify-sign/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/browserify-sign/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -15384,14 +15370,12 @@ "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/browserify-sign/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } @@ -15399,14 +15383,12 @@ "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/browserify-zlib": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "license": "MIT", "dependencies": { "pako": "~1.0.5" } @@ -15480,7 +15462,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -15531,14 +15512,12 @@ "node_modules/buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "license": "MIT" + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" }, "node_modules/builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "license": "MIT" + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" }, "node_modules/bytes": { "version": "3.0.0", @@ -15616,11 +15595,38 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/call-me-maybe": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", - "license": "MIT" + "peer": true }, "node_modules/callsites": { "version": "3.1.0", @@ -15778,7 +15784,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==", - "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -15867,13 +15872,15 @@ } }, "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "license": "MIT", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", + "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" } }, "node_modules/cjs-module-lexer": { @@ -16577,7 +16584,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "license": "MIT" + "peer": true }, "node_modules/combine-promises": { "version": "1.2.0", @@ -16684,6 +16691,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz", "integrity": "sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==", + "peer": true, "dependencies": { "validate.io-array": "^1.0.3", "validate.io-function": "^1.0.2", @@ -16694,6 +16702,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/compute-lcm/-/compute-lcm-1.1.2.tgz", "integrity": "sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==", + "peer": true, "dependencies": { "compute-gcd": "^1.2.1", "validate.io-array": "^1.0.3", @@ -16812,8 +16821,7 @@ "node_modules/constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", - "license": "MIT" + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" }, "node_modules/content-disposition": { "version": "0.5.2", @@ -17129,7 +17137,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" @@ -17138,14 +17145,12 @@ "node_modules/create-ecdh/node_modules/bn.js": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", - "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", - "license": "MIT" + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" }, "node_modules/create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -17158,7 +17163,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "license": "MIT", "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -17321,7 +17325,6 @@ "version": "3.12.1", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", - "license": "MIT", "dependencies": { "browserify-cipher": "^1.0.1", "browserify-sign": "^4.2.3", @@ -17345,7 +17348,8 @@ }, "node_modules/crypto-js": { "version": "4.2.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" }, "node_modules/crypto-random-string": { "version": "4.0.0", @@ -18375,7 +18379,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", - "license": "MIT", "dependencies": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -18432,7 +18435,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-3.0.2.tgz", "integrity": "sha512-8JFjJHutStYrfWwzfretQoyNGoZVW1Fsrp4JO9spa7h/fBfwgTMEIy4/LBzRDGsxwVPHU0q+T9YvwLDJoOApLQ==", - "license": "MIT", "dependencies": { "execa": "^5.1.1" }, @@ -18511,7 +18513,6 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -18521,8 +18522,7 @@ "node_modules/diffie-hellman/node_modules/bn.js": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", - "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", - "license": "MIT" + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" }, "node_modules/dir-glob": { "version": "3.0.1", @@ -18572,15 +18572,12 @@ } }, "node_modules/docusaurus-plugin-openapi-docs": { - "version": "0.0.0-949", - "resolved": "https://registry.npmjs.org/docusaurus-plugin-openapi-docs/-/docusaurus-plugin-openapi-docs-0.0.0-949.tgz", - "integrity": "sha512-Nb65ghf0v63TVeXlqz+CrAKxnk+jBpYMtalO3kEBqZwfM+BwEnr++TlnDGnjmRlk4YjOJrwiC6STmUKH/hw+Xg==", - "license": "MIT", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/docusaurus-plugin-openapi-docs/-/docusaurus-plugin-openapi-docs-4.3.1.tgz", + "integrity": "sha512-uVv/mipiQzgqHIhgnTmJmsBW3UuuAufmuyXeHzQR8PGovsjMOKJU6YVDTd8qHlkXQ09IdoBLKG0RUZ9daNxt0w==", + "peer": true, "dependencies": { "@apidevtools/json-schema-ref-parser": "^11.5.4", - "@docusaurus/plugin-content-docs": "^3.5.0", - "@docusaurus/utils": "^3.5.0", - "@docusaurus/utils-validation": "^3.5.0", "@redocly/openapi-core": "^1.10.5", "allof-merge": "^0.6.6", "chalk": "^4.1.2", @@ -18600,6 +18597,9 @@ "node": ">=14" }, "peerDependencies": { + "@docusaurus/plugin-content-docs": "^3.5.0", + "@docusaurus/utils": "^3.5.0", + "@docusaurus/utils-validation": "^3.5.0", "react": "^16.8.4 || ^17.0.0 || ^18.0.0" } }, @@ -18607,7 +18607,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", + "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -18622,7 +18622,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", + "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18638,7 +18638,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", + "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -18650,13 +18650,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" + "peer": true }, "node_modules/docusaurus-plugin-openapi-docs/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "license": "MIT", + "peer": true, "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -18671,7 +18671,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -18680,7 +18680,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -18700,20 +18700,16 @@ } }, "node_modules/docusaurus-theme-openapi-docs": { - "version": "0.0.0-949", - "resolved": "https://registry.npmjs.org/docusaurus-theme-openapi-docs/-/docusaurus-theme-openapi-docs-0.0.0-949.tgz", - "integrity": "sha512-0BSvX6goHeFkzarqqfYxYnO6nJWC1XkN88/I+IIsfiey7RJqWigpDgtKw16/cHx4QaQYBGVoOafpZTBuDn578Q==", - "license": "MIT", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/docusaurus-theme-openapi-docs/-/docusaurus-theme-openapi-docs-4.3.1.tgz", + "integrity": "sha512-AeMBDckf+L3CDybLuzxUnjfBOa4zvpfux+u8g2apMSRub1Zh17EdqSWapzHWcMRw3xmknR4kqMFboWLXhwW1ew==", "dependencies": { - "@docusaurus/theme-common": "^3.5.0", "@hookform/error-message": "^2.0.1", "@reduxjs/toolkit": "^1.7.1", "allof-merge": "^0.6.6", "clsx": "^1.1.1", "copy-text-to-clipboard": "^3.1.0", "crypto-js": "^4.1.1", - "docusaurus-plugin-openapi-docs": "0.0.0-949", - "docusaurus-plugin-sass": "^0.2.3", "file-saver": "^2.0.5", "lodash": "^4.17.20", "node-polyfill-webpack-plugin": "^3.0.0", @@ -18730,6 +18726,7 @@ "remark-gfm": "3.0.1", "sass": "^1.80.4", "sass-loader": "^16.0.2", + "unist-util-visit": "^5.0.0", "webpack": "^5.61.0", "xml-formatter": "^2.6.1" }, @@ -18737,26 +18734,30 @@ "node": ">=14" }, "peerDependencies": { + "@docusaurus/theme-common": "^3.5.0", + "docusaurus-plugin-openapi-docs": "^4.0.0", + "docusaurus-plugin-sass": "^0.2.3", "react": "^16.8.4 || ^17.0.0 || ^18.0.0", "react-dom": "^16.8.4 || ^17.0.0 || ^18.0.0" } }, "node_modules/docusaurus-theme-openapi-docs/node_modules/@types/hast": { - "version": "2.3.8", - "license": "MIT", + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", "dependencies": { "@types/unist": "^2" } }, "node_modules/docusaurus-theme-openapi-docs/node_modules/@types/unist": { - "version": "2.0.10", - "license": "MIT" + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" }, "node_modules/docusaurus-theme-openapi-docs/node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -18766,7 +18767,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-from-parse5": { "version": "7.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz", + "integrity": "sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==", "dependencies": { "@types/hast": "^2.0.0", "@types/unist": "^2.0.0", @@ -18783,7 +18785,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-parse-selector": { "version": "3.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", + "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", "dependencies": { "@types/hast": "^2.0.0" }, @@ -18794,7 +18797,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-raw": { "version": "7.2.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz", + "integrity": "sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==", "dependencies": { "@types/hast": "^2.0.0", "@types/parse5": "^6.0.0", @@ -18813,9 +18817,24 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-raw/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-to-parse5": { "version": "7.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz", + "integrity": "sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==", "dependencies": { "@types/hast": "^2.0.0", "comma-separated-tokens": "^2.0.0", @@ -18831,7 +18850,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/hast-util-whitespace": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", + "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -18839,7 +18859,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/hastscript": { "version": "7.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", + "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", "dependencies": { "@types/hast": "^2.0.0", "comma-separated-tokens": "^2.0.0", @@ -18854,7 +18875,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/html-void-elements": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -18862,7 +18884,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-definitions": { "version": "5.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", + "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", "dependencies": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", @@ -18873,11 +18896,24 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-definitions/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-find-and-replace": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", - "license": "MIT", "dependencies": { "@types/mdast": "^3.0.0", "escape-string-regexp": "^5.0.0", @@ -18891,7 +18927,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-from-markdown": { "version": "1.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", "dependencies": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", @@ -18915,7 +18952,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", - "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^1.0.0", "mdast-util-gfm-autolink-literal": "^1.0.0", @@ -18934,7 +18970,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", - "license": "MIT", "dependencies": { "@types/mdast": "^3.0.0", "ccount": "^2.0.0", @@ -18950,7 +18985,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", - "license": "MIT", "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-to-markdown": "^1.3.0", @@ -18965,7 +18999,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", - "license": "MIT", "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-to-markdown": "^1.3.0" @@ -18979,7 +19012,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", - "license": "MIT", "dependencies": { "@types/mdast": "^3.0.0", "markdown-table": "^3.0.0", @@ -18995,7 +19027,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", - "license": "MIT", "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-to-markdown": "^1.3.0" @@ -19009,7 +19040,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", - "license": "MIT", "dependencies": { "@types/mdast": "^3.0.0", "unist-util-is": "^5.0.0" @@ -19021,7 +19051,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-to-hast": { "version": "12.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", + "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", "dependencies": { "@types/hast": "^2.0.0", "@types/mdast": "^3.0.0", @@ -19037,11 +19068,24 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-to-hast/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-to-markdown": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", - "license": "MIT", "dependencies": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", @@ -19057,9 +19101,24 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-to-markdown/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/docusaurus-theme-openapi-docs/node_modules/mdast-util-to-string": { "version": "3.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", "dependencies": { "@types/mdast": "^3.0.0" }, @@ -19070,6 +19129,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", "funding": [ { "type": "GitHub Sponsors", @@ -19080,7 +19141,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", @@ -19103,6 +19163,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-core-commonmark": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", "funding": [ { "type": "GitHub Sponsors", @@ -19113,7 +19175,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-factory-destination": "^1.0.0", @@ -19137,7 +19198,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", - "license": "MIT", "dependencies": { "micromark-extension-gfm-autolink-literal": "^1.0.0", "micromark-extension-gfm-footnote": "^1.0.0", @@ -19157,7 +19217,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", - "license": "MIT", "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-sanitize-uri": "^1.0.0", @@ -19173,7 +19232,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", - "license": "MIT", "dependencies": { "micromark-core-commonmark": "^1.0.0", "micromark-factory-space": "^1.0.0", @@ -19193,7 +19251,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", - "license": "MIT", "dependencies": { "micromark-util-chunked": "^1.0.0", "micromark-util-classify-character": "^1.0.0", @@ -19211,7 +19268,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", - "license": "MIT", "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", @@ -19228,7 +19284,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", - "license": "MIT", "dependencies": { "micromark-util-types": "^1.0.0" }, @@ -19241,7 +19296,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", - "license": "MIT", "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", @@ -19256,6 +19310,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-factory-destination": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", "funding": [ { "type": "GitHub Sponsors", @@ -19266,7 +19322,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", @@ -19275,6 +19330,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-factory-label": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", "funding": [ { "type": "GitHub Sponsors", @@ -19285,7 +19342,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", @@ -19295,6 +19351,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-factory-title": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", "funding": [ { "type": "GitHub Sponsors", @@ -19305,7 +19363,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", @@ -19315,6 +19372,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-factory-whitespace": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", "funding": [ { "type": "GitHub Sponsors", @@ -19325,7 +19384,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", @@ -19335,6 +19393,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-chunked": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", "funding": [ { "type": "GitHub Sponsors", @@ -19345,13 +19405,14 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^1.0.0" } }, "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-classify-character": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", "funding": [ { "type": "GitHub Sponsors", @@ -19362,7 +19423,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", @@ -19371,6 +19431,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-combine-extensions": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", "funding": [ { "type": "GitHub Sponsors", @@ -19381,7 +19443,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-chunked": "^1.0.0", "micromark-util-types": "^1.0.0" @@ -19389,6 +19450,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-decode-numeric-character-reference": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", "funding": [ { "type": "GitHub Sponsors", @@ -19399,13 +19462,14 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^1.0.0" } }, "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-decode-string": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", "funding": [ { "type": "GitHub Sponsors", @@ -19416,7 +19480,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^1.0.0", @@ -19426,6 +19489,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-encode": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", "funding": [ { "type": "GitHub Sponsors", @@ -19435,11 +19500,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-html-tag-name": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", "funding": [ { "type": "GitHub Sponsors", @@ -19449,11 +19515,12 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ], - "license": "MIT" + ] }, "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-normalize-identifier": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", "funding": [ { "type": "GitHub Sponsors", @@ -19464,13 +19531,14 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-symbol": "^1.0.0" } }, "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-resolve-all": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", "funding": [ { "type": "GitHub Sponsors", @@ -19481,13 +19549,14 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-types": "^1.0.0" } }, "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-sanitize-uri": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", "funding": [ { "type": "GitHub Sponsors", @@ -19498,7 +19567,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-encode": "^1.0.0", @@ -19507,6 +19575,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/micromark-util-subtokenize": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", "funding": [ { "type": "GitHub Sponsors", @@ -19517,7 +19587,6 @@ "url": "https://opencollective.com/unified" } ], - "license": "MIT", "dependencies": { "micromark-util-chunked": "^1.0.0", "micromark-util-symbol": "^1.0.0", @@ -19527,15 +19596,18 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/parse5": { "version": "6.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, "node_modules/docusaurus-theme-openapi-docs/node_modules/react-is": { "version": "18.3.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/docusaurus-theme-openapi-docs/node_modules/react-markdown": { "version": "8.0.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz", + "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==", "dependencies": { "@types/hast": "^2.0.0", "@types/prop-types": "^15.0.0", @@ -19562,9 +19634,24 @@ "react": ">=16" } }, + "node_modules/docusaurus-theme-openapi-docs/node_modules/react-markdown/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/docusaurus-theme-openapi-docs/node_modules/rehype-raw": { "version": "6.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-6.1.1.tgz", + "integrity": "sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==", "dependencies": { "@types/hast": "^2.0.0", "hast-util-raw": "^7.2.0", @@ -19579,7 +19666,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", - "license": "MIT", "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-gfm": "^2.0.0", @@ -19593,7 +19679,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/remark-parse": { "version": "10.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-from-markdown": "^1.0.0", @@ -19606,7 +19693,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/remark-rehype": { "version": "10.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", + "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", "dependencies": { "@types/hast": "^2.0.0", "@types/mdast": "^3.0.0", @@ -19619,10 +19707,9 @@ } }, "node_modules/docusaurus-theme-openapi-docs/node_modules/sass-loader": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.3.tgz", - "integrity": "sha512-gosNorT1RCkuCMyihv6FBRR7BMV06oKRAs+l4UMp1mlcVg9rWN6KMmUj3igjQwmYys4mDP3etEYJgiHRbgHCHA==", - "license": "MIT", + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.4.tgz", + "integrity": "sha512-LavLbgbBGUt3wCiYzhuLLu65+fWXaXLmq7YxivLhEqmiupCFZ5sKUAipK3do6V80YSU0jvSxNhEdT13IXNr3rg==", "dependencies": { "neo-async": "^2.6.2" }, @@ -19660,7 +19747,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/unified": { "version": "10.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", "dependencies": { "@types/unist": "^2.0.0", "bail": "^2.0.0", @@ -19677,7 +19765,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/unist-util-generated": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", + "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -19685,7 +19774,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/unist-util-is": { "version": "5.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", "dependencies": { "@types/unist": "^2.0.0" }, @@ -19696,7 +19786,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/unist-util-position": { "version": "4.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", + "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", "dependencies": { "@types/unist": "^2.0.0" }, @@ -19707,7 +19798,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/unist-util-stringify-position": { "version": "3.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", "dependencies": { "@types/unist": "^2.0.0" }, @@ -19716,22 +19808,10 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/docusaurus-theme-openapi-docs/node_modules/unist-util-visit": { - "version": "4.1.2", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/docusaurus-theme-openapi-docs/node_modules/unist-util-visit-parents": { "version": "5.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" @@ -19743,7 +19823,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/vfile": { "version": "5.3.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", "dependencies": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", @@ -19757,7 +19838,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/vfile-location": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz", + "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==", "dependencies": { "@types/unist": "^2.0.0", "vfile": "^5.0.0" @@ -19769,7 +19851,8 @@ }, "node_modules/docusaurus-theme-openapi-docs/node_modules/vfile-message": { "version": "3.1.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", "dependencies": { "@types/unist": "^2.0.0", "unist-util-stringify-position": "^3.0.0" @@ -19816,7 +19899,6 @@ "version": "4.23.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.23.0.tgz", "integrity": "sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==", - "license": "Artistic-2.0", "engines": { "node": ">=10" }, @@ -20041,6 +20123,19 @@ "node": ">=0.10.0" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer": { "version": "0.1.2", "license": "MIT" @@ -20177,10 +20272,9 @@ "license": "ISC" }, "node_modules/elliptic": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.0.tgz", - "integrity": "sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==", - "license": "MIT", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -20194,8 +20288,7 @@ "node_modules/elliptic/node_modules/bn.js": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", - "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", - "license": "MIT" + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" }, "node_modules/emittery": { "version": "0.13.1", @@ -20522,11 +20615,9 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "engines": { "node": ">= 0.4" } @@ -20568,7 +20659,6 @@ }, "node_modules/es-object-atoms": { "version": "1.0.0", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -20643,7 +20733,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", - "license": "MIT" + "peer": true }, "node_modules/es6-symbol": { "version": "3.1.4", @@ -21600,7 +21690,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", "engines": { "node": ">=6" } @@ -21621,7 +21710,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "license": "MIT", "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -21801,7 +21889,8 @@ }, "node_modules/exenv": { "version": "1.2.2", - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" }, "node_modules/exit": { "version": "0.1.2", @@ -22157,7 +22246,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "license": "MIT" + "peer": true }, "node_modules/fast-xml-parser": { "version": "4.5.0", @@ -22357,7 +22446,8 @@ }, "node_modules/file-saver": { "version": "2.0.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" }, "node_modules/file-type": { "version": "3.9.0", @@ -22765,11 +22855,10 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", - "license": "MIT" + "peer": true }, "node_modules/foreground-child": { "version": "3.1.1", - "dev": true, "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", @@ -22784,7 +22873,6 @@ }, "node_modules/foreground-child/node_modules/signal-exit": { "version": "4.1.0", - "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -23344,14 +23432,20 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "license": "MIT", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", + "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -24071,10 +24165,11 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -24126,7 +24221,7 @@ "version": "2.1.8", "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", - "license": "MIT", + "peer": true, "dependencies": { "lodash": "^4.17.15" } @@ -24745,6 +24840,7 @@ }, "node_modules/has-proto": { "version": "1.0.3", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -24762,8 +24858,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "license": "MIT", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "engines": { "node": ">= 0.4" }, @@ -24869,23 +24966,21 @@ } }, "node_modules/hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", - "license": "MIT", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz", + "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" }, "engines": { - "node": ">=4" + "node": ">= 0.10" } }, "node_modules/hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "license": "MIT", "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -25169,7 +25264,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "license": "MIT", "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -25497,8 +25591,7 @@ "node_modules/http-reasons": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz", - "integrity": "sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ==", - "license": "Apache-2.0" + "integrity": "sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ==" }, "node_modules/http-signature": { "version": "1.2.0", @@ -25518,7 +25611,7 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==", - "license": "MIT" + "peer": true }, "node_modules/http2-wrapper": { "version": "2.2.1", @@ -25544,8 +25637,7 @@ "node_modules/https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", - "license": "MIT" + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" }, "node_modules/https-proxy-agent": { "version": "7.0.5", @@ -26271,11 +26363,12 @@ } }, "node_modules/is-arguments": { - "version": "1.1.1", - "license": "MIT", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -26663,7 +26756,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "license": "MIT", "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" @@ -27213,7 +27305,6 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -30607,7 +30698,7 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", - "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -30731,7 +30822,6 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/json-crawl/-/json-crawl-0.5.3.tgz", "integrity": "sha512-BEjjCw8c7SxzNK4orhlWD5cXQh8vCk2LqDr4WgQq4CV+5dvopeYwt1Tskg67SuSLKvoFH5g0yuYtg7rcfKV6YA==", - "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -30749,7 +30839,7 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", - "license": "MIT", + "peer": true, "dependencies": { "foreach": "^2.0.4" } @@ -30763,7 +30853,7 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz", "integrity": "sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==", - "license": "MIT", + "peer": true, "dependencies": { "lodash": "^4.17.4" } @@ -30772,7 +30862,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/json-schema-merge-allof/-/json-schema-merge-allof-0.8.1.tgz", "integrity": "sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w==", - "license": "MIT", + "peer": true, "dependencies": { "compute-lcm": "^1.1.2", "json-schema-compare": "^0.2.2", @@ -31762,7 +31852,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/liquid-json/-/liquid-json-0.3.1.tgz", "integrity": "sha512-wUayTU8MS827Dam6MxgD72Ui+KOSF+u/eIqpatOtjnvgJ0+mnDq33uC2M7J0tPK+upe/DpUAuK4JUU89iBoNKQ==", - "license": "Apache-2.0", "engines": { "node": ">=4" } @@ -31984,12 +32073,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "license": "MIT" - }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "license": "MIT" @@ -32643,11 +32726,18 @@ "node": ">=0.10.0" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -36688,7 +36778,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "license": "MIT", "dependencies": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -36700,8 +36789,7 @@ "node_modules/miller-rabin/node_modules/bn.js": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", - "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", - "license": "MIT" + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" }, "node_modules/mime": { "version": "4.0.0", @@ -36730,7 +36818,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/mime-format/-/mime-format-2.0.1.tgz", "integrity": "sha512-XxU3ngPbEnrYnNbIX+lYSaYg0M01v6p2ntd2YaFksTu0vayaw5OJvbdRyWs07EYRlLED5qadUZ+xo+XhOvFhwg==", - "license": "Apache-2.0", "dependencies": { "charset": "^1.0.0" } @@ -36811,14 +36898,13 @@ "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "license": "MIT" + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, "node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -36837,7 +36923,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" @@ -36932,7 +37017,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "license": "MIT", + "peer": true, "bin": { "mustache": "bin/mustache" } @@ -37071,7 +37156,7 @@ "version": "0.6.15", "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.15.tgz", "integrity": "sha512-HZpdkco+JeXq0G+WWpMJ4NsX3pqb5O7eR9uGz3FfoFt+LYzU8iRWp49nJtud6hsDoywM8tIrDo3gjgmOqJA8LA==", - "license": "MIT", + "peer": true, "engines": { "node": ">= 10" } @@ -53261,7 +53346,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", - "license": "MIT", + "peer": true, "dependencies": { "http2-client": "^1.2.5" }, @@ -53285,7 +53370,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-3.0.0.tgz", "integrity": "sha512-QpG496dDBiaelQZu9wDcVvpLbtk7h9Ctz693RaUMZBgl8DUoFToO90ZTLKq57gP7rwKqYtGbMBXkcEgLSag2jQ==", - "license": "MIT", "dependencies": { "assert": "^2.1.0", "browserify-zlib": "^0.2.0", @@ -53320,10 +53404,9 @@ } }, "node_modules/node-polyfill-webpack-plugin/node_modules/type-fest": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", - "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", - "license": "(MIT OR CC0-1.0)", + "version": "4.30.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.30.2.tgz", + "integrity": "sha512-UJShLPYi1aWqCdq9HycOL/gwsuqda1OISdBO3t8RlXQC4QvtuIz4b5FCfe2dQIWEpmlRExKmcTBfP1r9bhY7ig==", "engines": { "node": ">=16" }, @@ -53335,7 +53418,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==", - "license": "MIT", + "peer": true, "dependencies": { "es6-promise": "^3.2.1" } @@ -56136,7 +56219,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", - "license": "BSD-3-Clause", + "peer": true, "dependencies": { "fast-safe-stringify": "^2.0.7" } @@ -56145,7 +56228,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", - "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@exodus/schemasafe": "^1.0.0-rc.2", "should": "^13.2.1", @@ -56159,7 +56242,7 @@ "version": "2.5.6", "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", - "license": "BSD-3-Clause", + "peer": true, "dependencies": { "node-fetch-h2": "^2.3.0", "oas-kit-common": "^1.0.8", @@ -56178,7 +56261,7 @@ "version": "2.5.6", "resolved": "https://registry.npmjs.org/oas-resolver-browser/-/oas-resolver-browser-2.5.6.tgz", "integrity": "sha512-Jw5elT/kwUJrnGaVuRWe1D7hmnYWB8rfDDjBnpQ+RYY/dzAewGXeTexXzt4fGEo6PUE4eqKqPWF79MZxxvMppA==", - "license": "BSD-3-Clause", + "peer": true, "dependencies": { "node-fetch-h2": "^2.3.0", "oas-kit-common": "^1.0.8", @@ -56198,7 +56281,7 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==", - "license": "BSD-3-Clause", + "peer": true, "funding": { "url": "https://github.com/Mermade/oas-kit?sponsor=1" } @@ -56207,7 +56290,7 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", - "license": "BSD-3-Clause", + "peer": true, "dependencies": { "call-me-maybe": "^1.0.1", "oas-kit-common": "^1.0.8", @@ -56293,7 +56376,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "license": "MIT", + "peer": true, "engines": { "node": ">= 6" } @@ -56306,11 +56389,12 @@ } }, "node_modules/object-is": { - "version": "1.1.5", - "license": "MIT", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -56534,7 +56618,7 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/openapi-to-postmanv2/-/openapi-to-postmanv2-4.24.0.tgz", "integrity": "sha512-SfWo8fftwTVmBs61ZY9SciNlQ7ddSBmPS7NTBdf+LyjHdzr2/TNuvFjyftGJ7Jnm48oghi+R9At2geq1NoBOLA==", - "license": "Apache-2.0", + "peer": true, "dependencies": { "ajv": "8.11.0", "ajv-draft-04": "1.0.0", @@ -56565,7 +56649,7 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -56581,7 +56665,7 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" + "peer": true }, "node_modules/openapi-typescript-helpers": { "version": "0.0.13", @@ -56799,8 +56883,7 @@ "node_modules/os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", - "license": "MIT" + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" }, "node_modules/os-filter-obj": { "version": "2.0.0", @@ -57028,14 +57111,12 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "dev": true, "license": "BlueOak-1.0.0" }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, "node_modules/param-case": { "version": "3.0.4", @@ -57059,7 +57140,6 @@ "version": "5.1.7", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==", - "license": "ISC", "dependencies": { "asn1.js": "^4.10.1", "browserify-aes": "^1.2.0", @@ -57206,7 +57286,6 @@ "version": "0.12.7", "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", - "license": "MIT", "dependencies": { "process": "^0.11.1", "util": "^0.10.3" @@ -57215,8 +57294,7 @@ "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "license": "MIT" + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" }, "node_modules/path-dirname": { "version": "1.0.2", @@ -57273,7 +57351,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", @@ -57290,7 +57367,6 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, "license": "ISC" }, "node_modules/path-to-regexp": { @@ -57312,14 +57388,12 @@ "node_modules/path/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "license": "ISC" + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" }, "node_modules/path/node_modules/util": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "license": "MIT", "dependencies": { "inherits": "2.0.3" } @@ -57328,7 +57402,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "license": "MIT", "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -57776,7 +57849,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "license": "MIT", + "peer": true, "engines": { "node": ">=4" } @@ -59215,11 +59288,10 @@ } }, "node_modules/postman-code-generators": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/postman-code-generators/-/postman-code-generators-1.12.0.tgz", - "integrity": "sha512-J+X5e2ciOIwkuZW4UhDEfMItVtx3ZpTFLcVzSmJaeYQDj6k/0Eduo6VQiGMq575527uzyMNabivwtJa3g5Rqow==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/postman-code-generators/-/postman-code-generators-1.14.1.tgz", + "integrity": "sha512-IQ/D4VqNNK9cLxQttFGI9Jx4Q6uxCvOf4UKf+hfatmqivguJ1ICeSCcjEfYXhLQTa/RsJ3PFERHztF+CE0M/WQ==", "hasInstallScript": true, - "license": "Apache-2.0", "dependencies": { "async": "3.2.2", "detect-package-manager": "3.0.2", @@ -59235,14 +59307,12 @@ "node_modules/postman-code-generators/node_modules/async": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", - "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==", - "license": "MIT" + "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==" }, "node_modules/postman-collection": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.5.0.tgz", "integrity": "sha512-152JSW9pdbaoJihwjc7Q8lc3nPg/PC9lPTHdMk7SHnHhu/GBJB7b2yb9zG7Qua578+3PxkQ/HYBuXpDSvsf7GQ==", - "license": "Apache-2.0", "dependencies": { "@faker-js/faker": "5.5.3", "file-type": "3.9.0", @@ -59264,7 +59334,6 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-3.0.5.tgz", "integrity": "sha512-jOrdVvzUXBC7C+9gkIkpDJ3HIxOHTIqjpQ4C1EMt1ZGeMvSEpbFCKq23DEfgsj46vMnDgyQf+1ZLp2Wm+bKSsA==", - "license": "Apache-2.0", "dependencies": { "punycode": "^2.1.1" }, @@ -59475,7 +59544,8 @@ }, "node_modules/process": { "version": "0.11.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "engines": { "node": ">= 0.6.0" } @@ -59599,7 +59669,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -59612,8 +59681,7 @@ "node_modules/public-encrypt/node_modules/bn.js": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", - "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", - "license": "MIT" + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==" }, "node_modules/pump": { "version": "3.0.0", @@ -59756,7 +59824,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "license": "MIT", "dependencies": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -60575,18 +60642,18 @@ } }, "node_modules/react-hook-form": { - "version": "7.49.2", - "license": "MIT", + "version": "7.54.1", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.54.1.tgz", + "integrity": "sha512-PUNzFwQeQ5oHiiTUO7GO/EJXGEtuun2Y1A59rLnZBBj+vNEOWt/3ERTiG1/zt7dVeJEM+4vDX/7XQ/qanuvPMg==", "engines": { - "node": ">=18", - "pnpm": "8" + "node": ">=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/react-hook-form" }, "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18" + "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "node_modules/react-is": { @@ -60607,11 +60674,13 @@ }, "node_modules/react-lifecycles-compat": { "version": "3.0.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, "node_modules/react-live": { "version": "3.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/react-live/-/react-live-3.2.0.tgz", + "integrity": "sha512-tHkft6spWgNOlW21XUQKqoFDP9ZVhrEUBD80sYwL1ykOovj9DN2z0GXW3d4G7gAphcUXCy+BLfe1S/IpdE5AAQ==", "dependencies": { "prism-react-renderer": "^1.3.1", "sucrase": "^3.21.0", @@ -60624,7 +60693,8 @@ }, "node_modules/react-live/node_modules/prism-react-renderer": { "version": "1.3.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz", + "integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==", "peerDependencies": { "react": ">=0.14.9" } @@ -60657,7 +60727,8 @@ }, "node_modules/react-magic-dropzone": { "version": "1.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/react-magic-dropzone/-/react-magic-dropzone-1.0.1.tgz", + "integrity": "sha512-0BIROPARmXHpk4AS3eWBOsewxoM5ndk2psYP/JmbCq8tz3uR2LIV1XiroZ9PKrmDRMctpW+TvsBCtWasuS8vFA==" }, "node_modules/react-markdown": { "version": "9.0.1", @@ -60684,25 +60755,24 @@ } }, "node_modules/react-modal": { - "version": "3.16.1", - "license": "MIT", + "version": "3.16.3", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.3.tgz", + "integrity": "sha512-yCYRJB5YkeQDQlTt17WGAgFJ7jr2QYcWa1SHqZ3PluDmnKJ/7+tVU+E6uKyZ0nODaeEj+xCpK4LcSnKXLMC0Nw==", "dependencies": { "exenv": "^1.2.0", "prop-types": "^15.7.2", "react-lifecycles-compat": "^3.0.0", "warning": "^4.0.3" }, - "engines": { - "node": ">=8" - }, "peerDependencies": { - "react": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18", - "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18" + "react": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19", + "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19" } }, "node_modules/react-redux": { "version": "7.2.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", "dependencies": { "@babel/runtime": "^7.15.4", "@types/react-redux": "^7.1.20", @@ -60950,10 +61020,9 @@ } }, "node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", - "license": "MIT", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.6.0.tgz", + "integrity": "sha512-cbAdYt0VcnpN2Bekq7PU+k363ZRsPwJoEEJOEtSJQlJXzwaxt3FIo/uL+KeDSGIjJqtkwyge4KQgD2S2kd+CQw==", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -61058,14 +61127,16 @@ }, "node_modules/redux": { "version": "4.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", "dependencies": { "@babel/runtime": "^7.9.2" } }, "node_modules/redux-thunk": { "version": "2.4.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", "peerDependencies": { "redux": "^4" } @@ -61093,7 +61164,7 @@ "version": "1.1.9", "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", - "license": "BSD-3-Clause", + "peer": true, "funding": { "url": "https://github.com/Mermade/oas-kit?sponsor=1" } @@ -61862,7 +61933,8 @@ }, "node_modules/reselect": { "version": "4.1.8", - "license": "MIT" + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" }, "node_modules/reserved-words": { "version": "0.1.2", @@ -62083,7 +62155,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -63158,8 +63229,7 @@ "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "license": "MIT" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "node_modules/setprototypeof": { "version": "1.2.0", @@ -63169,7 +63239,6 @@ "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "license": "(MIT AND BSD-3-Clause)", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -63256,7 +63325,7 @@ "version": "13.2.3", "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", - "license": "MIT", + "peer": true, "dependencies": { "should-equal": "^2.0.0", "should-format": "^3.0.3", @@ -63269,7 +63338,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", - "license": "MIT", + "peer": true, "dependencies": { "should-type": "^1.4.0" } @@ -63278,7 +63347,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", - "license": "MIT", + "peer": true, "dependencies": { "should-type": "^1.3.0", "should-type-adaptors": "^1.0.1" @@ -63288,13 +63357,13 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", - "license": "MIT" + "peer": true }, "node_modules/should-type-adaptors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", - "license": "MIT", + "peer": true, "dependencies": { "should-type": "^1.3.0", "should-util": "^1.0.0" @@ -63304,7 +63373,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", - "license": "MIT" + "peer": true }, "node_modules/side-channel": { "version": "1.0.6", @@ -63500,7 +63569,7 @@ "version": "1.6.6", "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", - "license": "MIT", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -63992,7 +64061,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "license": "MIT", "dependencies": { "inherits": "~2.0.4", "readable-stream": "^3.5.0" @@ -64002,7 +64070,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -64062,7 +64129,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", - "license": "MIT", "dependencies": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.4", @@ -64074,7 +64140,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -64156,7 +64221,6 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -64169,12 +64233,10 @@ }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", - "dev": true, "license": "MIT" }, "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -64353,7 +64415,6 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -64518,12 +64579,13 @@ } }, "node_modules/sucrase": { - "version": "3.34.0", - "license": "MIT", + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", - "glob": "7.1.6", + "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", @@ -64534,50 +64596,48 @@ "sucrase-node": "bin/sucrase-node" }, "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase/node_modules/brace-expansion": { - "version": "1.1.11", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node": ">=16 || 14 >=14.17" } }, "node_modules/sucrase/node_modules/commander": { "version": "4.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "engines": { "node": ">= 6" } }, "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "license": "ISC", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": "*" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/sucrase/node_modules/minimatch": { - "version": "3.1.2", - "license": "ISC", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/super-regex": { @@ -64725,7 +64785,7 @@ "version": "7.0.8", "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", - "license": "BSD-3-Clause", + "peer": true, "dependencies": { "call-me-maybe": "^1.0.1", "node-fetch": "^2.6.1", @@ -64752,7 +64812,7 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", + "peer": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -64772,19 +64832,19 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" + "peer": true }, "node_modules/swagger2openapi/node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" + "peer": true }, "node_modules/swagger2openapi/node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", + "peer": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -65632,7 +65692,6 @@ "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "license": "MIT", "dependencies": { "setimmediate": "^1.0.4" }, @@ -65967,7 +66026,8 @@ }, "node_modules/ts-interface-checker": { "version": "0.1.13", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, "node_modules/ts-jest": { "version": "29.1.4", @@ -66111,8 +66171,7 @@ "node_modules/tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "license": "MIT" + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" }, "node_modules/tunnel-agent": { "version": "0.6.0", @@ -66986,7 +67045,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz", "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==", - "license": "MIT" + "peer": true }, "node_modules/urix": { "version": "0.1.0", @@ -66997,7 +67056,6 @@ "version": "0.11.4", "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", - "license": "MIT", "dependencies": { "punycode": "^1.4.1", "qs": "^6.12.3" @@ -67111,14 +67169,12 @@ "node_modules/url/node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "license": "MIT" + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, "node_modules/url/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "license": "BSD-3-Clause", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", + "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", "dependencies": { "side-channel": "^1.0.6" }, @@ -67139,7 +67195,8 @@ }, "node_modules/use-editable": { "version": "2.3.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/use-editable/-/use-editable-2.3.3.tgz", + "integrity": "sha512-7wVD2JbfAFJ3DK0vITvXBdpd9JAz5BcKAAolsnLBuBn6UDDwBGuCIAGvR3yA2BNKm578vAMVHFCWaOcA+BhhiA==", "peerDependencies": { "react": ">= 16.8.0" } @@ -67160,7 +67217,6 @@ "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "license": "MIT", "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", @@ -67293,17 +67349,19 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", "integrity": "sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==", - "license": "MIT" + "peer": true }, "node_modules/validate.io-function": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz", - "integrity": "sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==" + "integrity": "sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==", + "peer": true }, "node_modules/validate.io-integer": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz", "integrity": "sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==", + "peer": true, "dependencies": { "validate.io-number": "^1.0.3" } @@ -67312,6 +67370,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz", "integrity": "sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA==", + "peer": true, "dependencies": { "validate.io-array": "^1.0.3", "validate.io-integer": "^1.0.4" @@ -67320,7 +67379,8 @@ "node_modules/validate.io-number": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", - "integrity": "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==" + "integrity": "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==", + "peer": true }, "node_modules/value-equal": { "version": "1.0.1", @@ -67637,8 +67697,7 @@ "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "license": "MIT" + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, "node_modules/w3c-hr-time": { "version": "1.0.2", @@ -67694,7 +67753,8 @@ }, "node_modules/warning": { "version": "4.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", "dependencies": { "loose-envify": "^1.0.0" } @@ -68300,7 +68360,6 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -68316,7 +68375,6 @@ }, "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", - "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -68330,7 +68388,6 @@ }, "node_modules/wrap-ansi-cjs/node_modules/color-convert": { "version": "2.0.1", - "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -68341,17 +68398,14 @@ }, "node_modules/wrap-ansi-cjs/node_modules/color-name": { "version": "1.1.4", - "dev": true, "license": "MIT" }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", - "dev": true, "license": "MIT" }, "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -68359,7 +68413,6 @@ }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -68452,7 +68505,6 @@ "version": "2.6.1", "resolved": "https://registry.npmjs.org/xml-formatter/-/xml-formatter-2.6.1.tgz", "integrity": "sha512-dOiGwoqm8y22QdTNI7A+N03tyVfBlQ0/oehAzxIZtwnFAHGeSlrfjF73YQvzSsa/Kt6+YZasKsrdu6OIpuBggw==", - "license": "MIT", "dependencies": { "xml-parser-xo": "^3.2.0" }, @@ -68482,7 +68534,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/xml-parser-xo/-/xml-parser-xo-3.2.0.tgz", "integrity": "sha512-8LRU6cq+d7mVsoDaMhnkkt3CTtAs4153p49fRo+HIB3I1FD1o5CeXRjRH29sQevIfVJIcPjKSsPU/+Ujhq09Rg==", - "license": "MIT", "engines": { "node": ">= 10" } @@ -68547,7 +68598,7 @@ "version": "0.0.43", "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", - "license": "Apache-2.0" + "peer": true }, "node_modules/yargs": { "version": "17.7.2", diff --git a/package.json b/package.json index 26f3d248de..fe72db9b83 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "clsx": "^1.2.1", "docusaurus-plugin-image-zoom": "^2.0.0", "docusaurus-plugin-sass": "^0.2.5", - "docusaurus-theme-openapi-docs": "0.0.0-949", + "docusaurus-theme-openapi-docs": "^4.3.1", "fuse.js": "^6.6.2", "node-fetch": "^3.1.0", "p-ratelimit": "^1.0.1", From 986337a48ec8ae56f30d2b2ec7449b16958606ad Mon Sep 17 00:00:00 2001 From: Amanda Churi Filanowski Date: Fri, 20 Dec 2024 11:25:27 -0500 Subject: [PATCH 5/7] docs: DOC-1529: Add PCP-3592 to release notes (#5103) * Add PCP-3592 to release notes * Minor correction --- docs/docs-content/release-notes/release-notes.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/docs-content/release-notes/release-notes.md b/docs/docs-content/release-notes/release-notes.md index 523ff0dc2e..9401c19e8a 100644 --- a/docs/docs-content/release-notes/release-notes.md +++ b/docs/docs-content/release-notes/release-notes.md @@ -394,6 +394,10 @@ guide to learn how to create a Cluster Group. | ---------------------- | ----------- | | vSphere No-Provisioner | 1.0.0 | +### Bug Fixes + +- Fixed an issue where cluster tags were not propagated to AWS volumes when creating new AWS IaaS clusters. + ## October 26, 2024 - Release 4.5.5 ### Breaking Changes From 3ddd13a704df7cf64c55dea3a4d54a531402ea7a Mon Sep 17 00:00:00 2001 From: Lenny Chen <55669665+lennessyy@users.noreply.github.com> Date: Fri, 20 Dec 2024 11:50:12 -0800 Subject: [PATCH 6/7] docs: enable AWS STS (#5101) * docs: create partial * docs: fix gitleak * docs: DOC-1528 (#5084) * docs: slack notification for release to production (gh-action) (#5083) * docs: slack notif draft for release gh-action * docs: amend slack notif description * docs: add slack notification for all jobs in release * docs: try ubuntu as runs-on * docs: set runs-on tags back * docs: fix URL formatting for slack notif * docs: remove test failure step * docs: add current step failure logic * docs: fix indentation * docs: add some step failures * docs: remove force failure * Apply suggestions from code review Co-authored-by: Karl Cardenas <29551334+karl-cardenas-coding@users.noreply.github.com> --------- Co-authored-by: Karl Cardenas <29551334+karl-cardenas-coding@users.noreply.github.com> * docs: add backlinks * docs: copy edits * docs: copy edit * Apply suggestions from code review Co-authored-by: Adelina Simion <43963729+addetz@users.noreply.github.com> * ci: auto-formatting prettier issues * docs: DOC-1518: Getting Started cleanup (#5042) * Initial Getting Started cleanup * Updates to Deploy Cluster Profile page * Minor parallel fix and package.json output update for deploy custom add-on pack tutorial * Updates to scale cluster section * Copying certain AWS changes over to other provider tutorials * Updated filter image for Azure clusters * ci: auto-formatting prettier issues * Optimised images with calibre/image-actions * Fixed ableism with see * ci: auto-formatting prettier issues --------- Co-authored-by: achuribooks Co-authored-by: vault-token-factory-spectrocloud[bot] <133815545+vault-token-factory-spectrocloud[bot]@users.noreply.github.com> * chore: upgrade docusaurus-theme-openapi-docs plugin (#5111) * chore: upgrade docusaurus-theme-openapi-docs plugin * docs: trigger visual tests * docs: DOC-1529: Add PCP-3592 to release notes (#5103) * Add PCP-3592 to release notes * Minor correction --------- Co-authored-by: Karl Cardenas <29551334+karl-cardenas-coding@users.noreply.github.com> Co-authored-by: Ben Radstone <56587332+benradstone@users.noreply.github.com> Co-authored-by: Adelina Simion <43963729+addetz@users.noreply.github.com> Co-authored-by: lennessyy Co-authored-by: Amanda Churi Filanowski Co-authored-by: achuribooks Co-authored-by: vault-token-factory-spectrocloud[bot] <133815545+vault-token-factory-spectrocloud[bot]@users.noreply.github.com> Co-authored-by: caroldelwing --- _partials/self-hosted/_aws-sts-config.mdx | 96 +++++++++++++++++++ .../add-backup-location-dynamic.md | 18 ++-- .../public-cloud/aws/add-aws-accounts.md | 40 ++++---- .../configure-aws-sts-account.md | 12 +++ .../configure-aws-sts-account.md | 12 +++ 5 files changed, 154 insertions(+), 24 deletions(-) create mode 100644 _partials/self-hosted/_aws-sts-config.mdx create mode 100644 docs/docs-content/enterprise-version/system-management/configure-aws-sts-account.md create mode 100644 docs/docs-content/vertex/system-management/configure-aws-sts-account.md diff --git a/_partials/self-hosted/_aws-sts-config.mdx b/_partials/self-hosted/_aws-sts-config.mdx new file mode 100644 index 0000000000..763cf5f8c1 --- /dev/null +++ b/_partials/self-hosted/_aws-sts-config.mdx @@ -0,0 +1,96 @@ +--- +partial_category: self-hosted +partial_name: sts-config +--- + +{props.edition} allows tenants to use AWS Secret Token Service (STS) to add AWS cloud accounts to their {props.edition} environment. +In order to do this, {props.edition} relies on another AWS cloud account that is configured on the {props.edition} instance +to assume a custom role created on the tenant's AWS account. + +This custom role establishes a trust relationship between the tenant's AWS account and the AWS account bound to the {props.edition} instance. +It allows the {props.edition}-bound AWS account to receive temporary credentials from the tenant's AWS account to deploy infrastructure in AWS using STS. For more information on how to add an AWS cloud account to a tenant using STS, refer to the guide. + +You must configure your {props.edition} instance with an STS AWS account before your tenants can add AWS cloud accounts +to deploy clusters in AWS using STS. Without this configuration, the STS option will be greyed out when your tenants try to add an AWS account. + +## Prerequisites + +- Access to the {props.edition} system console. + +- The role of Root Administrator or Account Administrator. + +- An AWS IAM user that is allowed to assume cross-account IAM roles. + +## Enable Adding AWS Accounts Using STS + +1. Open a terminal session. + +2. Log in to the {props.edition} System API by using the `/v1/auth/syslogin` endpoint. + Use the curl command below and replace the `example.com` placeholder URL with the URL of your {props.edition} instance. + Ensure you replace the credentials below with your system console credentials. + + ```shell + TOKEN=$(curl --insecure --location 'https://example.com/v1/auth/syslogin' \ + --header 'Content-Type: application/json' \ + --data '{ + "password": "**********", + "username": "**********" + }') + ``` + +3. Next, prepare a payload for the AWS account you want to configure. + Use the following JSON payload as a template and replace the `accessKey`, `secretKey`, and `accountId` fields with the AWS access key, secret key, and account ID of your AWS account. + + ```json + CONFIG_JSON=$(cat < + + + + ```bash + curl --request POST \ + --url https:///v1/system/config/aws/account \ + --header 'Authorization: $TOKEN' \ + --data '$CONFIG_JSON' + ``` + + + + + + ```bash + curl --request POST \ + --url https:///v1/system/config/awsgov/sts/account \ + --header 'Authorization: $TOKEN' \ + --data '$CONFIG_JSON' + ``` + + + + + + +## Validate + +Issue the following command to make an API call that confirms that the credentials were configured successfully. + +```bash +curl --request POST \ + --url https:///v1/system/config/aws/account \ + --header 'Authorization: $TOKEN' +``` + +If you receive a response that contains the payload you configured, the configuration was successful. diff --git a/docs/docs-content/clusters/cluster-management/backup-restore/add-backup-location-dynamic.md b/docs/docs-content/clusters/cluster-management/backup-restore/add-backup-location-dynamic.md index d57621fb67..28918e3d72 100644 --- a/docs/docs-content/clusters/cluster-management/backup-restore/add-backup-location-dynamic.md +++ b/docs/docs-content/clusters/cluster-management/backup-restore/add-backup-location-dynamic.md @@ -20,8 +20,6 @@ To support dynamic credentials with AWS, Palette uses the AWS Security Token Ser can use AWS STS when adding an S3 bucket as the backup location. The following sections outline the prerequisites and provide detailed steps to add an S3 bucket as the backup location using the STS authentication method. -
- :::warning Palette supports AWS STS only when your Palette’s hosting environment and the backup location service provider are the @@ -46,6 +44,11 @@ cloud account. ### Prerequisites +- If you are using a self-hosted Palette or Vertex instance, you must configure an AWS account at the instance-level to + allow tenants to add AWS accounts using STS. For more information, refer to + [Enable Adding AWS Accounts Using STS - Palette](../../../enterprise-version/system-management/configure-aws-sts-account.md) + or [Enable Adding AWS Accounts Using STS - VerteX](../../../vertex/system-management/configure-aws-sts-account.md) + - Both your Palette environment instance and the S3 bucket are hosted on AWS. This prerequisite is more applicable to self-hosted Palette and Palette VerteX customers. Palette SaaS in hosted in an AWS environment. @@ -114,8 +117,6 @@ cloud account. ::: -
- ### Instructions 1. Log in to [Palette](https://console.spectrocloud.com/). @@ -194,8 +195,6 @@ AWS STS to authenticate Palette with the S3 bucket in the same AWS account you d 4. Search for the newly added backup location in the list. The presence of the backup location validates that you successfully added a new backup location. -
- ## Multiple Cloud Accounts with AWS STS Suppose your Kubernetes cluster is deployed in _AWS Account A_, and you want to create the backup in _AWS Account B_, @@ -220,10 +219,13 @@ A multi-cloud account scenario requires you to perform the following authenticat Use the following steps to add an S3 bucket as the backup location using the STS authentication method when you have multiple cloud accounts. -
- ### Prerequisites +- If you are using a self-hosted Palette or Vertex instance, you must configure an AWS account at the instance-level to + allow tenants to add AWS accounts using STS. For more information, refer to + [Enable Adding AWS Accounts Using STS - Palette](../../../enterprise-version/system-management/configure-aws-sts-account.md) + or [Enable Adding AWS Accounts Using STS - VerteX](../../../vertex/system-management/configure-aws-sts-account.md) + - Both your Palette environment instance and the S3 bucket are hosted on AWS. This prerequisite is more applicable to self-hosted Palette and Palette VerteX customers. Palette SaaS is hosted in an AWS environment. diff --git a/docs/docs-content/clusters/public-cloud/aws/add-aws-accounts.md b/docs/docs-content/clusters/public-cloud/aws/add-aws-accounts.md index 675e16ebb1..3a4241f78a 100644 --- a/docs/docs-content/clusters/public-cloud/aws/add-aws-accounts.md +++ b/docs/docs-content/clusters/public-cloud/aws/add-aws-accounts.md @@ -49,6 +49,10 @@ Use the steps below to add an AWS cloud account using Security Token Service (ST #### Prerequisites +- If you are using a self-hosted instance of Palette or VerteX, you must configure an AWS account at the instance-level + to allow tenants to add AWS accounts using STS. For more information, refer to + [Enable Adding AWS Accounts Using STS - Palette](../../../enterprise-version/system-management/configure-aws-sts-account.md) + or [Enable Adding AWS Accounts Using STS - VerteX](../../../vertex/system-management/configure-aws-sts-account.md) - An AWS account. - Sufficient access to create an IAM role or IAM user. - Palette IAM policies. Review the [Required IAM Policies](required-iam-policies.md) section for guidance. @@ -70,14 +74,14 @@ Use the steps below to add an AWS cloud account using Security Token Service (ST 5. You will be provided with information on the right side of the wizard. You will need this information to create an IAM Role for Palette. The following table lists the information provided by the wizard after you select **STS**. - | **Parameter** | **Description** | - | ----------------------- | ------------------------------------------------ | - | **Trusted Entity Type** | Another AWS account | - | **Account ID** | Copy the Account ID displayed on the UI | - | **Require External ID** | Enable | - | **External ID** | Copy the External ID displayed on the UI | - | **Permissions Policy** | Search and select the 4 policies added in step 2 | - | **Role Name** | SpectroCloudRole | + | **Parameter** | **Description** | + | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | **Trusted Entity Type** | Another AWS account. | + | **Account ID** | Copy the Account ID displayed on the UI. If using a self-hosted instance, this is the same AWS account that you configured for your Palette or VerteX instance to enable STS. | + | **Require External ID** | Enable. | + | **External ID** | Copy the External ID displayed on the UI. This ID is generated by Palette or VerteX and is different per tenant. | + | **Permissions Policy** | Search and select the 4 policies added in step 2. | + | **Role Name** | SpectroCloudRole. | 6. In the AWS console, create a new IAM role for Palette. Use the following resources if you need additional help. @@ -161,6 +165,10 @@ Use the steps below to add an AWS cloud account using STS credentials. #### Prerequisites +- If you are using a self-hosted instance of Palette or VerteX, you must configure an AWS account at the instance-level + to allow tenants to add AWS accounts using STS. For more information, refer to + [Enable Adding AWS Accounts Using STS - Palette](../../../enterprise-version/system-management/configure-aws-sts-account.md) + or [Enable Adding AWS Accounts Using STS - VerteX](../../../vertex/system-management/configure-aws-sts-account.md) - An AWS account - Sufficient access to create an IAM role or IAM user. - Palette IAM policies. Please review the [Required IAM Policies](required-iam-policies.md) section for guidance. @@ -182,14 +190,14 @@ Use the steps below to add an AWS cloud account using STS credentials. 5. You will be provided with information on the right side of the wizard. You will need this information to create an IAM Role for Palette. The following table lists the information provided by the wizard after you select **STS**. - | **Parameter** | **Description** | - | ----------------------- | ------------------------------------------------- | - | **Trusted Entity Type** | Another AWS account | - | **Account ID** | Copy the Account ID displayed on the UI | - | **Require External ID** | Enable | - | **External ID** | Copy the External ID displayed on the UI | - | **Permissions Policy** | Search and select the 4 policies added in step #2 | - | **Role Name** | SpectroCloudRole | + | **Parameter** | **Description** | + | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | **Trusted Entity Type** | Another AWS account. | + | **Account ID** | Copy the Account ID displayed on the UI. If using a self-hosted instance, this is the same AWS account that you configured for your Palette or VerteX instance to enable STS. | + | **Require External ID** | Enable. | + | **External ID** | Copy the External ID displayed on the UI. This ID is generated by Palette or VerteX and is different per tenant. | + | **Permissions Policy** | Search and select the 4 policies added in step #2. | + | **Role Name** | SpectroCloudRole. | 6. In the AWS console, create a new IAM role for Palette. Use the following resources if you need additional help. diff --git a/docs/docs-content/enterprise-version/system-management/configure-aws-sts-account.md b/docs/docs-content/enterprise-version/system-management/configure-aws-sts-account.md new file mode 100644 index 0000000000..288ecd76b5 --- /dev/null +++ b/docs/docs-content/enterprise-version/system-management/configure-aws-sts-account.md @@ -0,0 +1,12 @@ +--- +sidebar_label: "Enable Adding AWS Accounts Using STS " +title: "Enable Adding AWS Accounts Using STS " +description: "This page teaches you how to allow tenants to add AWS accounts using STS." +icon: "" +hide_table_of_contents: false +sidebar_position: 20 +tags: ["palette", "management", "account", "credentials"] +keywords: ["self-hosted", "palette"] +--- + + diff --git a/docs/docs-content/vertex/system-management/configure-aws-sts-account.md b/docs/docs-content/vertex/system-management/configure-aws-sts-account.md new file mode 100644 index 0000000000..8ac1ff8a60 --- /dev/null +++ b/docs/docs-content/vertex/system-management/configure-aws-sts-account.md @@ -0,0 +1,12 @@ +--- +sidebar_label: "Enable Adding AWS Accounts Using STS" +title: "Enable Adding AWS Accounts Using STS " +description: "This page teaches you how to allow tenants to add AWS accounts using STS." +icon: "" +hide_table_of_contents: false +sidebar_position: 20 +tags: ["palette", "management", "account", "credentials"] +keywords: ["self-hosted", "vertex"] +--- + + From 2d142f0b9c76f175f74ef8d39faaa929b3804fd5 Mon Sep 17 00:00:00 2001 From: Lenny Chen <55669665+lennessyy@users.noreply.github.com> Date: Fri, 20 Dec 2024 13:55:06 -0800 Subject: [PATCH 7/7] docs: Workspace refactor (#5064) * docs: start working on the create page * docs: more workspace refactor work * docs: progress on workspace refactor * docs: finish workspace pages * docs: fix broken lilnk * docs: remove feature page * docs: broken link fix * docs: edit workspaces * docs: copy edits * docs: add backup page * docs: add backup & restore sections * docs: adjust page order * docs: add more examples * docs: modify example * docs: add restore options * docs: vale * Apply suggestions from code review Co-authored-by: caroldelwing * Update docs/docs-content/workspace/workspace-mgmt/delete-workspace.md * Apply suggestions from code review Co-authored-by: caroldelwing * Apply suggestions from code review Co-authored-by: caroldelwing --------- Co-authored-by: caroldelwing --- .../backup-restore/backup-restore.md | 5 +- .../rbac/vm-roles-permissions.md | 5 +- .../workspace/adding-a-new-workspace.md | 156 +++-- .../workspace/workload-features.md | 545 ------------------ .../workspace-mgmt/backup-restore.md | 157 +++++ .../workspace-mgmt/configure-rbac.md | 159 +++++ .../workspace-mgmt/delete-workspace.md | 47 ++ .../workspace/workspace-mgmt/resource-mgmt.md | 107 ++++ .../workspace-mgmt/restrict-images.md | 53 ++ .../workspace-mgmt/workspace-mgmt.md | 25 + docs/docs-content/workspace/workspace.md | 71 ++- 11 files changed, 697 insertions(+), 633 deletions(-) delete mode 100644 docs/docs-content/workspace/workload-features.md create mode 100644 docs/docs-content/workspace/workspace-mgmt/backup-restore.md create mode 100644 docs/docs-content/workspace/workspace-mgmt/configure-rbac.md create mode 100644 docs/docs-content/workspace/workspace-mgmt/delete-workspace.md create mode 100644 docs/docs-content/workspace/workspace-mgmt/resource-mgmt.md create mode 100644 docs/docs-content/workspace/workspace-mgmt/restrict-images.md create mode 100644 docs/docs-content/workspace/workspace-mgmt/workspace-mgmt.md diff --git a/docs/docs-content/clusters/cluster-management/backup-restore/backup-restore.md b/docs/docs-content/clusters/cluster-management/backup-restore/backup-restore.md index e40a1f1b0e..9e18bd28e6 100644 --- a/docs/docs-content/clusters/cluster-management/backup-restore/backup-restore.md +++ b/docs/docs-content/clusters/cluster-management/backup-restore/backup-restore.md @@ -42,8 +42,9 @@ To get started with creating a backup, check out the :::info -If you are using a workspace, refer to the [Manage Palette Workspace](../../../workspace/workload-features.md) guide to -learn more about backup and restore actions for a workspace. +If you are using a workspace, refer to the +[Manage Palette Workspace](../../../workspace/workspace-mgmt/workspace-mgmt.md) guide to learn more about workspace +backup and restore actions. ::: diff --git a/docs/docs-content/vm-management/rbac/vm-roles-permissions.md b/docs/docs-content/vm-management/rbac/vm-roles-permissions.md index f42aac7b13..e2180a1232 100644 --- a/docs/docs-content/vm-management/rbac/vm-roles-permissions.md +++ b/docs/docs-content/vm-management/rbac/vm-roles-permissions.md @@ -37,7 +37,4 @@ to specify bindings to configure granular Role-Based Access Control (RBAC) rules You can configure namespaces and RBAC from within a cluster or from a Palette workspace that contains a cluster group. In a cluster group, all RoleBindings must occur at the namespace level. For details, review the [Cluster RBAC](../../clusters/cluster-management/cluster-rbac.md) and -[workspace RBAC](../../workspace/workspace.md#role-based-access-controlrbac) guides. - -Palette leverages Regex Pattern matching so you can select multiple namespaces to apply role bindings. Check out -[Regex for Namespaces](../../workspace/workload-features.md#regex-for-namespaces) to learn more. +[workspace RBAC](../../workspace/workspace-mgmt/configure-rbac.md) guides. diff --git a/docs/docs-content/workspace/adding-a-new-workspace.md b/docs/docs-content/workspace/adding-a-new-workspace.md index bc52c7a142..2beec35090 100644 --- a/docs/docs-content/workspace/adding-a-new-workspace.md +++ b/docs/docs-content/workspace/adding-a-new-workspace.md @@ -1,68 +1,136 @@ --- -sidebar_label: "Adding a Workspace" -title: "Adding a workspace" -description: "How to create multi-cluster workspace in Palette" +sidebar_label: "Create a Workspace" +title: "Create a Workspace" +description: "How to create a multi-cluster workspace in Palette." icon: "" hide_table_of_contents: false sidebar_position: 0 tags: ["workspace"] --- -Palette enables multi-cluster management and governance capabilities by introducing Workspaces. This section explains -how a workspace can be created in the Palette console. +Palette enables multi-cluster management and governance capabilities by introducing workspaces. This page teaches you +how to create a workspace in Palette. All workspace settings can be updated after creation. ## Prerequisites -- One or more running workload clusters within the project. -- Cluster must not be imported with read-only mode. -- RBAC should not be set at cluster level but to be included at workspace level. -- Palette Virtual Clusters cannot be part of the workspace. +- One or more active workload clusters within the project where the workspace is to be created. The clusters cannot be + imported in read-only mode. Palette virtual clusters also cannot be part of a workspace. +- You have the permission to create workspaces. For more information, refer to + [Permissions](../user-management/palette-rbac/permissions.md). ## Create Your Workspace -1. Add the Basic Information Provide the basic information for the workspace such as: +1. Log in to [Palette](https://console.spectrocloud.com). - - Unique Name - - Optional Description - - Optional Tag +2. In the **Drop-Down Menu** at the top of the page, choose the project you want to create the workspace in. Workspaces + are always scoped to a project. -2. Associate Clusters +3. On the left **Main Menu**, click **Workspaces**. Then click **New Workspace**. - - Select the clusters to be added to the workspace. (See [New Clusters](../clusters/clusters.md) to learn how to add - a new Cluster.) Palette clusters, as well as brownfield clusters, can be added to your workspace. +4. Provide the basic information for the workspace. - - Configure the Cluster Role Binding (optional). Role bindings can be created on all workspace clusters. + - **Name**: The workspace name must be unique in the project. + - **Description**: An optional description for the workspace. + - **Tag**: Optional tags for the workspace. - - As step 2 of the new Workspace creation, select **Add Cluster Role Binding**. - - Provide the name of the role for which the cluster role binding needs to be created. The role should be - pre-existing or an in-built system role. Palette does not create cluster roles. - - Subjects for the cluster role binding can be groups, users, or service accounts. + When you are finished, click **Next**. - | **Subject Type** | **Subject Name** | **Subject Namespace** | - | ------------------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | - | **User** | a valid path segment name | NA | - | **Group** | a valid path segment name | NA | - | **Service Account** | a valid path segment name | Granting super-user access to all service accounts
cluster-wide is strongly discouraged. Hence, grant a
role to all service accounts in a namespace. | +5. Choose clusters you want to include in the workspace. A cluster may be included in multiple workspaces. Refer to + [Create a Cluster](../clusters/clusters.md) to learn how to add a new cluster. -3. Associate Namespaces +6. On the **Clusters** page, you can optionally create cluster role bindings. To create a new cluster role binding, + click **Add New Binding**. Enter the name of the cluster role you want to reference in the cluster role binding. - - Enter one or more namespaces that need to be part of the workspace. The combination of workspace and cluster is - unique across workspaces in a project. Palette ensures that all the namespaces are created for all the clusters in - the workspaces, in case they are not pre-existing. - - Add the resource quota for the namespaces by specifying CPU and Memory limits (optional). - - Configure the Role Binding (optional). The following information is required for each role binding: - - Select a namespace name or the Regex for namespaces for selecting multiple namespaces. - - Specific name for the role which is pre-existing - - Make the selection of Subjects from the dropdown list (User, Group, or ServiceAccount). For the subject selected, - provide a valid path segment name. For the subject, ServiceAccount select namespace name as granting super-user - access to all service accounts cluster-wide is strongly discouraged due to security concerns. - - Confirm the information provided to complete the configuration of role binding. + After specifying the role, you need to specify the subject to which the cluster role binding is applied to. Select + the subject type and then enter the name of the subject. The name of the subject must be the same as it is defined in + the cluster. -4. Settings + :::info - - [Schedule Backups](../clusters/cluster-management/backup-restore/backup-restore.md) - set the backup and restore - policies. - - [Container Image](workload-features.md#restrict-container-images-to-a-workspace) - list out the container images to - be restricted within a Workspace namespace. + Unlike Palette RBAC, the users you reference here are Kubernetes user objects in the cluster, not users in your + Palette environment. -Review and finish the configuration and complete the deployment. + ::: + + While this action will create the same role binding across all the clusters that are part of the workspace, it does + not define the cluster role nor the subject the role is bound to. You need to define the role yourself in each + cluster as well as define the subject the role is bound to. Otherwise, the cluster role binding will not have any + effect. + + :::info + + If the cluster role in each cluster has different permissions, then the subjects that the role is bound to will also + have different permissions across clusters, even though they have the same cluster role binding. The same applies to + namespace-scoped role bindings defined in the next step. + + ::: + +7. Enter the namespaces you want to include in the workspace. If a cluster that is part of your workspace has that + namespace, the namespace and all resources that are scoped within it will be included in the workspace. If any + cluster in the workspace is missing the namespace you entered, the namespace will be created on that cluster. + + You must use the names of the namespaces exactly, not regular expressions. The regular expression entries are only + used for creating role bindings in a later step. + +8. After selecting the namespaces, you can specify resource limits that the workspace is allowed to consume in the + **Workspace Quota** section. The **Maximum CPU** and **Maximum Memory** allow you to specif the maximum amount of CPU + cores and memory that all resources in the entire workspace are allowed to consume. + +9. You may also specify resource limits on specific namespaces. + + For example, if you have two clusters, `cluster1` and `cluster2`, and they each have a namespace called `default`. If + you impose a 2 Gi memory limit on the namespace default, then the `default` namespace in both clusters will be able + to consume 2 Gi memory each. For more information about resource quotas, refer to + [Resource Management](./workspace-mgmt/resource-mgmt.md). + + You must ensure that the namespaced limits, when added together, do not exceed the total workspace limit you + configured. If you impose a workspace quota of 4 Gi memory for a two-cluster workspace, then a namespace cannot have + more than 2 Gi of memory as its limit, since there are two such namespaces in the workspace and both of them added + together are allowed 4 Gi of memory. + +10. On the same **Namsespaces** page, you can optionally configure role bindings. When you configure a role binding for + a namespace, you are configuring the same role binding in that namespace in every cluster. Like in Kubernetes, you + can use either a role or a cluster role in a role binding. Similar to cluster role bindings, this action does not + create the roles or the subject for you. You must ensure that the corresponding role and subject referenced in the + role binding exists in the namespaces you configured. + + You can use Regular Expressions (regex) to create role bindings in multiple namespaces that match a certain pattern. + To do so, enter the regex in the namespace field. For example, `/palette-.*/` will match all namespaces that start + with `palette-`. When creating the role binding, you can select the regex as the namespace. + + :::info + + Regex entries in the **Namespaces** field do not add the namespaces that match the regex to the workspace. You will + not be able to monitor resource usage, impose resource limits, or create backups unless you specifically add a + namespace by its name. + + ::: + + When you are finished, click **Next**. + +11. In the **Setting** page, you can schedule backups for select namespaces. These backups are created for each cluster + in the workspace. + + Like cluster backups in Palette, restoring a backup requires the source cluster to be available. When you restore a + backup, the namespaces that are backed up are restored to each cluster in the workspace. If you delete a cluster + from the workspace, that cluster's backup will not be restored. + + For more information about backups, refer to + [Backup and Restore](../clusters/cluster-management/backup-restore/backup-restore.md). + +12. Lastly, you can restrict certain container images from being loaded in the namespaces that are managed by the + workspace. To restrict images from being loaded by resources in a namespace, click **Add New Container Image**. + Select a namespace you want to restrict the image in, and enter the image URLs in a comma-separated list. When you + are done, click **Next**. + +13. Review your configurations and click **Finish Configuration** to create the workspace. + +## Validate + +1. Log in to [Palette](https://console.spectrocloud.com). + +2. In the **drop-down Menu** at the top of the page, choose the project you created the workspace in. + +3. On the left **Main Menu**, click **Workspaces**. + +4. Confirm the workspace has been created with the right configurations. diff --git a/docs/docs-content/workspace/workload-features.md b/docs/docs-content/workspace/workload-features.md deleted file mode 100644 index 8ee5dee666..0000000000 --- a/docs/docs-content/workspace/workload-features.md +++ /dev/null @@ -1,545 +0,0 @@ ---- -sidebar_label: "Workspace Management" -title: "The additional features to optimize workspace performance" -description: "How to get unified view of workloads in logically grouped namespaces and clusters" -icon: "" -hide_table_of_contents: false -sidebar_position: 10 -tags: ["workspace"] ---- - -# Manage Palette Workspace - -Palette supports several day 2 operations to manage the end-to-end lifecycle of the Kubernetes clusters through -Workspaces. It also provides several capabilities across new and imported clusters to keep your clusters secure, -compliant, up to date, and perform ongoing management operations like Backup and Restore. Additionally, you can have -visibility into the workloads running inside your cluster and cluster costs. - -The following sections describe these capabilities in detail: - - - - -## Workload Visibility - -Workspace provides visibility into workloads deployed across clusters. - -| **Resource** | **Description availed from Workspace** | -| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Namespaces** | Cluster Specific namespaces with CPU and Memory utilization. | -| **Pods** | Lists all the pods running on a particular namespace with cluster names with the detailed health status, age, and resource utilization of each of them. | -| **Deployments** | All the running deployments specific to clusters belonging to the Workspace with namespace to which these deployments belong, pods details, replicas, and age are enumerated | -| **DaemonSets** | DaemonSet resource utilization is described, with details on namespaces, pods, and age of individual Daemon sets | -| **StatefulSets** | All the active StatefulSets specific to clusters belonging to the Workspace with corresponding namespace, pods details, replicas, and age are enumerated | -| **Jobs** | A Job creates one or more Pods and will continue to retry execution of the Pods until a specified number of them successfully terminate. | -| **CronJobs** | Cron Jobs are regularly scheduled actions or jobs such as backups, report generation, etc. Each of these jobs will recur as scheduled. | -| **RoleBinding** | A role binding grants the permissions defined in a role to a user or set of users. | -| **ClusterRoleBinding** | A Cluster Role binding defines the permissions defined across a cluster. | - - - - - -## Workspace Backup and Restore - -Palette users can create cluster backups from within a workspace (usually consisting of multiple clusters) and restore -them later time as desired. Palette allows granular controls within a workspace for users to perform specific tasks -within the workspace, without having the ability to update workspace details. To provide granular access within a -workspace for specific actions, Palette provides the following two Roles: - -## Workspace Operator - -Users assigned the **Workspace Operator** Role can only perform Backup and Restore actions within the Workspace. - -## Workspace Admin - -A Role that has all administrative permissions and privileges within the Workspace. - -## Create your Workspace Roles - -To create your **Workspace Role**, follow the steps below: - -1. Log in to the Palette Management Console as **Tenant Admin**. - -2. Go to the **Users and Teams** option. - -3. From the listed users, select the user to be assigned with Workspace Roles. Check out the - [Create a User](../user-management/users-and-teams/create-user.md) guide to learn how to create a user. - -4. Select the **Workspace Roles** tab and click **+ New Workspace Role** to create a new role. - -5. Fill the following information into the **Add Roles to User-Name** wizard: - - - Project - - Workspace - - Choose the role from the options: - - Workspace Admin - - Workspace Operator - -6. Confirm the information provided to complete the wizard. - -7. The user set with the Workspace Role can take Workspace-wide Backups and Restores in compliance with their - permissions and privileges. - -Palette leverages the BackUps to the following locations: - -- Amazon Web Services (AWS) S3 Buckets: [Prerequisites](#for-an-amazon-web-services-aws-bucket-as-backup-location), - [Configure your Backup](#configure-your-backup-in-aws-s3) - -- Google Cloud Platform (GCP) Buckets: [Prerequisites](#for-a-google-cloud-platform-gcp-backup-location), - [Configure your Backup](#configure-your-backup-in-gcp-bucket) - -- MinIO S3 Buckets: [Prerequisites](#for-minio-s3-backup), [Configure your Backup](#configure-your-backup-in-minio) - -- Azure Blob: [Prerequisites](#for-azure-blob-backup), - [Configure your Backup](#configure-your-backup-in-azure-azure-blob) - -## Prerequisites - -### For an Amazon Web Services (AWS) Bucket as Backup Location - -- The AWS S3 permissions listed in the next section need to be configured in the AWS account to provision Backup through - Palette. - -- Pre-create a bucket at the AWS or MinIO object-store. - -## For a Google Cloud Platform (GCP) Backup Location - -- GCP service account with a **Storage Admin** role. - -- Pre-create a bucket at the GCP object storage. - -### For MinIO S3 Backup - -- S3 bucket with Read/Write Access - -- A unique access key (username) and corresponding secret key (password) from MinIO Console. - -- Service provider certificate (Optional) - -### For Azure Blob Backup - -- An active Azure cloud account with the following pieces of information noted down: - - - Tenant Id - - Client Id - - Subscription Id - - Client Secret created - -- An - [Azure storage account](https://learn.microsoft.com/en-us/azure/storage/common/storage-account-create?tabs=azure-portal) - created with the following information to be noted down for Palette use: - - - Storage Name: Custom name given to the Azure storage created. - - Stock-keeping unit - -- A container to be created in the Azure Storage account - -## Backup Locations - -AWS Simple Cloud Storage (S3) and other S3 compliant object stores such as MinIO and GCP Buckets are currently supported -as backup locations. These locations can be configured and managed under the **Project** > **Settings** option and can -be selected as a backup location, while backing up any cluster in the project. - -### Configure your Backup in AWS S3 - -The following details are required to configure a backup location in AWS: - -1. **Location Name** - Name of your choice. - -2. **Location Provider** - AWS (This is currently the only choice on the UI. Choose this option when backing up to AWS - S3 or any S3 compliance object store). - -3. **Certificate** - Required for MinIO. - -4. **S3 Bucket** - S3 bucket name must be pre-created on the object-store. - -5. **Configuration** - region=\{region-name},s3ForcePathStyle=\{true/false},s3Url=\{S3 URL}. S3 URL need not be provided - for AWS S3. - -6. **Account Information** - Details of the account which hosts the S3 bucket to be specified as Credentials or STS. - - - Credentials - Provide access key and secret key. - - STS - Provide the ARN and External ID of the IAM role that has permission to perform all S3 operations. The STS - role provided in the backup location should have a trust set up with the account used to launch the cluster itself - and should have the permission to assume the role. - -7. Palette mandates the AWS S3 Permissions while users use the static role to provision worker nodes. - - #### AWS S3 Permissions - - ```json - { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Action": [ - "ec2:DescribeVolumes", - "ec2:DescribeSnapshots", - "ec2:CreateTags", - "ec2:CreateVolume", - "ec2:CreateSnapshot", - "ec2:DeleteSnapshot" - ], - "Resource": "*" - }, - { - "Effect": "Allow", - "Action": [ - "s3:GetObject", - "s3:DeleteObject", - "s3:PutObject", - "s3:AbortMultipartUpload", - "s3:ListMultipartUploadParts" - ], - "Resource": ["arn:aws:s3:::BUCKET-NAME/*"] - }, - { - "Effect": "Allow", - "Action": ["s3:ListBucket"], - "Resource": ["arn:aws:s3:::BUCKET-NAME"] - } - ] - } - ``` - - #### Trust Setup Example - - ```json - { - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Principal": { - "AWS": "arn:aws:iam::141912899XX99:root" - }, - "Action": "sts:AssumeRole", - "Condition": {} - } - ] - } - ``` - -### Configure your Backup in GCP Bucket - -These locations can be configured and managed from the **Settings** option under **Project** and can be selected as a -backup location while backing up any cluster in the project. - -The following details are required to configure a backup location in GCP: - -1. **Location Name** - Name of your choice. - -2. **Location Provider** - Google Cloud (Choose this option when backing up to the GCP bucket object store). - -3. **Bucket** - The name of the bucket name pre-created on the object store. - -4. **JSON Credentials** - For external authentication of the GCP storage. - -### Configure your Backup in MinIO - -The following details are required to configure a backup location in AWS: - -1. **Location Name**: Name of your choice. - -2. **Location Provider**: Minio - -3. **Certificate**: Optionally required for MinIO. - -4. **S3 Bucket**: S3 bucket name must be pre-created on the MinIO object-store. - -5. **Region**: Region in which the S3 bucket is created. Example: us-east-1 - -6. **S3 URL**: Url of the MinIO object storage console. Example: `http://12.123.234.567:0000` - -7. **Force S3 path style** : To force S3 pathstyle addressing or else the url will be converted to virtual-hosted style - addressing with bucket name appended to the url.This is an optional setting. - -8. **Authenticate** using MinIo access key and secret access key. - -9. Click **Create** to complete the location creation wizard. - -### Configure your Backup in Azure: Azure Blob - -The following details are required to configure a backup location in Azure: - -1. **Location Name**: A custom name for the storage location getting created. - -2. **Location Provider:** Select **Azure** from the drop-down. - -3. **Container Name:** The container created in Azure Storage. - -4. **Storage Name**: Name of the Azure storage created. - -5. **Stock-Keeping Unit**: Information from the Azure storage. - -6. **Resource Group:** Azure Resource Group name - -7. **Tenant ID:** Azure Account Credential. - -8. **Client ID:** Azure Account Credential. - -9. **Subscription ID**: Azure Account Credential. - -10. **Client Secret:** Secret created in the Azure console needs to be validated. - -11. Click **Create** to complete the location creation wizard. - -## Add a Backup Location - -Go to **Project Settings** > **Backup locations** > **Add a New Backup location**. - -## Create a Workspace Backup - -Backups can be scheduled or initiated in an on demand basis, during the workspace creation. The following information is -required for configuring a Workspace Backup, on demand- - -1. **Backup Prefix / Backup Name**: For scheduled backup, a name will be generated internally, add a prefix of our - choice to append with the generated name. For an on demand backup, a name of user choice can be used. - -2. Select the Backup location. - -3. **Backup Schedule** - Create a backup schedule of your choice from the dropdown list, applicable only to scheduled - backups. - -4. **Expiry Date** - Select an expiry date for the backups. The backup will be automatically removed on the expiry date. - -5. **Include all disks** - Optionally, backup persistent disks as part of the backup. - -6. **Include Cluster Resources** - Select or deselect on your choice. - - | On Demand Backup | - | ------------------------------------------------------------------------ | - | Select the **Workspace to Backup** > **Settings** > **Schedule Backups** | - - | Scheduled Backup | - | ----------------------------------------------------------- | - | **Workspace Creation** > **Policies** > **Backup Policies** | - -## Backup Scheduling Options - -Both the cluster and workspace backup support the following scheduling options: - -- Customize your backup for the exact month, day, hour, and minute of the user's choice. -- Every week on Sunday at midnight -- Every two weeks at midnight -- Every month on the 1st at midnight -- Every two months on the 1st at midnight - -## Restore a Backup - -Backups created manually or as part of the schedule are listed under the Backup/Restore page of the cluster. - -1. Restore operation can be initiated by selecting the restore option for a specific backup. - -2. Next, you will be prompted to select a target cluster where you would like the backup to be restored. The progress of - the restore operation can be tracked from the target cluster's Backup/Restore page. - -3. Finally, restore operations can be done to the cluster running on the same project. - -## Restore Your Backup - -To initiate a restore operation: - -1. Log in to the Palette console as the **Project Admin** and go to **Workspaces** page. - -2. Select the **Workspace Name** to be restored. - -3. From the selected Workspace overview, select **Backups** from the top menu. - -4. The Backup option lists all the backups scheduled for the selected Workspace. Towards the name of the backup, click - the meatball (three horizontal dots) button to open the restore wizard. - -5. Click on the **Restore Backup** option to complete the wizard: - - - Choose of the namespaces to be restored - - Three options are available to filter the resources to be restored: - - - **Include Cluster Resources** - To restore all the cluster scoped resources. - - **Preserve Node Ports** - To preserve ports for node port service running in the cluster. - - **Restore PVs** - To restore the persistent volumes. - -
- - :::tip - - Check **Include Cluster Resource** and **Restore PVs** options together. - - ::: - -6. Make the appropriate choice of resources as per user requirements to complete the wizard. - -
- - - -## Workspace Quota - -Palette enables the users to limit resource usage within the workspace optionally. The Quota is specified in terms of -the maximum CPU and memory. Therefore, the resource utilization within the namespace should be below the Quota allocated -across all the clusters. - -## To set your Resource Quota: - -1. During [Step: 3 Associate Namespaces](./adding-a-new-workspace.md#create-your-workspace) of Namespace creation, - **Workspace Quota** can be set by giving the **Maximum CPU** and **Maximum Memory**. Then, all the clusters launched - within the Namespace can use the set Quota. - -2. Namespace Quota can be set for an already deployed workspace as: - `Workspace Settings -> Namespaces -> Workspace Quota` - -### Workspace Quota Notes: - -- The quota allocated to the workspace scope is split across all the namespaces under that workspace per their resource - requirements. - -- The palette allows quotas to be allocated to individual namespaces under a specific workspace. In that case, - individual clusters belonging to that namespace can utilize the quota per their resource requirements. When a - namespace is allocated with a quota, all the clusters belonging to that namespace get allocated with that resource - quota individually. - - **Example**: If Namespace palette-ns belongs to two (2) clusters, p1 and p2, and palette-ns is allocated a quota of 1 - CPU and 1 Gb memory, each of p1 and p2 gets allocated 1 CPU and 1 GB memory individually. - -- Palette allows quota to be allocated to individual clusters under a specific workspace. In that case, the allocated - quota should not exceed the namespace quota. - -- To set an unlimited quota, set the quota value as -1. - - If -1 is set as the quota for a cluster, then we cannot set a quota for the workspace to which the cluster belongs. - - If -1 is set as the quota for a Workspace, then we cannot set a quota for the clusters belonging that Workspace. - - - - -## Regex for Namespaces - -Palette leverages Regex Pattern matching to select multiple namespaces to apply Role binding concurrently. When we have -many namespaces to be configured for role binding, the user can provide a Regex pattern matching multiple namespaces -instead of giving a single namespace. This will help select all the namespaces matching the given Regex pattern to be -selected together for role binding. - -## Use Cases - -1. A Regex pattern that start and end with " / ", will select all the workspace names matching the given Regex pattern. - - **Example:** `/^palette-ns/` - -2. A Regex pattern that starts with `negation symbol(~)`, will select all the namespaces that _does not match_ with the - regex expression given. - - **Example:** `~/^(kube|cluster|capi|jet|cert)[-].+/` - - :::info - - No spaces to be added between the `~` operator and the `expression`. - - ::: - - - - - -## Workspace Role Binding - -Workspace Role Binding is a Project scope operation. There are two available options for setting up Roll Binding for a -Workspace: - -- **Cluster** to create a RoleBinding with cluster-wide scope (ClusterRoleBinding). - -- **Namespaces** to create a RoleBinding within namespaces scope (RoleBinding). - -Palette users can choose role creation based on their resource requirements. - -## Configure cluster role bindings - -- Login to Palette as Project admin and select the Workspace to which the Role Binding need to configured. - -- Select Settings -> Cluster - -- Select the clusters from the workspace to Role Bind. - -- Click on “Add new binding” to open the “Add Cluster Role Binding” wizard. Fill in the following details: - - - Role Name: Define a custom role name to identify the cluster role - - Subjects: Subjects are a group of users, services, or teams using the Kubernetes API. It defines the operations a - user, service, or a team can perform. There are three types of subjects: - - Subject Type: - - Users: These are global and meant for humans or processes living outside the cluster. - - Groups: Set of users. - - Service Accounts: Kubernetes uses service accounts to authenticate and authorize requests by pods to the - Kubernetes API server. These are namespaced and meant for intra-cluster processes running inside pods. - - Subject Name: Custom name to identify a subject. A single RoleBinding can have multiple subjects. - -- “Confirm” the information to complete the creation of the ClusterRoleBinding. - -## Configure role bindings: Namespace Scope - -Users can now allocate CPU and Memory [quotas](#workspace-quota) for each **namespace** at the cluster level. - -- Login to Palette as Project admin and select the Workspace to which the Role Binding need to be configured. - -- Select Cluster Settings -> Namespace. - -- Create a namespace with a custom name and add it to the list of the namespace by clicking on “add to the list”. - -- [Allocate resources](workload-features.md#workspace-quota) to the created namespace (CPU and Memory). - -- Click on “Add new binding” to open the “Add ClusterRoleBinding” wizard. Fill in the following details: - - - Namespace: Select the namespace from the drop-down Menu. The list will display the namespaces created during the - previous step. - - Role Type: Select the role type from the drop-down. Either Role or Cluster Role. - - :::info - - A RoleBinding may reference any Role in the same namespace. Alternatively, a RoleBinding can reference a ClusterRole - and bind that ClusterRole to the namespace of the RoleBinding. For example, if you want to bind a ClusterRole to all - the namespaces in your cluster, you use a ClusterRoleBinding. - - ::: - -- Role Name: Define a custom role name to identify the cluster role - -- Subjects: Subjects are a group of users, services, or teams using the Kubernetes API. It defines the operations a - user, service, or group can perform. There are three types of subjects: - - - Subject Type: - - Users: These are global, and meant for humans or processes living outside the cluster. - - Groups: Set of users. - - Service Accounts: Kubernetes uses service accounts to authenticate and authorize requests by pods to the - Kubernetes API server. These are name spaced and meant for intra-cluster processes running inside pods. - - Subject Name: Custom name to identify a subject. A single RoleBinding can have multiple subjects. - -- “Confirm” the information to complete the creation of the RoleBinding. - - - - - -## Restricted Container Images - -Palette users can restrict a few container images from getting deployed into a specific Namespace. This helps the -tenants from accidentally installing a delisted or unwanted container to that specific namespace. - -## Restrict container images to a workspace - -To restrict a container image for a particular namespace within the workspace: - -1. During [Step: 4 Settings](adding-a-new-workspace.md#create-your-workspace) of workspace creation, select the - **Container Images** tab from the left ribbon. - -2. Click on **+ Add New Container Image** and provide the **Namespace** and **Restricted Images**. Multiple images can - be restricted within a namespace by separating them with commas. - -## Restrict container images to a deployed workspace - -The user can add a list of restricted images to an already deployed workspace as: - -1. **Workspace Settings** > **Container Images** - -2. Click on **Add New Container Image** and provide the **Namespace** and **Restricted Images**. Multiple images can be - restricted within a Namespace by separating them with commas. - - -
diff --git a/docs/docs-content/workspace/workspace-mgmt/backup-restore.md b/docs/docs-content/workspace/workspace-mgmt/backup-restore.md new file mode 100644 index 0000000000..831b70a61b --- /dev/null +++ b/docs/docs-content/workspace/workspace-mgmt/backup-restore.md @@ -0,0 +1,157 @@ +--- +sidebar_label: Backup and Restore +title: Backup and Restore +description: "Learn how to configure backup and restore for your workspaces." +hide_table_of_contents: false +sidebar_position: 30 +tags: ["workspace"] +--- + +Palette allows you to create backups at the workspace-level. A workspace backup may include any or all namespaces +included in the workspace, across every cluster in the workspace. The backup feature for workspaces uses the same +Velero-based approach as regular cluster backups and are subject to the same limitations. For more information, refer to +[Cluster Backup and Restore](../../clusters/cluster-management/backup-restore/backup-restore.md). + +The backup files will be stored in a backup location you configure. Each cluster will have its own backup files. When +you delete a workspace, the backup files will not be deleted. + +## Create a Workspace Backup + +Backing up a workspace creates a backup file for every cluster in your workspace. Each cluster backup file will contain +all Kubernetes objects as well as volumes in the namespaces selected. + +### Prerequisites + +- You have configured at least one backup location for cluster backups. Refer to + [Add Backup Location using Static Credentials](../../clusters/cluster-management/backup-restore/add-backup-location-static.md). + +- You are logged in as a Palette user that has the permission to back up workspaces. For more information, refer to + [Permissions](../../user-management/palette-rbac/permissions.md). + +- The clusters in the workspace you want to backup are healthy and available. Unhealthy clusters will not be backed up. + + +- If you want to include volume snapshots in the backup, ensure that your CSI driver supports volume snapshots. For more + information about volume support, review the CSI pack README for your CSI driver in use. Refer to the [Volume Snapshots](../../clusters/cluster-management/backup-restore/backup-restore.md#volume-snapshots) section for more information. + + :::warning + + Ensure that `manifests.volume-snapshot-class.deletionPolicy` is set to the `Retain` value if you have configured as a layer in your cluster profile. This setting allows volume snapshot content to be retained when volume snapshots are deleted, facilitating backup and restore functionality. + + ```yaml hideClipboard {5} + volume-snapshot-class: + create: true + name: "spectro-volume-snapshot-class" + driver: "" + deletionPolicy: "Retain" + ``` + + Additionally, you must add the following snippet under the `manifests.volume-snapshot-class` field if you are using as your CSI layer on a cluster deployed to a MAAS environment. These labels ensure that the pack installs correctly. + + ```yaml + extraLabels: + pod-security.kubernetes.io/enforce: privileged + pod-security.kubernetes.io/audit: privileged + pod-security.kubernetes.io/warn: privileged + ``` + + ::: + +### Procedure + +1. Log in to [Palette](https://console.spectrocloud.com). + +2. In the **drop-down Menu** at the top of the page, choose the project that has your workspace. + +3. On the left **Main Menu**, click **Workspaces**. + +4. Click on the workspace you want to back up. + +5. Click **Settings** in the upper-right corner. + +6. Click **Schedule backups**. + +7. Fill in the following basic information about your scheduled backups. + + | Parameter | Description | + | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | + | Backup prefix | The prefix to your backup file names. | + | Select backup location | Select a location to store your backup files. | + | Backup schedule | Configure a schedule for your backups. | + | Select expiry | The period for which your backup files are kept. Backup files past the expiry date are deleted automatically. | + | Include all disks | Select this checkbox if you want to include all the disks in the backup. | + | Include cluster-wide resources | Cluster wide resources are resources that are not namespaced but are scoped to the whole cluster, such as cluster roles. **Auto** option includes persistent volumes that are linked to claims within the selected namespaces, but exclude other cluster-wide resources. | + +8. Enter the namespaces you want to back up. + +9. Select the clusters you want to back up. + +10. Click **Save Changes**. + +The backup process will take some time ranging from 15 minutes to hours depending on the scope of the backup. + +### Validate + +1. Log in to [Palette](https://console.spectrocloud.com). + +2. In the **drop-down Menu** at the top of the page, choose the project that has your workspace. + +3. On the left **Main Menu**, click **Workspaces**. + +4. Click on the workspace you backed up. + +5. Click on the **Backups** tab. + +6. Confirm that your backup is in progress or completed. + +## Restore a Workspace Backup + +Restoring a workspace will restore the selected namespaces in every cluster that is currently in the workspace to the +same state from which the backup was created. The clusters being restored must be healthy and reachable, because the +restore process relies on access to the Kubernetes API. If you have deleted a cluster from the workspace, the deleted +cluster will not be restored. + +### Prerequisites + +- You have created a backup file for the workspace. + +- You are logged in as a Palette user that has the permission to restore workspaces. For more information, refer to + [Permissions](../../user-management/palette-rbac/permissions.md). + +- The clusters you want to restore are healthy and available. + +### Procedure + +1. Log in to [Palette](https://console.spectrocloud.com). + +2. In the **drop-down Menu** at the top of the page, choose the project that has your workspace. + +3. On the left **Main Menu**, click **Workspaces**. + +4. Click on the workspace you want to restore. + +5. Click on **Backups** to switch to the backup tab. + +6. Click on a backup file you want to restore from. + +7. You have the following options for restoring the backup. + + | Option | Description | + | ------------------------- | ------------------------------------------------------------------------- | + | Include Cluster Resources | Check the box to restore all the cluster scoped resources. | + | Preserve Node Ports | Check the box to preserve ports for the node port service in the cluster. | + | Restore PVs | Check the box to restore the persistent volumes. | + +8. Click **Restore Backup**. + +### Validate + +1. Log in to [Palette](https://console.spectrocloud.com). + +2. In the **drop-down Menu** at the top of the page, choose the project that has your workspace. + +3. On the left **Main Menu**, click **Workspaces**. + +4. Click on the workspace you restored. + +5. Ensure that the result of the restore was successful. diff --git a/docs/docs-content/workspace/workspace-mgmt/configure-rbac.md b/docs/docs-content/workspace/workspace-mgmt/configure-rbac.md new file mode 100644 index 0000000000..46bea51dd4 --- /dev/null +++ b/docs/docs-content/workspace/workspace-mgmt/configure-rbac.md @@ -0,0 +1,159 @@ +--- +sidebar_label: "Configure RBAC in Workspaces" +title: "Configure RBAC in Workspaces" +description: "Learn how to configure RBAC in workspaces." +hide_table_of_contents: false +sidebar_position: 0 +tags: ["workspace", "rbac"] +--- + +Workspaces extends Kubernetes' native Role-Based Access Control (RBAC) model to allow you to create role bindings and +cluster role bindings at the workspace level, unifying authorization across different clusters. This page teaches you +how to create workspace-level role bindings and cluster role bindings. + +RBAC in workspaces is distinct from Palette RBAC. Palette RBAC regulates access to Palette resources such as clusters, +workspaces, and Edge hosts and its subjects are Palette users. Workspace RBAC is an extension of Kubernetes' native RBAC +model. It regulates access to Kubernetes objects in the clusters encompassed by the workspace, and its subjects are +Kubernetes users, groups, and service accounts. + +| | Workspace RBAC | Palette RBAC | +| --------------------- | -------------------------------------------------------- | -------------------------------------------------------- | +| Access control domain | Kubernetes API objects in the clusters in the workspace. | Palette resources. | +| Subjects | Kubernetes users, groups, and service accounts. | Palette users and teams. | +| Example resources | ConfigMaps, Secrets, Pods, StatefulSets, etc. | Cluster profiles, clusters, workspaces, Edge hosts, etc. | + +Because workspace RBAC is built on top of Kubernetes RBAC, we recommend you becoming familiar with Kubernetes' RBAC +model before using workspace RBAC. For more information about RBAC in Kubernetes, refer to the +[Kubernetes Documentation](https://kubernetes.io/docs/reference/access-authn-authz/rbac/). + +## Create Workspace-Level Role Bindings + +By creating a workspace-level role binding, you create role bindings in all clusters in the workspace in the namespaces +you choose. You can also use Regular Expressions (regex) to create role bindings in all namespaces that match the regex. + +For example, if you create a role binding that binds the cluster role `podReader` to the service account +`podReaderAccount` in the `default` namespace, every cluster in your workspace will get a role binding that binds the +cluster role `podReader` to the service account `podReaderAccount` in that cluster's `default` namespace. + +### Prerequisites + +- An existing workspace. Refer to [Create a Workspace](../adding-a-new-workspace.md) to learn how to create a workspace. + +- You are logged in as a Palette user that has the permission to modify workspaces. For more information, refer to + [Permissions](../../user-management/palette-rbac/permissions.md). + +### Procedure + +1. Log in to [Palette](https://console.spectrocloud.com). + +2. In the **drop-down Menu** at the top of the page, choose the project that has your workspace. + +3. On the left **Main Menu**, click **Workspaces**. + +4. Click on the workspace you want to update. + +5. In the upper-right corner, click **Settings**. Then click **Namespaces**. + +6. If the namespace where you want to include is already in the workspace, skip this step. + + At the top of the page, enter the namespace you want to create the role bindings in. Note that doing so will include + the namespace in the workspace and Palette users who have access to this workspace will be able to view its workloads + and resource consumption. + + Alternatively, enter a regex that matches the namespaces where you want to create the role binding. Each regex needs + to start and end with a forward slash `/`. For example `/palette-.*/` will match any namespace that starts with + `palette-`. You may also use the negation symbol `~` to select all namespaces that do not match the regex. For + example, `~/palette-.*/` matches everything that does not start with `palette-`. + + :::info + + Using regex will _not_ include the namespaces that match the regex in the workspace. It will still allow you to + create the role bindings, but the workloads in those namespaces will not be visible, and you cannot backup those + namespaces. + + ::: + +7. Click **Add New Binding**. + +8. In the **Namespace** field, select a namespace or the regex. Then enter the **Role type** and **Role name**. As is in + Kubernetes, you can use either a role or a cluster role to create a role binding. If you use a cluster role, the + privilege of the cluster role will still be limited to the namespace where the role binding exists. + + :::info + + This action only creates the role bindings, but does not create the role or the subject referenced in the role + binding. Kubernetes allows you to create role bindings without creating the role or the subject, but the role binding + will have no effect until it can match with a role and a subject. You must make sure to create the role and the + subject in the namespaces or clusters yourself. + + ::: + +9. In the **Subject** fields, choose the type of the subject and enter the subject name. You can enter as many subjects + as you need. + +10. Click **Confirm**. + +### Validate + +1. Log in to [Palette](https://console.spectrocloud.com). + +2. In the **drop-down Menu** at the top of the page, choose the project that has your workspace. + +3. On the left **Main Menu**, click **Workspaces**. Select your workspace. + +4. Switch to the **Role Bindings** tab. + +5. Search for entries that starts with **spectro-on-demand-**. Open these entries to confirm that the role bindings bind + the expected role to the expected subject. + +## Configure Cluster Role Binding in All Clusters + +By creating a workspace-level cluster role binding, you create the same cluster role binding in every cluster in your +workspace. + +For example, if you create a cluster role binding that binds the cluster role `podReader` to the service account +`podReaderAccount`, every cluster will get the role binding that binds the cluster role `podReader` to the service +account `podReaderAccount`. + +### Prerequisites + +- An existing workspace. Refer to [Create a Workspace](../adding-a-new-workspace.md) to learn how to create a workspace. + +- You are logged in as a Palette user that has the permission to modify workspaces. For more information, refer to + [Permissions](../../user-management/palette-rbac/permissions.md). + +### Procedure + +1. Log in to [Palette](https://console.spectrocloud.com). + +2. In the **drop-down Menu** at the top of the page, choose the project that has your workspace. + +3. On the left **Main Menu**, click **Workspaces**. + +4. Click on the workspace you want to update. + +5. In the upper-right corner, click **Settings**. Then click **Clusters**. + +6. Click **Add New Binding**. + +7. In the **Cluster Role name** field, enter the name of the cluster role. In the **Subjects** field, enter the type and + name of the subject. You can enter as many subjects as you need. + + As is with role bindings, neither the cluster role nor the subjects referenced need to exist when you create the + cluster role binding. However, you must create them in each cluster. Otherwise, the cluster role binding will have no + effect. + +8. Click **Confirm**. + +### Validate + +1. Log in to [Palette](https://console.spectrocloud.com). + +2. In the **drop-down Menu** at the top of the page, choose the project that has your workspace. + +3. On the left **Main Menu**, click **Workspaces**. Select your workspace. + +4. Switch to the **Cluster Role Bindings** tab. + +5. Search for entries that start with **spectro-on-demand-**. Open these entries to confirm that the role bindings bind + the expected role to the expected subject. diff --git a/docs/docs-content/workspace/workspace-mgmt/delete-workspace.md b/docs/docs-content/workspace/workspace-mgmt/delete-workspace.md new file mode 100644 index 0000000000..0c54bb959c --- /dev/null +++ b/docs/docs-content/workspace/workspace-mgmt/delete-workspace.md @@ -0,0 +1,47 @@ +--- +sidebar_label: Delete Workspace +title: Delete Workspace +description: "Learn how to delete a workspace. " +hide_table_of_contents: false +sidebar_position: 40 +tags: ["workspace"] +--- + +This page teaches you how to delete a workspace. Deleting a workspace removes resources in the cluster that you created +using the workspace, such as role bindings, cluster role bindings, and resource quotas. Deleting a workspace does not +delete any of the clusters inside the workspace. + +Deleting the workspace will not automatically delete any backup files you created for the workspace. + +## Prerequisites + +- An existing workspace. Refer to [Create a Workspace](../adding-a-new-workspace.md) to learn how to create a workspace. + +- You are logged in as a Palette user that has the permission to delete workspaces. For more information, refer to + [Permissions](../../user-management/palette-rbac/permissions.md). + +## Delete a Workspace + +1. Log in to [Palette](https://console.spectrocloud.com). + +2. In the **drop-down Menu** at the top of the page, choose the project that has your workspace. + +3. On the left **Main Menu**, click **Workspaces**. + +4. Click on the workspace you want to delete. + +5. In the upper-right corner, click **Settings**. + +6. Click **Delete Workspace**. + +7. Enter the workspace name to confirm the deletion. + +## Validate + +1. Log in to [Palette](https://console.spectrocloud.com). + +2. In the **drop-down Menu** at the top of the page, choose the project that has your workspace. + +3. On the left **Main Menu**, click **Workspaces**. + +4. Confirm that the workspace has been deleted. diff --git a/docs/docs-content/workspace/workspace-mgmt/resource-mgmt.md b/docs/docs-content/workspace/workspace-mgmt/resource-mgmt.md new file mode 100644 index 0000000000..a74247e7b6 --- /dev/null +++ b/docs/docs-content/workspace/workspace-mgmt/resource-mgmt.md @@ -0,0 +1,107 @@ +--- +sidebar_label: "Resource Management" +title: "Resource Management" +description: "Learn how to monitor workload resource consumption and implement resource quotas for your workspace." +hide_table_of_contents: false +sidebar_position: 20 +tags: ["workspace", "resource-management"] +--- + +Workspaces give you a unified view of resource consumption in specified namespaces across all clusters in the workspace. +Additionally, you can implement resource quotas for the workspace as a whole, or for individual namespaces. The resource +quotas are implemented using the native Kubernetes ResourceQuota object. Refer to the +[Kubernetes documentation](https://kubernetes.io/docs/concepts/policy/resource-quotas) to learn more about resource +quotas. + +## Monitor Resource Consumption + +Workspaces allow you to view the workloads such as pods, deployments, daemon sets, and stateful sets in the namespaces +that comprise the workspace. + +In the workspace details page, the landing **Namespaces** tab give you an overview of how much resources are consumed by +each namespace. The **CPU** and **Memory** column display the total CPU and memory consumed by the namespaces with the +same name in the entire workspace. + +You can view more workloads by selecting the corresponding tab. For example, select the **Pods** tab if you want to +monitor pod workloads. Each tab will show you the CPU and memory consumption of the corresponding workload in the entire +workspace. + +| **Resource** | **Available Information** | +| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------- | +| **Namespaces** | CPU and memory utilization of the namespace in each cluster. | +| **Pods** | Lists all the pods in a particular namespace with cluster names with detailed health status, age, and resource utilization. | +| **Deployments** | All deployments in the namespaces included in the workspace and their age, pods, and resource utilization. | +| **DaemonSets** | All daemon set in the namespaces included in the workspace and their age, pods, and resource utilization. | +| **StatefulSets** | All the active StatefulSets in the namespaces included in the workspace and their age, pods, replicas, and resource utilization. | +| **Jobs** | All jobs in the namespaces included in the workspace and their status. | +| **CronJobs** | All cron jobs in the namespaces included in the workspace and their status. | +| **RoleBinding** | All role bindings in the namespaces included in the workspace, including the role name and the subject name. | +| **ClusterRoleBinding** | All cluster role bindings in the clusters included in the workspace. | + +## Implement Resource Quotas + +You can implement resource quotas on an entire workspace or implement them on individual namespaces. Resource quotas are +implemented through Kubernetes' native ResourceQuota object. For more information about resource quotas in Kubernetes, +refer to [Kubernetes documentation](https://kubernetes.io/docs/concepts/policy/resource-quotas/). + +### Prerequisites + +- An active Palette workspace. Refer to [Create a Workspace](../adding-a-new-workspace.md) to learn how to create one. + +- You are logged in as a Palette user that has the permission to modify workspaces. For more information, refer to + [Permissions](../../user-management/palette-rbac/permissions.md). + +### Procedure + +1. Log in to [Palette](https://console.spectrocloud.com). + +2. In the **drop-down Menu** at the top of the page, choose the project that has your workspace. + +3. On the left **Main Menu**, click **Workspaces**. + +4. Click on the workspace you want to update. + +5. Click **Settings** in the upper-right corner. + +6. Click **Namespaces**. + +7. Under **Workspace Quota**, you can specify the amount of CPU and memory that the entire workspace is allowed to + consume. The default value is 0, which imposes no limit. + +8. If you want to limit resource use based on namespaces, enter the desired CPU and memory limit in the **Allocate CPU** + and **Allocate memory** columns next to the namespace entry. + + By default, the namespace in each cluster has the same resource limit. You can change this and enter the limit on the + namespace in one particular cluster. You must ensure that resources configured to individual namespaces do not exceed + the workspace quota when added together. + + For example, if you have two clusters in the workspace and impose a workspace-level quota of 8 Gi of memory and 8 + CPUs, when each instance of the namespace in each cluster is added together, the total memory and CPU quota cannot + exceed 8 Gi of memory and 8 CPUs. + + The following resource quota configuration is not allowed for a workspace with 8 Gi of memory and 8 CPUs because the + resource quotas add up to 11 Gi and 11 CPUs. + + | | Cluster 1 | Cluster 2 | + | ----------- | ------------ | ------------ | + | Namespace 1 | 4 Gi, 4 CPUs | 4 Gi, 4 CPUs | + | Namespace 2 | 2 Gi, 2 CPU | 1 Gi, 1 CPU | + + The following resource quota configuration is allowed because the total quota is 8 Gi and 8 CPUs. + + | | Cluster 1 | Cluster 2 | + | ----------- | ------------ | ------------ | + | Namespace 1 | 2 Gi, 2 CPUs | 2 Gi, 2 CPUs | + | Namespace 2 | 3 Gi, 3 CPU | 1 Gi, 1 CPU | + +### Validate + +1. Connect to a cluster in your workspace using kubectl. For more information, refer to + [Access Cluster with kubectl](../../clusters/cluster-management/palette-webctl.md). + +2. Issue the following command to view the resource quotas created for your cluster. Confirm that the corresponding + resource quotas have been created. You may also use the `--namespace` flag to choose a specific namespace to examine. + + ```shell + kubectl get resourcequota --all-namespaces + ``` diff --git a/docs/docs-content/workspace/workspace-mgmt/restrict-images.md b/docs/docs-content/workspace/workspace-mgmt/restrict-images.md new file mode 100644 index 0000000000..e41a4c0726 --- /dev/null +++ b/docs/docs-content/workspace/workspace-mgmt/restrict-images.md @@ -0,0 +1,53 @@ +--- +sidebar_label: Restrict Container Images +title: Restrict Container Images +description: "Learn how to restrict certain images from being used by your workspace" +hide_table_of_contents: false +sidebar_position: 60 +tags: ["workspace"] +--- + +You can specify image URLs in a workspace to restrict access to those images for specific namespaces. Restricted images +cannot be loaded into any cluster in the namespaces you specify. + +Access control to images is achieved using Kyverno policies. For more information about Kyverno, refer to +[Kyverno documentation](https://kyverno.io/). + +## Prerequisites + +- An active Palette workspace. Refer to [Create a Workspace](../adding-a-new-workspace.md) to learn how to create one. + +- You are logged in as a Palette user that has the permission to modify workspaces. For more information, refer to + [Permissions](../../user-management/palette-rbac/permissions.md). + +## Restrict Container Image + +1. Log in to [Palette](https://console.spectrocloud.com). + +2. In the **drop-down Menu** at the top of the page, choose the project that has your workspace. + +3. On the left **Main Menu**, click **Workspaces**. + +4. Click on the workspace you want to delete. + +5. In the upper-right corner, click **Settings**. + +6. Click **Container Images**. + +7. Enter the namespace you want to restrict image access for. Then enter the images by tag, separated by commas. + +8. Click **Save Changes**. + +## Validate + +1. Connect to a cluster in your workspace using kubectl. For more information, refer to + [Access Cluster with kubectl](../../clusters/cluster-management/palette-webctl.md). + +2. Issue the following command to view the Kyverno policy used to control image access. + + ```shell + kubectl describe cpol cluster-policy-palette-system + ``` + +3. Check under `spec.rules.preconditions` and `spec.rules.validate`. Confirm that the matching namespaces have + restricted the container images from loading. diff --git a/docs/docs-content/workspace/workspace-mgmt/workspace-mgmt.md b/docs/docs-content/workspace/workspace-mgmt/workspace-mgmt.md new file mode 100644 index 0000000000..d125b4105d --- /dev/null +++ b/docs/docs-content/workspace/workspace-mgmt/workspace-mgmt.md @@ -0,0 +1,25 @@ +--- +sidebar_label: "Workspace Management" +title: "Workspace Management" +description: "Resources for workspace management." +icon: "" +hide_table_of_contents: false +sidebar_position: 0 +tags: ["workspace"] +--- + +After creating a workspace, you can monitor the workloads and their resource usage in your workspace in Palette. In +addition, you can make changes to the workspace, including adding and removing namespaces role bindings, and resource +quotas. + +## Resources + +- [Configure RBAC in Workspaces](configure-rbac.md) + +- [Resource Management](resource-mgmt.md) + +- [Backup and Restore](./backup-restore.md) + +- [Restrict Container Images](restrict-images.md) + +- [Delete Workspace](./delete-workspace.md) diff --git a/docs/docs-content/workspace/workspace.md b/docs/docs-content/workspace/workspace.md index 9ec346057c..19ca5edee8 100644 --- a/docs/docs-content/workspace/workspace.md +++ b/docs/docs-content/workspace/workspace.md @@ -8,56 +8,51 @@ sidebar_custom_props: tags: ["workspace"] --- -Palette extends its multi-cluster management and governance capabilities by introducing **Workspaces**. Workspaces -enable the logical grouping of clusters and namespaces to provide application or team-specific governance and visibility -into workloads, cost, and usage metrics. For example, the application or team workload may be deployed into namespaces -across clusters to achieve High Availability (HA), Disaster Recovery (DR), organization-specific placement policies, -etc. Grouping such namespaces and clusters into a workspace provide central management and governance in a multi-cluster -distributed environment. The following sections describe various aspects of multi-cluster management via workspaces. +A workspace in Palette consists of a group of clusters and namespaces and the resources scoped in those clusters and +namespaces. Using workspaces enables you to provide application or team-specific governance and visibility into +workloads, cost, and usage metrics. -## Namespace Management +For example, the application or team workload may be deployed into namespaces across clusters to achieve High +Availability (HA), Disaster Recovery (DR), or other organization-specific placement policies. Grouping such namespaces +and clusters into a workspace allows centralized management and governance in a multi-cluster distributed environment. -Workspaces automate the creation and deletion of namespaces common to all clusters within the workspace. A workspace can -hold a set of namespaces. Spectro Cloud Palette will periodically reconcile the workspace definition and add/remove -namespaces if required from all clusters part of the workspace. +The following sections describe what Palette workspaces can help you achieve. -## Quota Control +## Namespace and Resource Management -Usage quota in terms of CPU and memory usage limits is specified within the namespaces. Spectro Cloud Palette sets the -specified limits across all the clusters in the namespaces. +Workspaces in Palette automate the creation and management of namespaces across all clusters in the workspace. This +includes: -## Role Based Access Control(RBAC) +- **Namespace Creation**: Creating namespaces across all clusters in your workspace if a cluster does not have a + specified namespace. +- **Resource Quotas**: Defining and enforcing CPU and memory usage limits within namespaces, applied uniformly across + all clusters in the workspace. -Role bindings and cluster role bindings are specified within workspaces. Furthermore, these role bindings and cluster -role bindings are created in every cluster within the workspaces, thus enabling centralized RBAC. +## Centralized Access Control -## Utilization +Workspaces simplify Role-Based Access Control (RBAC) by centralizing management of role bindings and cluster role +bindings. You can specify role bindings and cluster role bindings within the workspace to automatically apply them to +all clusters, ensuring consistent and secure access policies across all clusters in a workspace. -Spectro Cloud Palette reports detailed resource utilization of workloads deployed in all the namespaces in the workspace -across clusters. In addition, the CPU and memory usage trends within the workspace provide valuable insights into the -consumption patterns of an application distributed across clusters. +## Visibility and Insights -## Cost Attribution +Workspaces enhance operational visibility and provide actionable insights -Spectro Cloud Palette computes utilization costs for workloads deployed in all the namespaces that are part of the -workspace across all the clusters based on the detailed resource utilization data. This can be used for internal -charge-back or show-back purposes to determine the cost incurred by an application or team. +- **Workload Visibility**: A centralized workload browser aggregates and displays workloads (pods, deployments, jobs, + stateful sets, etc.) across all namespaces and clusters in the workspace. +- **Resource Utilization**: Detailed reporting on CPU and memory usage trends across clusters to understand consumption + patterns. +- **Cost Attribution**: Calculating costs for workloads based on resource utilization, enabling internal charge-back or + show-back for teams or applications. -## Workload Visibility +## Backup and Disaster Recovery -Workspaces provide a workload browser to view all the workloads such as pods, deployment, jobs, stateful sets, etc., -deployed in all the namespaces that are part of the workspace across all the clusters. The workload browser aggregates -resources across clusters from relevant namespaces and presents them with centralized visibility. +**Workspace-Based Backup**: Extends cluster-level backups to include namespaces in all clusters within a workspace. For +detailed prerequisites and instructions, refer to the +[Backup and Restore](../clusters/cluster-management/backup-restore/backup-restore.md) page. -## Backup and Restore +## Resources -A workspace-based backup is similar to a cluster backup, with the additional coverage of multiple clusters, should the -workspace include more than one. The prerequisites and detailed instructions to backup and restore clusters are -specified on the [Backup and Restore](../clusters/cluster-management/backup-restore/backup-restore.md) page. +- [Create a Workspace](./adding-a-new-workspace.md) -## Regex for Namespaces - -Palette leverages [Regex Pattern matching](workload-features.md#regex-for-namespaces) to select multiple namespaces to -apply Role binding concurrently. When we have many namespaces to be configured for role binding, the user can provide a -Regex pattern matching multiple namespaces instead of giving a single namespace. This will help select all the -namespaces matching the given Regex pattern to be selected together for role binding. > +- [Workspace Management](./workspace-mgmt/workspace-mgmt.md)