diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index e8458ef..98e1439 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -23,7 +23,9 @@ jobs: - name: golangci-lint uses: golangci/golangci-lint-action@v3 with: - version: v1.51.2 + version: v1.56.2 + args: --timeout=5m + skip-cache: false - name: Get dependencies run: go get -t -d ./... - name: Build diff --git a/.gitignore b/.gitignore index fb3ad53..c4685e4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,213 @@ +# Created by https://www.toptal.com/developers/gitignore/api/visualstudiocode,macos,windows,linux,go,goland+all +# Edit at https://www.toptal.com/developers/gitignore?templates=visualstudiocode,macos,windows,linux,go,goland+all + +### Go ### +# If you prefer the allow list template instead of the deny list, see community template: +# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore +# +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +# Go workspace file +go.work + +### GoLand+all ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### GoLand+all Patch ### +# Ignore everything but code style settings and run configurations +# that are supposed to be shared within teams. + +.idea/* + +!.idea/codeStyles +!.idea/runConfigurations + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### macOS Patch ### +# iCloud generated files +*.icloud + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,macos,windows,linux,go,goland+all + +## CUSTOM # Binaries for programs and plugins *.exe *.exe~ diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 4011034..aaddf81 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -9,7 +9,7 @@ builds: - CGO_ENABLED=1 - GO111MODULE=on ldflags: - - -s -w -X github.com/github.com/dihedron/cq-source-openstack/resources/plugin.Version={{.Version}} + - -s -w -X github.com/dihedron/cq-source-openstack/plugin/plugin.Version={{.Version}} goos: - windows - linux diff --git a/Makefile b/Makefile index 58adc36..d3714a8 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,91 @@ -.PHONY: local -local: - goreleaser build --single-target --snapshot --clean +NAME := cq-source-openstack +DESCRIPTION := CloudQuery OpenStack source plugin +KIND := source +COPYRIGHT := 2024 © Andrea Funtò +LICENSE := MIT +LICENSE_URL := https://opensource.org/license/mit/ +VERSION_MAJOR := 0 +VERSION_MINOR := 1 +VERSION_PATCH := 0 +VERSION=$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH) +MAINTAINER=dihedron.dev@gmail.com +VENDOR=dihedron.dev@gmail.com +LICENSE="MIT" +RELEASE=1 +PRODUCER_URL=https://github.com/dihedron/ +DOWNLOAD_URL=$(PRODUCER_URL)cq-source-openstack + +SHELL := /bin/bash + +platforms="$$(go tool dist list)" +module := $$(grep "module .*" go.mod | sed 's/module //gi') +package := $(module)/version +now := $$(date --rfc-3339=seconds) +# comment this to disable compression; to improve compression +# consider replacing upx -9 with upx --brute (slow!) +strip := -w -s + +# +# Linux x86-64 build settings +# +linux/amd64: GOAMD64 = v3 + +# +# Windows x86-64 build settings +# +windows/amd64: GOAMD64 = v3 + +.PHONY: default +default: linux/amd64; + +%: + @go mod tidy +ifeq (, $(shell which govulncheck)) + @go install golang.org/x/vuln/cmd/govulncheck@latest +endif + @govulncheck ./... + @for platform in "$(platforms)"; do \ + if test "$(@)" = "$$platform"; then \ + echo "Building target $(@)..."; \ + mkdir -p dist/$(@); \ + GOOS=$(shell echo $(@) | cut -d "/" -f 1) \ + GOARCH=$(shell echo $(@) | cut -d "/" -f 2) \ + GOAMD64=$(GOAMD64) \ + CGO_ENABLED=0 \ + go build -v \ + -ldflags="\ + $(strip) \ + -X '$(package).Name=$(NAME)' \ + -X '$(package).Description=$(DESCRIPTION)' \ + -X '$(package).Kind=$(KIND)' \ + -X '$(package).Copyright=$(COPYRIGHT)' \ + -X '$(package).License=$(LICENSE)' \ + -X '$(package).LicenseURL=$(LICENSE_URL)' \ + -X '$(package).BuildTime=$(now)' \ + -X '$(package).VersionMajor=$(VERSION_MAJOR)' \ + -X '$(package).VersionMinor=$(VERSION_MINOR)' \ + -X '$(package).VersionPatch=$(VERSION_PATCH)'" \ + -o dist/$(@)/ .;\ + echo ...done!; \ + fi; \ + done + +.PHONY: optimise +optimise: +ifeq (, $(shell which upx)) + @sudo apt install upx +endif + @for binary in `find dist/ -name 'cq-source-openstack*'`; do \ + upx --brute $$binary; \ + done; + +.PHONY: clean +clean: + @rm -rf dist + +# .PHONY: local +# local: +# goreleaser build --single-target --snapshot --clean .PHONY: test test: diff --git a/README.md b/README.md index 0bf375a..721421f 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # CloudQuery OpenStack Source Plugin -[![test](https://github.com/github.com/dihedron/cq-source-openstack/actions/workflows/test.yaml/badge.svg)](https://github.com/github.com/dihedron/cq-source-openstack/actions/workflows/test.yaml) -[![Go Report Card](https://goreportcard.com/badge/github.com/github.com/dihedron/cq-source-openstack)](https://goreportcard.com/report/github.com/github.com/dihedron/cq-source-openstack) +[![test](https://github.com/dihedron/cq-source-openstack/actions/workflows/test.yaml/badge.svg)](https://github.com/dihedron/cq-source-openstack/actions/workflows/test.yaml) +[![Go Report Card](https://goreportcard.com/badge/github.com/dihedron/cq-source-openstack)](https://goreportcard.com/report/github.com/dihedron/cq-source-openstack) A source plugin for CloudQuery that loads data from OpenStack to any database, data warehouse or data lake supported by [CloudQuery](https://www.cloudquery.io/), such as PostgreSQL, BigQuery, Athena, and many more. -OpenStack is the most widely used open source cloud platform; it powers hundreds of private clouds and some public clouds too;. +OpenStack is the most widely used open source cloud platform; it powers hundreds of private clouds and some public clouds too. ## Links diff --git a/_test/docker-compose.yaml b/_test/docker-compose.yaml index e59fc22..1d62e1d 100644 --- a/_test/docker-compose.yaml +++ b/_test/docker-compose.yaml @@ -1,19 +1,19 @@ version: '3.7' services: - cloudquery: - image: postgres:14 - restart: unless-stopped - environment: - - POSTGRES_USER=cloudquery - - POSTGRES_PASSWORD=cloudquery - logging: - options: - max-size: 10m - max-file: "3" - ports: - - '5433:5432' - volumes: - - cloudquery_data:/var/lib/postgresql/data + cloudquery: + image: postgres:14 + restart: unless-stopped + environment: + - POSTGRES_USER=cloudquery + - POSTGRES_PASSWORD=cloudquery + logging: + options: + max-size: 10m + max-file: "3" + ports: + - '5433:5432' + volumes: + - cloudquery_data:/var/lib/postgresql/data volumes: cloudquery_data: external: false diff --git a/_test/openstack.yaml b/_test/openstack.yaml index 7b6404e..a69e271 100644 --- a/_test/openstack.yaml +++ b/_test/openstack.yaml @@ -2,13 +2,12 @@ kind: source spec: name: openstack_lab registry: local - path: "/data/workspaces/gomods/cq-source-openstack/dist/cq-source-openstack_linux_amd64_v1/cq-source-openstack" + path: "../dist/linux/amd64/cq-source-openstack" version: v1.0.0 - tables: - ["openstack*"] + tables: ["openstack*"] destinations: - - sqlite -# - postgresql + # - sqlite + - postgresql spec: endpoint_url: ${OPENSTACK_ENDPOINT_URL} username: ${OPENSTACK_USERNAME} @@ -18,6 +17,8 @@ spec: domain_name: ${OPENSTACK_DOMAIN_NAME} app_credential_id: ${OPENSTACK_APP_CREDENTIAL_ID} app_credential_secret: ${OPENSTACK_APP_CREDENTIAL_SECRET} + included_tables: ["openstack*"] + excluded_tables: ["openstack_baremetal*"] # --- # kind: source # spec: @@ -25,7 +26,7 @@ spec: # path: cloudquery/gitlab # version: v3.0.0 # tables: ["*"] -# destinations: +# destinations: # - sqlite # - postgresql # spec: @@ -45,8 +46,8 @@ spec: name: postgresql registry: github path: cloudquery/postgresql - version: v7.1.6 + version: v7.3.4 spec: - connection_string: postgresql://cloudquery:cloudquery@localhost:15433/cloudquery?sslmode=disable -# connection_string: postgresql://cloudquery:cloudquery@localhost:5432/cloudquery?sslmode=disable + connection_string: postgresql://cloudquery:cloudquery@${DB_POSTGRES_URL}:5433/cloudquery?sslmode=disable +# connection_string: postgresql://cloudquery:cloudquery@localhost:5432/cloudquery?sslmode=disable # connection_string: postgresql://superset:superset@localhost:15432/superset?sslmode=disable diff --git a/client/client.go b/client/client.go index 9c1bcf4..c5a638e 100644 --- a/client/client.go +++ b/client/client.go @@ -33,52 +33,18 @@ func New(ctx context.Context, logger zerolog.Logger, spec *Spec) (*Client, error logger.Debug().Str("spec", format.ToJSON(spec)).Msg("plugin configuration") - auth := gophercloud.AuthOptions{ - AllowReauth: true, + err := spec.Validate() + if err != nil { + logger.Error().Err(err).Msg("invalid spec configuration") + return nil, fmt.Errorf("error spec not valid: %w", err) } - if spec.EndpointUrl != nil { - auth.IdentityEndpoint = *spec.EndpointUrl - } - if spec.UserID != nil { - auth.UserID = *spec.UserID - } - if spec.Username != nil { - auth.Username = *spec.Username - } - if spec.Password != nil { - auth.Password = *spec.Password - } - if spec.ProjectID != nil { - auth.TenantID = *spec.ProjectID - } - if spec.ProjectName != nil { - auth.TenantName = *spec.ProjectName - } - if spec.DomainID != nil { - auth.DomainID = *spec.DomainID - } - if spec.DomainName != nil { - auth.DomainName = *spec.DomainName - } - if spec.AccessToken != nil { - auth.TokenID = *spec.AccessToken - } - if spec.AppCredentialID != nil { - auth.ApplicationCredentialID = *spec.AppCredentialID - } - if spec.AppCredentialSecret != nil { - auth.ApplicationCredentialSecret = *spec.AppCredentialSecret - } - if spec.AllowReauth != nil { - auth.AllowReauth = *spec.AllowReauth + auth, err := spec.AssignValues() + if err != nil { + logger.Error().Err(err).Msg("error creating authentication options") + return nil, err } - // - // IMPORTANT NOTE: when using App Credentials, it is necessary - // that all other fields except the endpoint URL be left blank! - // - client, err := openstack.AuthenticatedClient(auth) if err != nil { logger.Error().Err(err).Msg("error creating authenticated client") @@ -142,25 +108,28 @@ func (c *Client) initServiceClient(key ServiceType) (*gophercloud.ServiceClient, const ( // defaults currently referring to Train + DefaultBareMetalV1Microversion = "1.58" DefaultComputeV2Microversion = "2.79" DefaultIdentityV3Microversion = "3.13" DefaultBlockStorageV3Microversion = "3.59" - DefaultImageServiceV2Microversion = "2.9" + DefaultImageV2Microversion = "2.9" ) type ServiceType string const ( - // IdentityV3 identifies the OpenStack Identity V3 service (Keystone). + // BareMetalV1 identifies the OpenStack Baremetal V1 service (BareMetal). + BareMetalV1 = "openstack_baremetal_v1" + // IdentityV3 identifies the OpenStack Identity V3 service (Identity). IdentityV3 ServiceType = "openstack_identity_v3" - // Compute identifies the penStack Compute V2 service (Nova). + // Compute identifies the penStack Compute V2 service (Compute). ComputeV2 = "openstack_compute_v2" - // NetworkV2 identifies the OpenStack Network V2 service (Neutron). - NetworkV2 = "openstack_network_v2" - // BlockStorageV3 identifies the OpenStack Block Storage V3 service (Cinder). + // NetworkingV2 identifies the OpenStack Network V2 service (Networking). + NetworkingV2 = "openstack_networking_v2" + // BlockStorageV3 identifies the OpenStack Block Storage V3 service (BlockStorage). BlockStorageV3 = "openstack_blockstorage_v3" - // ImageServiceV2 identifies the OpenStack Image Service V2 service (Glance). - ImageServiceV2 = "openstack_imageservice_v2" + // ImageV2 identifies the OpenStack Image Service V2 service (Image). + ImageV2 = "openstack_image_v2" ) type serviceConfig struct { @@ -169,6 +138,16 @@ type serviceConfig struct { } var serviceConfigMap = map[ServiceType]serviceConfig{ + BareMetalV1: { + newClient: openstack.NewBareMetalV1, + getMicroversion: func(spec *Spec) string { + microversion := DefaultBareMetalV1Microversion + if spec.BareMetalV1Microversion != nil { + microversion = *spec.BareMetalV1Microversion + } + return microversion + }, + }, IdentityV3: { newClient: openstack.NewIdentityV3, getMicroversion: func(spec *Spec) string { @@ -189,7 +168,7 @@ var serviceConfigMap = map[ServiceType]serviceConfig{ return microversion }, }, - NetworkV2: { + NetworkingV2: { newClient: openstack.NewNetworkV2, getMicroversion: func(spec *Spec) string { // TODO: check if we need to leverage/support micro-versions @@ -206,12 +185,12 @@ var serviceConfigMap = map[ServiceType]serviceConfig{ return microversion }, }, - ImageServiceV2: { + ImageV2: { newClient: openstack.NewImageServiceV2, getMicroversion: func(spec *Spec) string { - microversion := DefaultImageServiceV2Microversion - if spec.ImageServiceV2Microversion != nil { - microversion = *spec.ImageServiceV2Microversion + microversion := DefaultImageV2Microversion + if spec.ImageV2Microversion != nil { + microversion = *spec.ImageV2Microversion } return microversion }, diff --git a/client/spec.go b/client/spec.go index a1b88b9..76331f9 100644 --- a/client/spec.go +++ b/client/spec.go @@ -1,28 +1,105 @@ package client +import ( + "net/http" + "net/url" + + "github.com/gophercloud/gophercloud" + "github.com/rs/zerolog/log" +) + type Spec struct { - EndpointUrl *string `json:"endpoint_url,omitempty" yaml:"endpoint_url,omitempty"` - UserID *string `json:"userid,omitempty" yaml:"userid,omitempty"` - Username *string `json:"username,omitempty" yaml:"username,omitempty"` - Password *string `json:"password,omitempty" yaml:"password,omitempty"` - Region *string `json:"region,omitempty" yaml:"region,omitempty"` - ProjectID *string `json:"project_id,omitempty" yaml:"project_id,omitempty"` - ProjectName *string `json:"project_name,omitempty" yaml:"project_name,omitempty"` - DomainID *string `json:"domain_id,omitempty" yaml:"domain_id,omitempty"` - DomainName *string `json:"domain_name,omitempty" yaml:"domain_name,omitempty"` - AccessToken *string `json:"access_token,omitempty" yaml:"access_token,omitempty"` - AppCredentialID *string `json:"app_credential_id,omitempty" yaml:"app_credential_id,omitempty"` - AppCredentialSecret *string `json:"app_credential_secret,omitempty" yaml:"app_credential_secret,omitempty"` - AllowReauth *bool `json:"allow_reauth,omitempty" yaml:"allow_reauth,omitempty"` - IdentityV3Microversion *string `json:"identity_v3_microversion,omitempty" yaml:"identity_v3_microversion,omitempty"` - ComputeV2Microversion *string `json:"compute_v2_microversion,omitempty" yaml:"compute_v2_microversion,omitempty"` - NetworkV2Microversion *string `json:"network_v2_microversion,omitempty" yaml:"network_v2_microversion,omitempty"` - BlockStorageV3Microversion *string `json:"blockstorage_v3_microversion,omitempty" yaml:"blockstorage_v3_microversion,omitempty"` - ImageServiceV2Microversion *string `json:"imageservice_v2_microversion,omitempty" yaml:"imageservice_v2_microversion,omitempty"` + EndpointUrl *string `json:"endpoint_url,omitempty" yaml:"endpoint_url,omitempty"` + UserID *string `json:"userid,omitempty" yaml:"userid,omitempty"` + Username *string `json:"username,omitempty" yaml:"username,omitempty"` + Password *string `json:"password,omitempty" yaml:"password,omitempty"` + Region *string `json:"region,omitempty" yaml:"region,omitempty"` + ProjectID *string `json:"project_id,omitempty" yaml:"project_id,omitempty"` + ProjectName *string `json:"project_name,omitempty" yaml:"project_name,omitempty"` + DomainID *string `json:"domain_id,omitempty" yaml:"domain_id,omitempty"` + DomainName *string `json:"domain_name,omitempty" yaml:"domain_name,omitempty"` + AccessToken *string `json:"access_token,omitempty" yaml:"access_token,omitempty"` + AppCredentialID *string `json:"app_credential_id,omitempty" yaml:"app_credential_id,omitempty"` + AppCredentialSecret *string `json:"app_credential_secret,omitempty" yaml:"app_credential_secret,omitempty"` + AllowReauth *bool `json:"allow_reauth,omitempty" yaml:"allow_reauth,omitempty"` + BareMetalV1Microversion *string `json:"baremetal_v1_microversion,omitempty" yaml:"baremetal_v1_microversion,omitempty"` + IdentityV3Microversion *string `json:"keyston_v3_microversion,omitempty" yaml:"keyston_v3_microversion,omitempty"` + ComputeV2Microversion *string `json:"compute_v2_microversion,omitempty" yaml:"compute_v2_microversion,omitempty"` + NetworkingV2Microversion *string `json:"networking_v2_microversion,omitempty" yaml:"networking_v2_microversion,omitempty"` + BlockStorageV3Microversion *string `json:"blockstorage_v3_microversion,omitempty" yaml:"blockstorage_v3_microversion,omitempty"` + ImageV2Microversion *string `json:"image_v2_microversion,omitempty" yaml:"image_v2_microversion,omitempty"` + IncludedTables []string `json:"included_tables,omitempty" yaml:"included_tables,omitempty"` + ExcludedTables []string `json:"excluded_tables,omitempty" yaml:"excluded_tables,omitempty"` +} + +func (s *Spec) AssignValues() (gophercloud.AuthOptions, error) { + auth := gophercloud.AuthOptions{} + + if s.EndpointUrl != nil { + auth.IdentityEndpoint = *s.EndpointUrl + } + if s.UserID != nil { + auth.UserID = *s.UserID + } + if s.Username != nil { + auth.Username = *s.Username + } + if s.Password != nil { + auth.Password = *s.Password + } + if s.ProjectID != nil { + auth.TenantID = *s.ProjectID + } + if s.ProjectName != nil { + auth.TenantName = *s.ProjectName + } + if s.DomainID != nil { + auth.DomainID = *s.DomainID + } + if s.DomainName != nil { + auth.DomainName = *s.DomainName + } + if s.AccessToken != nil { + auth.TokenID = *s.AccessToken + } + if s.AppCredentialID != nil { + auth.ApplicationCredentialID = *s.AppCredentialID + } + if s.AppCredentialSecret != nil { + auth.ApplicationCredentialSecret = *s.AppCredentialSecret + } + if s.AllowReauth != nil { + auth.AllowReauth = *s.AllowReauth + } else { + auth.AllowReauth = true + } + + _, err := auth.ToTokenV3CreateMap(nil) + if err != nil { + log.Error().Err(err).Msg("failed to initialize auth options.") + return auth, err + } + + return auth, nil } func (s *Spec) Validate() error { - // TODO: implement + if s.EndpointUrl == nil { + log.Error().Msg("missing endpoint URL") + return nil + } + // Check that the endpoint URL is a valid URL + _, err := url.ParseRequestURI(*s.EndpointUrl) + if err != nil { + log.Error().Err(err).Msg("invalid endpoint URL.") + return err + } + // Check that the endpoint URL is reachable + _, err = http.Get(*s.EndpointUrl) + if err != nil { + log.Error().Err(err).Msg("unreachable endpoint URL.") + return err + } return nil } diff --git a/docs/tables/README.md b/docs/tables/README.md index 6abe3f1..f93ca82 100644 --- a/docs/tables/README.md +++ b/docs/tables/README.md @@ -1,33 +1,55 @@ -# Source Plugin: github.com/dihedron-openstack +# Source Plugin: dihedron-openstack ## Tables -- [openstack_aggregates](openstack_aggregates.md) - - [openstack_aggregate_hosts](openstack_aggregate_hosts.md) -- [openstack_attachments](openstack_attachments.md) - - [openstack_attachment_hosts](openstack_attachment_hosts.md) -- [openstack_flavors](openstack_flavors.md) - - [openstack_flavor_accesses](openstack_flavor_accesses.md) - - [openstack_flavor_extra_specs](openstack_flavor_extra_specs.md) -- [openstack_hypervisors](openstack_hypervisors.md) -- [openstack_images](openstack_images.md) - - [openstack_image_metadata](openstack_image_metadata.md) - - [openstack_image_properties](openstack_image_properties.md) - - [openstack_image_tags](openstack_image_tags.md) -- [openstack_instances](openstack_instances.md) - - [openstack_instance_addresses](openstack_instance_addresses.md) - - [openstack_instance_attached_volumes](openstack_instance_attached_volumes.md) - - [openstack_instance_flavor_extra_specs](openstack_instance_flavor_extra_specs.md) - - [openstack_instance_flavors](openstack_instance_flavors.md) - - [openstack_instance_metadata](openstack_instance_metadata.md) - - [openstack_instance_security_groups](openstack_instance_security_groups.md) - - [openstack_instance_tags](openstack_instance_tags.md) -- [openstack_networks](openstack_networks.md) - - [openstack_network_subnets](openstack_network_subnets.md) - - [openstack_network_tags](openstack_network_tags.md) -- [openstack_ports](openstack_ports.md) -- [openstack_projects](openstack_projects.md) -- [openstack_security_group_rules](openstack_security_group_rules.md) -- [openstack_security_groups](openstack_security_groups.md) -- [openstack_users](openstack_users.md) -- [openstack_volumes](openstack_volumes.md) \ No newline at end of file +- [openstack_baremetal_allocations](openstack_baremetal_allocations.md) +- [openstack_baremetal_drivers](openstack_baremetal_drivers.md) +- [openstack_baremetal_nodes](openstack_baremetal_nodes.md) +- [openstack_baremetal_ports](openstack_baremetal_ports.md) +- [openstack_blockstorage_attachments](openstack_blockstorage_attachments.md) + - [openstack_blockstorage_attachment_hosts](openstack_blockstorage_attachment_hosts.md) +- [openstack_blockstorage_availabilityzones](openstack_blockstorage_availabilityzones.md) +- [openstack_blockstorage_limits](openstack_blockstorage_limits.md) +- [openstack_blockstorage_qos](openstack_blockstorage_qos.md) +- [openstack_blockstorage_quotasets](openstack_blockstorage_quotasets.md) +- [openstack_blockstorage_quotasets_usage](openstack_blockstorage_quotasets_usage.md) +- [openstack_blockstorage_services](openstack_blockstorage_services.md) +- [openstack_blockstorage_snapshots](openstack_blockstorage_snapshots.md) +- [openstack_blockstorage_volumes](openstack_blockstorage_volumes.md) + - [openstack_blockstorage_volumes_backups](openstack_blockstorage_volumes_backups.md) +- [openstack_compute_aggregates](openstack_compute_aggregates.md) + - [openstack_compute_aggregate_hosts](openstack_compute_aggregate_hosts.md) +- [openstack_compute_flavors](openstack_compute_flavors.md) + - [openstack_compute_flavor_accesses](openstack_compute_flavor_accesses.md) + - [openstack_compute_flavor_extra_specs](openstack_compute_flavor_extra_specs.md) +- [openstack_compute_hypervisors](openstack_compute_hypervisors.md) +- [openstack_compute_instances](openstack_compute_instances.md) + - [openstack_compute_instance_addresses](openstack_compute_instance_addresses.md) + - [openstack_compute_instance_attached_volumes](openstack_compute_instance_attached_volumes.md) + - [openstack_compute_instance_flavor_extra_specs](openstack_compute_instance_flavor_extra_specs.md) + - [openstack_compute_instance_flavors](openstack_compute_instance_flavors.md) + - [openstack_compute_instance_metadata](openstack_compute_instance_metadata.md) + - [openstack_compute_instance_security_groups](openstack_compute_instance_security_groups.md) + - [openstack_compute_instance_tags](openstack_compute_instance_tags.md) +- [openstack_compute_serverusage](openstack_compute_serverusage.md) +- [openstack_identity_domains](openstack_identity_domains.md) + - [openstack_identity_domain_groups](openstack_identity_domain_groups.md) +- [openstack_identity_projects](openstack_identity_projects.md) + - [openstack_compute_project_limits](openstack_compute_project_limits.md) +- [openstack_identity_regions](openstack_identity_regions.md) +- [openstack_identity_registeredlimits](openstack_identity_registeredlimits.md) +- [openstack_identity_roles](openstack_identity_roles.md) +- [openstack_identity_services](openstack_identity_services.md) +- [openstack_identity_users](openstack_identity_users.md) + - [openstack_identity_user_keypairs](openstack_identity_user_keypairs.md) +- [openstack_image_images](openstack_image_images.md) + - [openstack_image_image_members](openstack_image_image_members.md) + - [openstack_image_image_metadata](openstack_image_image_metadata.md) + - [openstack_image_image_properties](openstack_image_image_properties.md) + - [openstack_image_image_tags](openstack_image_image_tags.md) +- [openstack_networking_networks](openstack_networking_networks.md) + - [openstack_networking_network_subnets](openstack_networking_network_subnets.md) + - [openstack_networking_network_tags](openstack_networking_network_tags.md) +- [openstack_networking_ports](openstack_networking_ports.md) +- [openstack_networking_security_group_rules](openstack_networking_security_group_rules.md) +- [openstack_networking_security_groups](openstack_networking_security_groups.md) \ No newline at end of file diff --git a/docs/tables/openstack_aggregate_hosts.md b/docs/tables/openstack_aggregate_hosts.md deleted file mode 100644 index d3aa3fe..0000000 --- a/docs/tables/openstack_aggregate_hosts.md +++ /dev/null @@ -1,19 +0,0 @@ -# Table: openstack_aggregate_hosts - -This table shows data for Openstack Aggregate Hosts. - -The primary key for this table is **_cq_id**. - -## Relations - -This table depends on [openstack_aggregates](openstack_aggregates.md). - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id (PK)|UUID| -|_cq_parent_id|UUID| -|name|String| \ No newline at end of file diff --git a/docs/tables/openstack_aggregates.md b/docs/tables/openstack_aggregates.md deleted file mode 100644 index b79c5bf..0000000 --- a/docs/tables/openstack_aggregates.md +++ /dev/null @@ -1,25 +0,0 @@ -# Table: openstack_aggregates - -This table shows data for Openstack Aggregates. - -The primary key for this table is **_cq_id**. - -## Relations - -The following tables depend on openstack_aggregates: - - [openstack_aggregate_hosts](openstack_aggregate_hosts.md) - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id (PK)|UUID| -|_cq_parent_id|UUID| -|availability_zone|String| -|hosts|StringArray| -|id|Int| -|metadata|JSON| -|name|String| -|deleted|Bool| \ No newline at end of file diff --git a/docs/tables/openstack_attachment_hosts.md b/docs/tables/openstack_attachment_hosts.md deleted file mode 100644 index fabd0ff..0000000 --- a/docs/tables/openstack_attachment_hosts.md +++ /dev/null @@ -1,20 +0,0 @@ -# Table: openstack_attachment_hosts - -This table shows data for Openstack Attachment Hosts. - -The primary key for this table is **_cq_id**. - -## Relations - -This table depends on [openstack_attachments](openstack_attachments.md). - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id (PK)|UUID| -|_cq_parent_id|UUID| -|host|String| -|port|Int| \ No newline at end of file diff --git a/docs/tables/openstack_attachments.md b/docs/tables/openstack_attachments.md deleted file mode 100644 index b6801b3..0000000 --- a/docs/tables/openstack_attachments.md +++ /dev/null @@ -1,42 +0,0 @@ -# Table: openstack_attachments - -This table shows data for Openstack Attachments. - -The primary key for this table is **_cq_id**. - -## Relations - -The following tables depend on openstack_attachments: - - [openstack_attachment_hosts](openstack_attachment_hosts.md) - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id (PK)|UUID| -|_cq_parent_id|UUID| -|attached_at|Timestamp| -|detached_at|Timestamp| -|access_mode|String| -|attach_mode|String| -|attachment_id|String| -|auth_enabled|Bool| -|auth_username|String| -|cluster_name|String| -|discard|Bool| -|driver_volume_type|String| -|encrypted|Bool| -|hosts|StringArray| -|keyring|Bool| -|name|String| -|ports|StringArray| -|secret_type|String| -|secret_uuid|String| -|volume_id|String| -|id|String| -|instance_id|String| -|status|String| -|project_id|String| -|connection_info|JSON| \ No newline at end of file diff --git a/docs/tables/openstack_baremetal_allocations.md b/docs/tables/openstack_baremetal_allocations.md new file mode 100644 index 0000000..35b711d --- /dev/null +++ b/docs/tables/openstack_baremetal_allocations.md @@ -0,0 +1,23 @@ +# Table: openstack_baremetal_allocations + +This table shows data for Openstack Baremetal Allocations. + +The primary key for this table is **_cq_id**. + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|uuid|`utf8`| +|candidate_nodes|`list`| +|last_error|`utf8`| +|name|`utf8`| +|node_uuid|`utf8`| +|state|`utf8`| +|resource_class|`utf8`| +|traits|`list`| +|extra|`json`| +|created_at|`timestamp[us, tz=UTC]`| +|updated_at|`timestamp[us, tz=UTC]`| \ No newline at end of file diff --git a/docs/tables/openstack_baremetal_drivers.md b/docs/tables/openstack_baremetal_drivers.md new file mode 100644 index 0000000..ed73ad9 --- /dev/null +++ b/docs/tables/openstack_baremetal_drivers.md @@ -0,0 +1,40 @@ +# Table: openstack_baremetal_drivers + +This table shows data for Openstack Baremetal Drivers. + +The primary key for this table is **_cq_id**. + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|name|`utf8`| +|hosts|`list`| +|type|`utf8`| +|default_bios_interface|`utf8`| +|default_boot_interface|`utf8`| +|default_console_interface|`utf8`| +|default_deploy_interface|`utf8`| +|default_inspect_interface|`utf8`| +|default_management_interface|`utf8`| +|default_network_interface|`utf8`| +|default_power_interface|`utf8`| +|default_raid_interface|`utf8`| +|default_rescue_interface|`utf8`| +|default_storage_interface|`utf8`| +|default_vendor_interface|`utf8`| +|enabled_bios_interfaces|`list`| +|enabled_boot_interfaces|`list`| +|enabled_console_interfaces|`list`| +|enabled_deploy_interfaces|`list`| +|enabled_inspect_interfaces|`list`| +|enabled_management_interfaces|`list`| +|enabled_network_interfaces|`list`| +|enabled_power_interfaces|`list`| +|enabled_rescue_interfaces|`list`| +|enabled_raid_interfaces|`list`| +|enabled_storage_interfaces|`list`| +|enabled_vendor_interfaces|`list`| +|links|`json`| \ No newline at end of file diff --git a/docs/tables/openstack_baremetal_nodes.md b/docs/tables/openstack_baremetal_nodes.md new file mode 100644 index 0000000..979a625 --- /dev/null +++ b/docs/tables/openstack_baremetal_nodes.md @@ -0,0 +1,60 @@ +# Table: openstack_baremetal_nodes + +This table shows data for Openstack Baremetal Nodes. + +The primary key for this table is **_cq_id**. + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|automated_clean|`bool`| +|uuid|`utf8`| +|name|`utf8`| +|power_state|`utf8`| +|target_power_state|`utf8`| +|provision_state|`utf8`| +|target_provision_state|`utf8`| +|maintenance|`bool`| +|maintenance_reason|`utf8`| +|fault|`utf8`| +|last_error|`utf8`| +|reservation|`utf8`| +|driver|`utf8`| +|driver_info|`json`| +|driver_internal_info|`json`| +|instance_info|`json`| +|instance_uuid|`utf8`| +|chassis_uuid|`utf8`| +|extra|`json`| +|console_enabled|`bool`| +|raid_config|`json`| +|target_raid_config|`json`| +|clean_step|`json`| +|deploy_step|`json`| +|resource_class|`utf8`| +|bios_interface|`utf8`| +|boot_interface|`utf8`| +|console_interface|`utf8`| +|deploy_interface|`utf8`| +|inspect_interface|`utf8`| +|management_interface|`utf8`| +|network_interface|`utf8`| +|power_interface|`utf8`| +|raid_interface|`utf8`| +|rescue_interface|`utf8`| +|storage_interface|`utf8`| +|traits|`list`| +|vendor_interface|`utf8`| +|conductor_group|`utf8`| +|protected|`bool`| +|protected_reason|`utf8`| +|owner|`utf8`| +|network_data|`json`| +|created_at|`timestamp[us, tz=UTC]`| +|updated_at|`timestamp[us, tz=UTC]`| +|provision_updated_at|`timestamp[us, tz=UTC]`| +|inspection_started_at|`timestamp[us, tz=UTC]`| +|inspection_finished_at|`timestamp[us, tz=UTC]`| \ No newline at end of file diff --git a/docs/tables/openstack_baremetal_ports.md b/docs/tables/openstack_baremetal_ports.md new file mode 100644 index 0000000..1f47eee --- /dev/null +++ b/docs/tables/openstack_baremetal_ports.md @@ -0,0 +1,35 @@ +# Table: openstack_baremetal_ports + +This table shows data for Openstack Baremetal Ports. + +The primary key for this table is **_cq_id**. + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|id|`utf8`| +|uuid|`utf8`| +|tenant_id|`utf8`| +|project_id|`utf8`| +|device_id|`utf8`| +|network_id|`utf8`| +|ip_addresses|`list`| +|ip_address|`utf8`| +|name|`utf8`| +|description|`utf8`| +|admin_state_up|`bool`| +|status|`utf8`| +|mac_address|`utf8`| +|fixed_ips|`list`| +|device_owner|`utf8`| +|security_groups|`json`| +|allowed_address_pairs|`list`| +|tags|`list`| +|propagate_uplink_status|`bool`| +|value_specs|`utf8`| +|revision_number|`int64`| +|created_at|`timestamp[us, tz=UTC]`| +|updated_at|`timestamp[us, tz=UTC]`| \ No newline at end of file diff --git a/docs/tables/openstack_blockstorage_attachment_hosts.md b/docs/tables/openstack_blockstorage_attachment_hosts.md new file mode 100644 index 0000000..70f21c7 --- /dev/null +++ b/docs/tables/openstack_blockstorage_attachment_hosts.md @@ -0,0 +1,18 @@ +# Table: openstack_blockstorage_attachment_hosts + +This table shows data for Openstack Blockstorage Attachment Hosts. + +The primary key for this table is **_cq_id**. + +## Relations + +This table depends on [openstack_blockstorage_attachments](openstack_blockstorage_attachments.md). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|host|`utf8`| +|port|`int64`| \ No newline at end of file diff --git a/docs/tables/openstack_blockstorage_attachments.md b/docs/tables/openstack_blockstorage_attachments.md new file mode 100644 index 0000000..f292723 --- /dev/null +++ b/docs/tables/openstack_blockstorage_attachments.md @@ -0,0 +1,40 @@ +# Table: openstack_blockstorage_attachments + +This table shows data for Openstack Blockstorage Attachments. + +The primary key for this table is **_cq_id**. + +## Relations + +The following tables depend on openstack_blockstorage_attachments: + - [openstack_blockstorage_attachment_hosts](openstack_blockstorage_attachment_hosts.md) + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|attached_at|`timestamp[us, tz=UTC]`| +|detached_at|`timestamp[us, tz=UTC]`| +|access_mode|`utf8`| +|attach_mode|`utf8`| +|attachment_id|`utf8`| +|auth_enabled|`bool`| +|auth_username|`utf8`| +|cluster_name|`utf8`| +|discard|`bool`| +|driver_volume_type|`utf8`| +|encrypted|`bool`| +|hosts|`list`| +|keyring|`bool`| +|name|`utf8`| +|ports|`list`| +|secret_type|`utf8`| +|secret_uuid|`utf8`| +|volume_id|`utf8`| +|id|`utf8`| +|instance_id|`utf8`| +|status|`utf8`| +|project_id|`utf8`| +|connection_info|`json`| \ No newline at end of file diff --git a/docs/tables/openstack_blockstorage_availabilityzones.md b/docs/tables/openstack_blockstorage_availabilityzones.md new file mode 100644 index 0000000..0cc8cd4 --- /dev/null +++ b/docs/tables/openstack_blockstorage_availabilityzones.md @@ -0,0 +1,14 @@ +# Table: openstack_blockstorage_availabilityzones + +This table shows data for Openstack Blockstorage Availabilityzones. + +The primary key for this table is **_cq_id**. + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|zone_name|`utf8`| +|zone_state|`json`| \ No newline at end of file diff --git a/docs/tables/openstack_blockstorage_limits.md b/docs/tables/openstack_blockstorage_limits.md new file mode 100644 index 0000000..7467247 --- /dev/null +++ b/docs/tables/openstack_blockstorage_limits.md @@ -0,0 +1,29 @@ +# Table: openstack_blockstorage_limits + +This table shows data for Openstack Blockstorage Limits. + +The primary key for this table is **_cq_id**. + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|max_total_volumes|`int64`| +|max_total_snapshots|`int64`| +|max_total_volume_gigabytes|`int64`| +|max_total_backups|`int64`| +|max_total_backup_gigabytes|`int64`| +|total_volumes_used|`int64`| +|total_gigabytes_used|`int64`| +|total_snapshots_used|`int64`| +|total_backups_used|`int64`| +|total_backup_gigabytes_used|`int64`| +|regex|`list`| +|uri|`list`| +|verb|`list`| +|next_available|`list`| +|unit|`list`| +|value|`list`| +|remaining|`list`| \ No newline at end of file diff --git a/docs/tables/openstack_blockstorage_qos.md b/docs/tables/openstack_blockstorage_qos.md new file mode 100644 index 0000000..aed5106 --- /dev/null +++ b/docs/tables/openstack_blockstorage_qos.md @@ -0,0 +1,16 @@ +# Table: openstack_blockstorage_qos + +This table shows data for Openstack Blockstorage QOS. + +The primary key for this table is **id**. + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id|`uuid`| +|_cq_parent_id|`uuid`| +|name|`utf8`| +|id (PK)|`utf8`| +|consumer|`utf8`| +|specs|`json`| \ No newline at end of file diff --git a/docs/tables/openstack_blockstorage_quotasets.md b/docs/tables/openstack_blockstorage_quotasets.md new file mode 100644 index 0000000..11ef10f --- /dev/null +++ b/docs/tables/openstack_blockstorage_quotasets.md @@ -0,0 +1,20 @@ +# Table: openstack_blockstorage_quotasets + +This table shows data for Openstack Blockstorage Quotasets. + +The primary key for this table is **_cq_id**. + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|id|`utf8`| +|volumes|`int64`| +|snapshots|`int64`| +|gigabytes|`int64`| +|per_volume_gigabytes|`int64`| +|backups|`int64`| +|backup_gigabytes|`int64`| +|groups|`int64`| \ No newline at end of file diff --git a/docs/tables/openstack_blockstorage_quotasets_usage.md b/docs/tables/openstack_blockstorage_quotasets_usage.md new file mode 100644 index 0000000..afc8e70 --- /dev/null +++ b/docs/tables/openstack_blockstorage_quotasets_usage.md @@ -0,0 +1,41 @@ +# Table: openstack_blockstorage_quotasets_usage + +This table shows data for Openstack Blockstorage Quotasets Usage. + +The primary key for this table is **_cq_id**. + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|volumes_in_use|`int64`| +|volumes_allocated|`int64`| +|volumes_reserved|`int64`| +|volumes_limit|`int64`| +|snapshots_in_use|`int64`| +|snapshots_allocated|`int64`| +|snapshots_reserved|`int64`| +|snapshots_limit|`int64`| +|gigabytes_in_use|`int64`| +|gigabytes_allocated|`int64`| +|gigabytes_reserved|`int64`| +|gigabytes_limit|`int64`| +|per_volume_gigabytes_in_use|`int64`| +|per_volume_gigabytes_allocated|`int64`| +|per_volume_gigabytes_reserved|`int64`| +|per_volume_gigabytes_limit|`int64`| +|backups_in_use|`int64`| +|backups_allocated|`int64`| +|backups_reserved|`int64`| +|backups_limit|`int64`| +|backup_gigabytes_in_use|`int64`| +|backup_gigabytes_allocated|`int64`| +|backup_gigabytes_reserved|`int64`| +|backup_gigabytes_limit|`int64`| +|groups_in_use|`int64`| +|groups_allocated|`int64`| +|groups_reserved|`int64`| +|groups_limit|`int64`| +|id|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_blockstorage_services.md b/docs/tables/openstack_blockstorage_services.md new file mode 100644 index 0000000..ab70176 --- /dev/null +++ b/docs/tables/openstack_blockstorage_services.md @@ -0,0 +1,22 @@ +# Table: openstack_blockstorage_services + +This table shows data for Openstack Blockstorage Services. + +The primary key for this table is **_cq_id**. + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|binary|`utf8`| +|disabled_reason|`utf8`| +|host|`utf8`| +|state|`utf8`| +|status|`utf8`| +|zone|`utf8`| +|frozen|`bool`| +|cluster|`utf8`| +|replication_status|`utf8`| +|active_backend_id|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_blockstorage_snapshots.md b/docs/tables/openstack_blockstorage_snapshots.md new file mode 100644 index 0000000..e0d4aa2 --- /dev/null +++ b/docs/tables/openstack_blockstorage_snapshots.md @@ -0,0 +1,19 @@ +# Table: openstack_blockstorage_snapshots + +This table shows data for Openstack Blockstorage Snapshots. + +The primary key for this table is **id**. + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id|`uuid`| +|_cq_parent_id|`uuid`| +|id (PK)|`utf8`| +|name|`utf8`| +|description|`utf8`| +|volume_id|`utf8`| +|status|`utf8`| +|size|`int64`| +|metadata|`json`| \ No newline at end of file diff --git a/docs/tables/openstack_blockstorage_volumes.md b/docs/tables/openstack_blockstorage_volumes.md new file mode 100644 index 0000000..409226e --- /dev/null +++ b/docs/tables/openstack_blockstorage_volumes.md @@ -0,0 +1,46 @@ +# Table: openstack_blockstorage_volumes + +This table shows data for Openstack Blockstorage Volumes. + +The primary key for this table is **id**. + +## Relations + +The following tables depend on openstack_blockstorage_volumes: + - [openstack_blockstorage_volumes_backups](openstack_blockstorage_volumes_backups.md) + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id|`uuid`| +|_cq_parent_id|`uuid`| +|id (PK)|`utf8`| +|status|`utf8`| +|size|`int64`| +|availability_zone|`utf8`| +|created_at|`json`| +|updated_at|`json`| +|attachments|`json`| +|name|`utf8`| +|description|`utf8`| +|volume_type|`utf8`| +|snapshot_id|`utf8`| +|source_volid|`utf8`| +|backup_id|`utf8`| +|group_id|`utf8`| +|metadata|`json`| +|user_id|`utf8`| +|bootable|`utf8`| +|encrypted|`bool`| +|replication_status|`utf8`| +|consistencygroup_id|`utf8`| +|multiattach|`bool`| +|volume_image_metadata|`json`| +|migration_status|`utf8`| +|host|`utf8`| +|migration_status_name|`utf8`| +|migration_status_tenant|`utf8`| +|provider_id|`utf8`| +|service_uuid|`utf8`| +|shared_targets|`bool`| \ No newline at end of file diff --git a/docs/tables/openstack_blockstorage_volumes_backups.md b/docs/tables/openstack_blockstorage_volumes_backups.md new file mode 100644 index 0000000..1349b5c --- /dev/null +++ b/docs/tables/openstack_blockstorage_volumes_backups.md @@ -0,0 +1,34 @@ +# Table: openstack_blockstorage_volumes_backups + +This table shows data for Openstack Blockstorage Volumes Backups. + +The primary key for this table is **id**. + +## Relations + +This table depends on [openstack_blockstorage_volumes](openstack_blockstorage_volumes.md). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id|`uuid`| +|_cq_parent_id|`uuid`| +|id (PK)|`utf8`| +|created_at|`timestamp[us, tz=UTC]`| +|updated_at|`timestamp[us, tz=UTC]`| +|name|`utf8`| +|description|`utf8`| +|volume_id|`utf8`| +|snapshot_id|`utf8`| +|status|`utf8`| +|size|`int64`| +|object_count|`int64`| +|container|`utf8`| +|has_dependent_backups|`bool`| +|fail_reason|`utf8`| +|is_incremental|`bool`| +|data_timestamp|`timestamp[us, tz=UTC]`| +|project_id|`utf8`| +|metadata|`json`| +|availability_zone|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_compute_aggregate_hosts.md b/docs/tables/openstack_compute_aggregate_hosts.md new file mode 100644 index 0000000..0b808ad --- /dev/null +++ b/docs/tables/openstack_compute_aggregate_hosts.md @@ -0,0 +1,17 @@ +# Table: openstack_compute_aggregate_hosts + +This table shows data for Openstack Compute Aggregate Hosts. + +The primary key for this table is **_cq_id**. + +## Relations + +This table depends on [openstack_compute_aggregates](openstack_compute_aggregates.md). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|name|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_compute_aggregates.md b/docs/tables/openstack_compute_aggregates.md new file mode 100644 index 0000000..a4b0c5f --- /dev/null +++ b/docs/tables/openstack_compute_aggregates.md @@ -0,0 +1,23 @@ +# Table: openstack_compute_aggregates + +This table shows data for Openstack Compute Aggregates. + +The primary key for this table is **_cq_id**. + +## Relations + +The following tables depend on openstack_compute_aggregates: + - [openstack_compute_aggregate_hosts](openstack_compute_aggregate_hosts.md) + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|availability_zone|`utf8`| +|hosts|`list`| +|id|`int64`| +|metadata|`json`| +|name|`utf8`| +|deleted|`bool`| \ No newline at end of file diff --git a/docs/tables/openstack_compute_flavor_accesses.md b/docs/tables/openstack_compute_flavor_accesses.md new file mode 100644 index 0000000..c1ed106 --- /dev/null +++ b/docs/tables/openstack_compute_flavor_accesses.md @@ -0,0 +1,18 @@ +# Table: openstack_compute_flavor_accesses + +This table shows data for Openstack Compute Flavor Accesses. + +The primary key for this table is **_cq_id**. + +## Relations + +This table depends on [openstack_compute_flavors](openstack_compute_flavors.md). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|flavor_id|`utf8`| +|project_id|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_compute_flavor_extra_specs.md b/docs/tables/openstack_compute_flavor_extra_specs.md new file mode 100644 index 0000000..b3c86f5 --- /dev/null +++ b/docs/tables/openstack_compute_flavor_extra_specs.md @@ -0,0 +1,18 @@ +# Table: openstack_compute_flavor_extra_specs + +This table shows data for Openstack Compute Flavor Extra Specs. + +The primary key for this table is **_cq_id**. + +## Relations + +This table depends on [openstack_compute_flavors](openstack_compute_flavors.md). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|key|`utf8`| +|value|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_compute_flavors.md b/docs/tables/openstack_compute_flavors.md new file mode 100644 index 0000000..7f9df8d --- /dev/null +++ b/docs/tables/openstack_compute_flavors.md @@ -0,0 +1,27 @@ +# Table: openstack_compute_flavors + +This table shows data for Openstack Compute Flavors. + +The primary key for this table is **_cq_id**. + +## Relations + +The following tables depend on openstack_compute_flavors: + - [openstack_compute_flavor_accesses](openstack_compute_flavor_accesses.md) + - [openstack_compute_flavor_extra_specs](openstack_compute_flavor_extra_specs.md) + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|id|`utf8`| +|disk|`int64`| +|ram|`int64`| +|name|`utf8`| +|rxtx_factor|`float64`| +|vcpus|`int64`| +|is_public|`bool`| +|ephemeral|`int64`| +|description|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_compute_hypervisors.md b/docs/tables/openstack_compute_hypervisors.md new file mode 100644 index 0000000..6ba60da --- /dev/null +++ b/docs/tables/openstack_compute_hypervisors.md @@ -0,0 +1,28 @@ +# Table: openstack_compute_hypervisors + +This table shows data for Openstack Compute Hypervisors. + +The primary key for this table is **_cq_id**. + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|current_workload|`int64`| +|status|`utf8`| +|state|`utf8`| +|disk_available_least|`int64`| +|host_ip|`utf8`| +|free_ram_mb|`int64`| +|hypervisor_hostname|`utf8`| +|hypervisor_type|`utf8`| +|local_gb_used|`int64`| +|memory_mb|`int64`| +|memory_mb_used|`int64`| +|running_vms|`int64`| +|service|`json`| +|servers|`json`| +|vcpus|`int64`| +|vcpus_used|`int64`| \ No newline at end of file diff --git a/docs/tables/openstack_compute_instance_addresses.md b/docs/tables/openstack_compute_instance_addresses.md new file mode 100644 index 0000000..d553632 --- /dev/null +++ b/docs/tables/openstack_compute_instance_addresses.md @@ -0,0 +1,21 @@ +# Table: openstack_compute_instance_addresses + +This table shows data for Openstack Compute Instance Addresses. + +The primary key for this table is **_cq_id**. + +## Relations + +This table depends on [openstack_compute_instances](openstack_compute_instances.md). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|network|`utf8`| +|mac_address|`utf8`| +|type|`utf8`| +|ip_address|`utf8`| +|ip_version|`int64`| \ No newline at end of file diff --git a/docs/tables/openstack_compute_instance_attached_volumes.md b/docs/tables/openstack_compute_instance_attached_volumes.md new file mode 100644 index 0000000..51f5341 --- /dev/null +++ b/docs/tables/openstack_compute_instance_attached_volumes.md @@ -0,0 +1,17 @@ +# Table: openstack_compute_instance_attached_volumes + +This table shows data for Openstack Compute Instance Attached Volumes. + +The primary key for this table is **_cq_id**. + +## Relations + +This table depends on [openstack_compute_instances](openstack_compute_instances.md). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|id|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_compute_instance_flavor_extra_specs.md b/docs/tables/openstack_compute_instance_flavor_extra_specs.md new file mode 100644 index 0000000..90a6d89 --- /dev/null +++ b/docs/tables/openstack_compute_instance_flavor_extra_specs.md @@ -0,0 +1,18 @@ +# Table: openstack_compute_instance_flavor_extra_specs + +This table shows data for Openstack Compute Instance Flavor Extra Specs. + +The primary key for this table is **_cq_id**. + +## Relations + +This table depends on [openstack_compute_instances](openstack_compute_instances.md). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|key|`utf8`| +|value|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_compute_instance_flavors.md b/docs/tables/openstack_compute_instance_flavors.md new file mode 100644 index 0000000..1dd2971 --- /dev/null +++ b/docs/tables/openstack_compute_instance_flavors.md @@ -0,0 +1,27 @@ +# Table: openstack_compute_instance_flavors + +This table shows data for Openstack Compute Instance Flavors. + +The primary key for this table is **_cq_id**. + +## Relations + +This table depends on [openstack_compute_instances](openstack_compute_instances.md). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|name|`utf8`| +|vcpus|`int64`| +|vgpus|`int64`| +|cores|`int64`| +|sockets|`int64`| +|ram|`int64`| +|disk|`int64`| +|swap|`int64`| +|ephemeral|`int64`| +|rng_allowed|`bool`| +|watchdog_action|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_compute_instance_metadata.md b/docs/tables/openstack_compute_instance_metadata.md new file mode 100644 index 0000000..32679ae --- /dev/null +++ b/docs/tables/openstack_compute_instance_metadata.md @@ -0,0 +1,18 @@ +# Table: openstack_compute_instance_metadata + +This table shows data for Openstack Compute Instance Metadata. + +The primary key for this table is **_cq_id**. + +## Relations + +This table depends on [openstack_compute_instances](openstack_compute_instances.md). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|key|`utf8`| +|value|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_compute_instance_security_groups.md b/docs/tables/openstack_compute_instance_security_groups.md new file mode 100644 index 0000000..3c738fa --- /dev/null +++ b/docs/tables/openstack_compute_instance_security_groups.md @@ -0,0 +1,17 @@ +# Table: openstack_compute_instance_security_groups + +This table shows data for Openstack Compute Instance Security Groups. + +The primary key for this table is **_cq_id**. + +## Relations + +This table depends on [openstack_compute_instances](openstack_compute_instances.md). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|name|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_compute_instance_tags.md b/docs/tables/openstack_compute_instance_tags.md new file mode 100644 index 0000000..829152b --- /dev/null +++ b/docs/tables/openstack_compute_instance_tags.md @@ -0,0 +1,17 @@ +# Table: openstack_compute_instance_tags + +This table shows data for Openstack Compute Instance Tags. + +The primary key for this table is **_cq_id**. + +## Relations + +This table depends on [openstack_compute_instances](openstack_compute_instances.md). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|value|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_compute_instances.md b/docs/tables/openstack_compute_instances.md new file mode 100644 index 0000000..dcf5e19 --- /dev/null +++ b/docs/tables/openstack_compute_instances.md @@ -0,0 +1,63 @@ +# Table: openstack_compute_instances + +This table shows data for Openstack Compute Instances. + +The primary key for this table is **_cq_id**. + +## Relations + +The following tables depend on openstack_compute_instances: + - [openstack_compute_instance_addresses](openstack_compute_instance_addresses.md) + - [openstack_compute_instance_attached_volumes](openstack_compute_instance_attached_volumes.md) + - [openstack_compute_instance_flavor_extra_specs](openstack_compute_instance_flavor_extra_specs.md) + - [openstack_compute_instance_flavors](openstack_compute_instance_flavors.md) + - [openstack_compute_instance_metadata](openstack_compute_instance_metadata.md) + - [openstack_compute_instance_security_groups](openstack_compute_instance_security_groups.md) + - [openstack_compute_instance_tags](openstack_compute_instance_tags.md) + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|image_id|`utf8`| +|power_state_name|`utf8`| +|id|`utf8`| +|tenant_id|`utf8`| +|user_id|`utf8`| +|name|`utf8`| +|created_at|`timestamp[us, tz=UTC]`| +|launched_at|`timestamp[us, tz=UTC]`| +|updated_at|`timestamp[us, tz=UTC]`| +|terminated_at|`timestamp[us, tz=UTC]`| +|hostid|`utf8`| +|status|`utf8`| +|progress|`int64`| +|access_ipv4|`utf8`| +|access_ipv6|`utf8`| +|flavor|`json`| +|addresses|`json`| +|metadata|`json`| +|key_name|`utf8`| +|admin_pass|`utf8`| +|security_groups|`json`| +|attached_volumes|`json`| +|tags|`list`| +|server_groups|`list`| +|disk_config|`utf8`| +|availability_zone|`utf8`| +|host|`utf8`| +|hostname|`utf8`| +|hypervisor_hostname|`utf8`| +|instance_name|`utf8`| +|kernel_id|`utf8`| +|launch_index|`int64`| +|ramdisk_id|`utf8`| +|reservation_id|`utf8`| +|root_device_name|`utf8`| +|user_data|`utf8`| +|power_state_id|`int64`| +|vm_state|`utf8`| +|config_drive|`utf8`| +|description|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_compute_project_limits.md b/docs/tables/openstack_compute_project_limits.md new file mode 100644 index 0000000..ea0f684 --- /dev/null +++ b/docs/tables/openstack_compute_project_limits.md @@ -0,0 +1,35 @@ +# Table: openstack_compute_project_limits + +This table shows data for Openstack Compute Project Limits. + +The primary key for this table is **_cq_id**. + +## Relations + +This table depends on [openstack_identity_projects](openstack_identity_projects.md). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|max_total_cores|`int64`| +|max_image_meta|`int64`| +|max_server_meta|`int64`| +|max_personality|`int64`| +|max_personality_size|`int64`| +|max_total_keypairs|`int64`| +|max_security_groups|`int64`| +|max_security_group_rules|`int64`| +|max_server_groups|`int64`| +|max_server_group_members|`int64`| +|max_total_floating_ips|`int64`| +|max_total_instances|`int64`| +|max_total_ram_size|`int64`| +|total_cores_used|`int64`| +|total_instances_used|`int64`| +|total_floating_ips_used|`int64`| +|total_ram_used|`int64`| +|total_security_groups_used|`int64`| +|total_server_groups_used|`int64`| \ No newline at end of file diff --git a/docs/tables/openstack_compute_serverusage.md b/docs/tables/openstack_compute_serverusage.md new file mode 100644 index 0000000..79f2f83 --- /dev/null +++ b/docs/tables/openstack_compute_serverusage.md @@ -0,0 +1,22 @@ +# Table: openstack_compute_serverusage + +This table shows data for Openstack Compute Serverusage. + +The primary key for this table is **_cq_id**. + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|flavor|`utf8`| +|hours|`float64`| +|instance_id|`utf8`| +|local_gb|`int64`| +|memory_mb|`int64`| +|name|`utf8`| +|state|`utf8`| +|tenant_id|`utf8`| +|uptime|`int64`| +|vcpus|`int64`| \ No newline at end of file diff --git a/docs/tables/openstack_flavor_accesses.md b/docs/tables/openstack_flavor_accesses.md deleted file mode 100644 index dbd0b64..0000000 --- a/docs/tables/openstack_flavor_accesses.md +++ /dev/null @@ -1,20 +0,0 @@ -# Table: openstack_flavor_accesses - -This table shows data for Openstack Flavor Accesses. - -The primary key for this table is **_cq_id**. - -## Relations - -This table depends on [openstack_flavors](openstack_flavors.md). - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id (PK)|UUID| -|_cq_parent_id|UUID| -|flavor_id|String| -|project_id|String| \ No newline at end of file diff --git a/docs/tables/openstack_flavor_extra_specs.md b/docs/tables/openstack_flavor_extra_specs.md deleted file mode 100644 index 21e4547..0000000 --- a/docs/tables/openstack_flavor_extra_specs.md +++ /dev/null @@ -1,20 +0,0 @@ -# Table: openstack_flavor_extra_specs - -This table shows data for Openstack Flavor Extra Specs. - -The primary key for this table is **_cq_id**. - -## Relations - -This table depends on [openstack_flavors](openstack_flavors.md). - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id (PK)|UUID| -|_cq_parent_id|UUID| -|key|String| -|value|String| \ No newline at end of file diff --git a/docs/tables/openstack_flavors.md b/docs/tables/openstack_flavors.md deleted file mode 100644 index 1581d66..0000000 --- a/docs/tables/openstack_flavors.md +++ /dev/null @@ -1,29 +0,0 @@ -# Table: openstack_flavors - -This table shows data for Openstack Flavors. - -The primary key for this table is **_cq_id**. - -## Relations - -The following tables depend on openstack_flavors: - - [openstack_flavor_accesses](openstack_flavor_accesses.md) - - [openstack_flavor_extra_specs](openstack_flavor_extra_specs.md) - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id (PK)|UUID| -|_cq_parent_id|UUID| -|id|String| -|disk|Int| -|ram|Int| -|name|String| -|rxtx_factor|Float| -|vcpus|Int| -|is_public|Bool| -|ephemeral|Int| -|description|String| \ No newline at end of file diff --git a/docs/tables/openstack_hypervisors.md b/docs/tables/openstack_hypervisors.md deleted file mode 100644 index 56c58c7..0000000 --- a/docs/tables/openstack_hypervisors.md +++ /dev/null @@ -1,30 +0,0 @@ -# Table: openstack_hypervisors - -This table shows data for Openstack Hypervisors. - -The primary key for this table is **_cq_id**. - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id (PK)|UUID| -|_cq_parent_id|UUID| -|current_workload|Int| -|status|String| -|state|String| -|disk_available_least|Int| -|host_ip|String| -|free_ram_mb|Int| -|hypervisor_hostname|String| -|hypervisor_type|String| -|local_gb_used|Int| -|memory_mb|Int| -|memory_mb_used|Int| -|running_vms|Int| -|service|JSON| -|servers|JSON| -|vcpus|Int| -|vcpus_used|Int| \ No newline at end of file diff --git a/docs/tables/openstack_identity_domain_groups.md b/docs/tables/openstack_identity_domain_groups.md new file mode 100644 index 0000000..35ec2d9 --- /dev/null +++ b/docs/tables/openstack_identity_domain_groups.md @@ -0,0 +1,20 @@ +# Table: openstack_identity_domain_groups + +This table shows data for Openstack Identity Domain Groups. + +The primary key for this table is **_cq_id**. + +## Relations + +This table depends on [openstack_identity_domains](openstack_identity_domains.md). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|description|`utf8`| +|domain_id|`utf8`| +|id|`utf8`| +|name|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_identity_domains.md b/docs/tables/openstack_identity_domains.md new file mode 100644 index 0000000..429e16c --- /dev/null +++ b/docs/tables/openstack_identity_domains.md @@ -0,0 +1,21 @@ +# Table: openstack_identity_domains + +This table shows data for Openstack Identity Domains. + +The primary key for this table is **_cq_id**. + +## Relations + +The following tables depend on openstack_identity_domains: + - [openstack_identity_domain_groups](openstack_identity_domain_groups.md) + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|description|`utf8`| +|enabled|`bool`| +|id|`utf8`| +|name|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_identity_projects.md b/docs/tables/openstack_identity_projects.md new file mode 100644 index 0000000..3a2ce55 --- /dev/null +++ b/docs/tables/openstack_identity_projects.md @@ -0,0 +1,26 @@ +# Table: openstack_identity_projects + +This table shows data for Openstack Identity Projects. + +The primary key for this table is **id**. + +## Relations + +The following tables depend on openstack_identity_projects: + - [openstack_compute_project_limits](openstack_compute_project_limits.md) + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id|`uuid`| +|_cq_parent_id|`uuid`| +|is_domain|`bool`| +|description|`utf8`| +|domain_id|`utf8`| +|enabled|`bool`| +|id (PK)|`utf8`| +|name|`utf8`| +|parent_id|`utf8`| +|tags|`list`| +|options|`json`| \ No newline at end of file diff --git a/docs/tables/openstack_identity_regions.md b/docs/tables/openstack_identity_regions.md new file mode 100644 index 0000000..26065bc --- /dev/null +++ b/docs/tables/openstack_identity_regions.md @@ -0,0 +1,15 @@ +# Table: openstack_identity_regions + +This table shows data for Openstack Identity Regions. + +The primary key for this table is **_cq_id**. + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|description|`utf8`| +|id|`utf8`| +|parent_region_id|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_identity_registeredlimits.md b/docs/tables/openstack_identity_registeredlimits.md new file mode 100644 index 0000000..5db5c53 --- /dev/null +++ b/docs/tables/openstack_identity_registeredlimits.md @@ -0,0 +1,18 @@ +# Table: openstack_identity_registeredlimits + +This table shows data for Openstack Identity Registeredlimits. + +The primary key for this table is **_cq_id**. + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|id|`utf8`| +|region_id|`utf8`| +|service_id|`utf8`| +|description|`utf8`| +|resource_name|`utf8`| +|default_limit|`int64`| \ No newline at end of file diff --git a/docs/tables/openstack_identity_roles.md b/docs/tables/openstack_identity_roles.md new file mode 100644 index 0000000..0c5d995 --- /dev/null +++ b/docs/tables/openstack_identity_roles.md @@ -0,0 +1,15 @@ +# Table: openstack_identity_roles + +This table shows data for Openstack Identity Roles. + +The primary key for this table is **_cq_id**. + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|domain_id|`utf8`| +|id|`utf8`| +|name|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_identity_services.md b/docs/tables/openstack_identity_services.md new file mode 100644 index 0000000..8096b40 --- /dev/null +++ b/docs/tables/openstack_identity_services.md @@ -0,0 +1,15 @@ +# Table: openstack_identity_services + +This table shows data for Openstack Identity Services. + +The primary key for this table is **_cq_id**. + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|id|`utf8`| +|type|`utf8`| +|enabled|`bool`| \ No newline at end of file diff --git a/docs/tables/openstack_identity_user_keypairs.md b/docs/tables/openstack_identity_user_keypairs.md new file mode 100644 index 0000000..f4d05e4 --- /dev/null +++ b/docs/tables/openstack_identity_user_keypairs.md @@ -0,0 +1,22 @@ +# Table: openstack_identity_user_keypairs + +This table shows data for Openstack Identity User Keypairs. + +The primary key for this table is **_cq_id**. + +## Relations + +This table depends on [openstack_identity_users](openstack_identity_users.md). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|name|`utf8`| +|fingerprint|`utf8`| +|public_key|`utf8`| +|private_key|`utf8`| +|user_id|`utf8`| +|type|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_identity_users.md b/docs/tables/openstack_identity_users.md new file mode 100644 index 0000000..95cefba --- /dev/null +++ b/docs/tables/openstack_identity_users.md @@ -0,0 +1,26 @@ +# Table: openstack_identity_users + +This table shows data for Openstack Identity Users. + +The primary key for this table is **_cq_id**. + +## Relations + +The following tables depend on openstack_identity_users: + - [openstack_identity_user_keypairs](openstack_identity_user_keypairs.md) + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|ignore_change_password_upon_first_use|`bool`| +|ignore_lockout_failure_attempts|`bool`| +|ignore_password_expiry|`bool`| +|default_project_id|`utf8`| +|description|`utf8`| +|domain_id|`utf8`| +|enabled|`bool`| +|id|`utf8`| +|name|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_image_image_members.md b/docs/tables/openstack_image_image_members.md new file mode 100644 index 0000000..c202393 --- /dev/null +++ b/docs/tables/openstack_image_image_members.md @@ -0,0 +1,22 @@ +# Table: openstack_image_image_members + +This table shows data for Openstack Image Image Members. + +The primary key for this table is **_cq_id**. + +## Relations + +This table depends on [openstack_image_images](openstack_image_images.md). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|created_at|`timestamp[us, tz=UTC]`| +|image_id|`utf8`| +|member_id|`utf8`| +|schema|`utf8`| +|status|`utf8`| +|updated_at|`timestamp[us, tz=UTC]`| \ No newline at end of file diff --git a/docs/tables/openstack_image_image_metadata.md b/docs/tables/openstack_image_image_metadata.md new file mode 100644 index 0000000..35a2863 --- /dev/null +++ b/docs/tables/openstack_image_image_metadata.md @@ -0,0 +1,18 @@ +# Table: openstack_image_image_metadata + +This table shows data for Openstack Image Image Metadata. + +The primary key for this table is **_cq_id**. + +## Relations + +This table depends on [openstack_image_images](openstack_image_images.md). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|key|`utf8`| +|value|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_image_image_properties.md b/docs/tables/openstack_image_image_properties.md new file mode 100644 index 0000000..dc2605a --- /dev/null +++ b/docs/tables/openstack_image_image_properties.md @@ -0,0 +1,18 @@ +# Table: openstack_image_image_properties + +This table shows data for Openstack Image Image Properties. + +The primary key for this table is **_cq_id**. + +## Relations + +This table depends on [openstack_image_images](openstack_image_images.md). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|key|`utf8`| +|value|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_image_image_tags.md b/docs/tables/openstack_image_image_tags.md new file mode 100644 index 0000000..3cb2b23 --- /dev/null +++ b/docs/tables/openstack_image_image_tags.md @@ -0,0 +1,17 @@ +# Table: openstack_image_image_tags + +This table shows data for Openstack Image Image Tags. + +The primary key for this table is **_cq_id**. + +## Relations + +This table depends on [openstack_image_images](openstack_image_images.md). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|value|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_image_images.md b/docs/tables/openstack_image_images.md new file mode 100644 index 0000000..ce230ee --- /dev/null +++ b/docs/tables/openstack_image_images.md @@ -0,0 +1,40 @@ +# Table: openstack_image_images + +This table shows data for Openstack Image Images. + +The primary key for this table is **_cq_id**. + +## Relations + +The following tables depend on openstack_image_images: + - [openstack_image_image_members](openstack_image_image_members.md) + - [openstack_image_image_metadata](openstack_image_image_metadata.md) + - [openstack_image_image_properties](openstack_image_image_properties.md) + - [openstack_image_image_tags](openstack_image_image_tags.md) + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|id|`utf8`| +|name|`utf8`| +|status|`utf8`| +|tags|`list`| +|container_format|`utf8`| +|disk_format|`utf8`| +|min_disk|`int64`| +|min_ram|`int64`| +|owner|`utf8`| +|protected|`bool`| +|visibility|`utf8`| +|os_hidden|`bool`| +|checksum|`utf8`| +|metadata|`json`| +|properties|`json`| +|created_at|`timestamp[us, tz=UTC]`| +|updated_at|`timestamp[us, tz=UTC]`| +|file|`utf8`| +|schema|`utf8`| +|virtual_size|`int64`| \ No newline at end of file diff --git a/docs/tables/openstack_image_metadata.md b/docs/tables/openstack_image_metadata.md deleted file mode 100644 index 56cb5c7..0000000 --- a/docs/tables/openstack_image_metadata.md +++ /dev/null @@ -1,20 +0,0 @@ -# Table: openstack_image_metadata - -This table shows data for Openstack Image Metadata. - -The primary key for this table is **_cq_id**. - -## Relations - -This table depends on [openstack_images](openstack_images.md). - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id (PK)|UUID| -|_cq_parent_id|UUID| -|key|String| -|value|String| \ No newline at end of file diff --git a/docs/tables/openstack_image_properties.md b/docs/tables/openstack_image_properties.md deleted file mode 100644 index ba97149..0000000 --- a/docs/tables/openstack_image_properties.md +++ /dev/null @@ -1,20 +0,0 @@ -# Table: openstack_image_properties - -This table shows data for Openstack Image Properties. - -The primary key for this table is **_cq_id**. - -## Relations - -This table depends on [openstack_images](openstack_images.md). - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id (PK)|UUID| -|_cq_parent_id|UUID| -|key|String| -|value|String| \ No newline at end of file diff --git a/docs/tables/openstack_image_tags.md b/docs/tables/openstack_image_tags.md deleted file mode 100644 index bafb38f..0000000 --- a/docs/tables/openstack_image_tags.md +++ /dev/null @@ -1,19 +0,0 @@ -# Table: openstack_image_tags - -This table shows data for Openstack Image Tags. - -The primary key for this table is **_cq_id**. - -## Relations - -This table depends on [openstack_images](openstack_images.md). - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id (PK)|UUID| -|_cq_parent_id|UUID| -|value|String| \ No newline at end of file diff --git a/docs/tables/openstack_images.md b/docs/tables/openstack_images.md deleted file mode 100644 index 7c171c7..0000000 --- a/docs/tables/openstack_images.md +++ /dev/null @@ -1,41 +0,0 @@ -# Table: openstack_images - -This table shows data for Openstack Images. - -The primary key for this table is **_cq_id**. - -## Relations - -The following tables depend on openstack_images: - - [openstack_image_metadata](openstack_image_metadata.md) - - [openstack_image_properties](openstack_image_properties.md) - - [openstack_image_tags](openstack_image_tags.md) - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id (PK)|UUID| -|_cq_parent_id|UUID| -|id|String| -|name|String| -|status|String| -|tags|StringArray| -|container_format|String| -|disk_format|String| -|min_disk|Int| -|min_ram|Int| -|owner|String| -|protected|Bool| -|visibility|String| -|os_hidden|Bool| -|checksum|String| -|metadata|JSON| -|properties|JSON| -|created_at|Timestamp| -|updated_at|Timestamp| -|file|String| -|schema|String| -|virtual_size|Int| \ No newline at end of file diff --git a/docs/tables/openstack_instance_addresses.md b/docs/tables/openstack_instance_addresses.md deleted file mode 100644 index 6699819..0000000 --- a/docs/tables/openstack_instance_addresses.md +++ /dev/null @@ -1,23 +0,0 @@ -# Table: openstack_instance_addresses - -This table shows data for Openstack Instance Addresses. - -The primary key for this table is **_cq_id**. - -## Relations - -This table depends on [openstack_instances](openstack_instances.md). - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id (PK)|UUID| -|_cq_parent_id|UUID| -|network|String| -|mac_address|String| -|type|String| -|ip_address|String| -|ip_version|Int| \ No newline at end of file diff --git a/docs/tables/openstack_instance_attached_volumes.md b/docs/tables/openstack_instance_attached_volumes.md deleted file mode 100644 index 88bb175..0000000 --- a/docs/tables/openstack_instance_attached_volumes.md +++ /dev/null @@ -1,19 +0,0 @@ -# Table: openstack_instance_attached_volumes - -This table shows data for Openstack Instance Attached Volumes. - -The primary key for this table is **_cq_id**. - -## Relations - -This table depends on [openstack_instances](openstack_instances.md). - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id (PK)|UUID| -|_cq_parent_id|UUID| -|id|String| \ No newline at end of file diff --git a/docs/tables/openstack_instance_flavor_extra_specs.md b/docs/tables/openstack_instance_flavor_extra_specs.md deleted file mode 100644 index aaab44e..0000000 --- a/docs/tables/openstack_instance_flavor_extra_specs.md +++ /dev/null @@ -1,20 +0,0 @@ -# Table: openstack_instance_flavor_extra_specs - -This table shows data for Openstack Instance Flavor Extra Specs. - -The primary key for this table is **_cq_id**. - -## Relations - -This table depends on [openstack_instances](openstack_instances.md). - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id (PK)|UUID| -|_cq_parent_id|UUID| -|key|String| -|value|String| \ No newline at end of file diff --git a/docs/tables/openstack_instance_flavors.md b/docs/tables/openstack_instance_flavors.md deleted file mode 100644 index 0e3c484..0000000 --- a/docs/tables/openstack_instance_flavors.md +++ /dev/null @@ -1,29 +0,0 @@ -# Table: openstack_instance_flavors - -This table shows data for Openstack Instance Flavors. - -The primary key for this table is **_cq_id**. - -## Relations - -This table depends on [openstack_instances](openstack_instances.md). - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id (PK)|UUID| -|_cq_parent_id|UUID| -|name|String| -|vcpus|Int| -|vgpus|Int| -|cores|Int| -|sockets|Int| -|ram|Int| -|disk|Int| -|swap|Int| -|ephemeral|Int| -|rng_allowed|Bool| -|watchdog_action|String| \ No newline at end of file diff --git a/docs/tables/openstack_instance_metadata.md b/docs/tables/openstack_instance_metadata.md deleted file mode 100644 index c84e8c8..0000000 --- a/docs/tables/openstack_instance_metadata.md +++ /dev/null @@ -1,20 +0,0 @@ -# Table: openstack_instance_metadata - -This table shows data for Openstack Instance Metadata. - -The primary key for this table is **_cq_id**. - -## Relations - -This table depends on [openstack_instances](openstack_instances.md). - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id (PK)|UUID| -|_cq_parent_id|UUID| -|key|String| -|value|String| \ No newline at end of file diff --git a/docs/tables/openstack_instance_security_groups.md b/docs/tables/openstack_instance_security_groups.md deleted file mode 100644 index f164833..0000000 --- a/docs/tables/openstack_instance_security_groups.md +++ /dev/null @@ -1,19 +0,0 @@ -# Table: openstack_instance_security_groups - -This table shows data for Openstack Instance Security Groups. - -The primary key for this table is **_cq_id**. - -## Relations - -This table depends on [openstack_instances](openstack_instances.md). - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id (PK)|UUID| -|_cq_parent_id|UUID| -|name|String| \ No newline at end of file diff --git a/docs/tables/openstack_instance_tags.md b/docs/tables/openstack_instance_tags.md deleted file mode 100644 index c2a4d52..0000000 --- a/docs/tables/openstack_instance_tags.md +++ /dev/null @@ -1,19 +0,0 @@ -# Table: openstack_instance_tags - -This table shows data for Openstack Instance Tags. - -The primary key for this table is **_cq_id**. - -## Relations - -This table depends on [openstack_instances](openstack_instances.md). - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id (PK)|UUID| -|_cq_parent_id|UUID| -|value|String| \ No newline at end of file diff --git a/docs/tables/openstack_instances.md b/docs/tables/openstack_instances.md deleted file mode 100644 index 099f565..0000000 --- a/docs/tables/openstack_instances.md +++ /dev/null @@ -1,65 +0,0 @@ -# Table: openstack_instances - -This table shows data for Openstack Instances. - -The primary key for this table is **_cq_id**. - -## Relations - -The following tables depend on openstack_instances: - - [openstack_instance_addresses](openstack_instance_addresses.md) - - [openstack_instance_attached_volumes](openstack_instance_attached_volumes.md) - - [openstack_instance_flavor_extra_specs](openstack_instance_flavor_extra_specs.md) - - [openstack_instance_flavors](openstack_instance_flavors.md) - - [openstack_instance_metadata](openstack_instance_metadata.md) - - [openstack_instance_security_groups](openstack_instance_security_groups.md) - - [openstack_instance_tags](openstack_instance_tags.md) - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id (PK)|UUID| -|_cq_parent_id|UUID| -|image_id|String| -|power_state_name|String| -|id|String| -|tenant_id|String| -|user_id|String| -|name|String| -|created_at|Timestamp| -|launched_at|Timestamp| -|updated_at|Timestamp| -|terminated_at|Timestamp| -|hostid|String| -|status|String| -|progress|Int| -|access_ipv4|String| -|access_ipv6|String| -|flavor|JSON| -|addresses|JSON| -|metadata|JSON| -|key_name|String| -|admin_pass|String| -|security_groups|JSON| -|attached_volumes|JSON| -|tags|StringArray| -|server_groups|StringArray| -|disk_config|String| -|availability_zone|String| -|host|String| -|hostname|String| -|hypervisor_hostname|String| -|instance_name|String| -|kernel_id|String| -|launch_index|Int| -|ramdisk_id|String| -|reservation_id|String| -|root_device_name|String| -|user_data|String| -|power_state_id|Int| -|vm_state|String| -|config_drive|String| -|description|String| \ No newline at end of file diff --git a/docs/tables/openstack_network_subnets.md b/docs/tables/openstack_network_subnets.md deleted file mode 100644 index ce22abe..0000000 --- a/docs/tables/openstack_network_subnets.md +++ /dev/null @@ -1,19 +0,0 @@ -# Table: openstack_network_subnets - -This table shows data for Openstack Network Subnets. - -The primary key for this table is **_cq_id**. - -## Relations - -This table depends on [openstack_networks](openstack_networks.md). - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id (PK)|UUID| -|_cq_parent_id|UUID| -|name|String| \ No newline at end of file diff --git a/docs/tables/openstack_network_tags.md b/docs/tables/openstack_network_tags.md deleted file mode 100644 index 0a21708..0000000 --- a/docs/tables/openstack_network_tags.md +++ /dev/null @@ -1,19 +0,0 @@ -# Table: openstack_network_tags - -This table shows data for Openstack Network Tags. - -The primary key for this table is **_cq_id**. - -## Relations - -This table depends on [openstack_networks](openstack_networks.md). - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id (PK)|UUID| -|_cq_parent_id|UUID| -|value|String| \ No newline at end of file diff --git a/docs/tables/openstack_networking_network_subnets.md b/docs/tables/openstack_networking_network_subnets.md new file mode 100644 index 0000000..91dafd8 --- /dev/null +++ b/docs/tables/openstack_networking_network_subnets.md @@ -0,0 +1,17 @@ +# Table: openstack_networking_network_subnets + +This table shows data for Openstack Networking Network Subnets. + +The primary key for this table is **_cq_id**. + +## Relations + +This table depends on [openstack_networking_networks](openstack_networking_networks.md). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|name|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_networking_network_tags.md b/docs/tables/openstack_networking_network_tags.md new file mode 100644 index 0000000..372b322 --- /dev/null +++ b/docs/tables/openstack_networking_network_tags.md @@ -0,0 +1,17 @@ +# Table: openstack_networking_network_tags + +This table shows data for Openstack Networking Network Tags. + +The primary key for this table is **_cq_id**. + +## Relations + +This table depends on [openstack_networking_networks](openstack_networking_networks.md). + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id (PK)|`uuid`| +|_cq_parent_id|`uuid`| +|value|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_networking_networks.md b/docs/tables/openstack_networking_networks.md new file mode 100644 index 0000000..4785bf5 --- /dev/null +++ b/docs/tables/openstack_networking_networks.md @@ -0,0 +1,30 @@ +# Table: openstack_networking_networks + +This table shows data for Openstack Networking Networks. + +The primary key for this table is **id**. + +## Relations + +The following tables depend on openstack_networking_networks: + - [openstack_networking_network_subnets](openstack_networking_network_subnets.md) + - [openstack_networking_network_tags](openstack_networking_network_tags.md) + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id|`uuid`| +|_cq_parent_id|`uuid`| +|id (PK)|`utf8`| +|name|`utf8`| +|description|`utf8`| +|admin_state_up|`bool`| +|status|`utf8`| +|subnets|`list`| +|tenant_id|`utf8`| +|project_id|`utf8`| +|shared|`bool`| +|availability_zone_hints|`list`| +|tags|`list`| +|revision_number|`int64`| \ No newline at end of file diff --git a/docs/tables/openstack_networking_ports.md b/docs/tables/openstack_networking_ports.md new file mode 100644 index 0000000..5a04b34 --- /dev/null +++ b/docs/tables/openstack_networking_ports.md @@ -0,0 +1,34 @@ +# Table: openstack_networking_ports + +This table shows data for Openstack Networking Ports. + +The primary key for this table is **id**. + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id|`uuid`| +|_cq_parent_id|`uuid`| +|ip_addresses|`list`| +|ip_address|`utf8`| +|id (PK)|`utf8`| +|network_id|`utf8`| +|name|`utf8`| +|description|`utf8`| +|admin_state_up|`bool`| +|status|`utf8`| +|mac_address|`utf8`| +|fixed_ips|`json`| +|tenant_id|`utf8`| +|project_id|`utf8`| +|device_owner|`utf8`| +|security_groups|`list`| +|device_id|`utf8`| +|allowed_address_pairs|`json`| +|tags|`list`| +|propagate_uplink_status|`bool`| +|value_specs|`json`| +|revision_number|`int64`| +|created_at|`timestamp[us, tz=UTC]`| +|updated_at|`timestamp[us, tz=UTC]`| \ No newline at end of file diff --git a/docs/tables/openstack_networking_security_group_rules.md b/docs/tables/openstack_networking_security_group_rules.md new file mode 100644 index 0000000..afde89e --- /dev/null +++ b/docs/tables/openstack_networking_security_group_rules.md @@ -0,0 +1,24 @@ +# Table: openstack_networking_security_group_rules + +This table shows data for Openstack Networking Security Group Rules. + +The primary key for this table is **id**. + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id|`uuid`| +|_cq_parent_id|`uuid`| +|id (PK)|`utf8`| +|direction|`utf8`| +|description|`utf8`| +|ethertype|`utf8`| +|security_group_id|`utf8`| +|port_range_min|`int64`| +|port_range_max|`int64`| +|protocol|`utf8`| +|remote_group_id|`utf8`| +|remote_ip_prefix|`utf8`| +|tenant_id|`utf8`| +|project_id|`utf8`| \ No newline at end of file diff --git a/docs/tables/openstack_networking_security_groups.md b/docs/tables/openstack_networking_security_groups.md new file mode 100644 index 0000000..51169b7 --- /dev/null +++ b/docs/tables/openstack_networking_security_groups.md @@ -0,0 +1,20 @@ +# Table: openstack_networking_security_groups + +This table shows data for Openstack Networking Security Groups. + +The primary key for this table is **id**. + +## Columns + +| Name | Type | +| ------------- | ------------- | +|_cq_id|`uuid`| +|_cq_parent_id|`uuid`| +|security_group_rule_ids|`list`| +|id (PK)|`utf8`| +|name|`utf8`| +|description|`utf8`| +|security_group_rules|`json`| +|tenant_id|`utf8`| +|project_id|`utf8`| +|tags|`list`| \ No newline at end of file diff --git a/docs/tables/openstack_networks.md b/docs/tables/openstack_networks.md deleted file mode 100644 index 55c7008..0000000 --- a/docs/tables/openstack_networks.md +++ /dev/null @@ -1,32 +0,0 @@ -# Table: openstack_networks - -This table shows data for Openstack Networks. - -The primary key for this table is **id**. - -## Relations - -The following tables depend on openstack_networks: - - [openstack_network_subnets](openstack_network_subnets.md) - - [openstack_network_tags](openstack_network_tags.md) - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id|UUID| -|_cq_parent_id|UUID| -|id (PK)|String| -|name|String| -|description|String| -|admin_state_up|Bool| -|status|String| -|subnets|StringArray| -|tenant_id|String| -|project_id|String| -|shared|Bool| -|availability_zone_hints|StringArray| -|tags|StringArray| -|revision_number|Int| \ No newline at end of file diff --git a/docs/tables/openstack_ports.md b/docs/tables/openstack_ports.md deleted file mode 100644 index 78c90b9..0000000 --- a/docs/tables/openstack_ports.md +++ /dev/null @@ -1,36 +0,0 @@ -# Table: openstack_ports - -This table shows data for Openstack Ports. - -The primary key for this table is **id**. - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id|UUID| -|_cq_parent_id|UUID| -|ip_addresses|StringArray| -|ip_address|String| -|id (PK)|String| -|network_id|String| -|name|String| -|description|String| -|admin_state_up|Bool| -|status|String| -|mac_address|String| -|fixed_ips|JSON| -|tenant_id|String| -|project_id|String| -|device_owner|String| -|security_groups|StringArray| -|device_id|String| -|allowed_address_pairs|JSON| -|tags|StringArray| -|propagate_uplink_status|Bool| -|value_specs|JSON| -|revision_number|Int| -|created_at|Timestamp| -|updated_at|Timestamp| \ No newline at end of file diff --git a/docs/tables/openstack_projects.md b/docs/tables/openstack_projects.md deleted file mode 100644 index b244cc2..0000000 --- a/docs/tables/openstack_projects.md +++ /dev/null @@ -1,23 +0,0 @@ -# Table: openstack_projects - -This table shows data for Openstack Projects. - -The primary key for this table is **id**. - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id|UUID| -|_cq_parent_id|UUID| -|is_domain|Bool| -|description|String| -|domain_id|String| -|enabled|Bool| -|id (PK)|String| -|name|String| -|parent_id|String| -|tags|StringArray| -|options|JSON| \ No newline at end of file diff --git a/docs/tables/openstack_security_group_rules.md b/docs/tables/openstack_security_group_rules.md deleted file mode 100644 index 1bbf1a6..0000000 --- a/docs/tables/openstack_security_group_rules.md +++ /dev/null @@ -1,26 +0,0 @@ -# Table: openstack_security_group_rules - -This table shows data for Openstack Security Group Rules. - -The primary key for this table is **id**. - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id|UUID| -|_cq_parent_id|UUID| -|id (PK)|String| -|direction|String| -|description|String| -|ethertype|String| -|security_group_id|String| -|port_range_min|Int| -|port_range_max|Int| -|protocol|String| -|remote_group_id|String| -|remote_ip_prefix|String| -|tenant_id|String| -|project_id|String| \ No newline at end of file diff --git a/docs/tables/openstack_security_groups.md b/docs/tables/openstack_security_groups.md deleted file mode 100644 index 7eb0281..0000000 --- a/docs/tables/openstack_security_groups.md +++ /dev/null @@ -1,22 +0,0 @@ -# Table: openstack_security_groups - -This table shows data for Openstack Security Groups. - -The primary key for this table is **id**. - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id|UUID| -|_cq_parent_id|UUID| -|security_group_rule_ids|StringArray| -|id (PK)|String| -|name|String| -|description|String| -|security_group_rules|JSON| -|tenant_id|String| -|project_id|String| -|tags|StringArray| \ No newline at end of file diff --git a/docs/tables/openstack_users.md b/docs/tables/openstack_users.md deleted file mode 100644 index ef26587..0000000 --- a/docs/tables/openstack_users.md +++ /dev/null @@ -1,21 +0,0 @@ -# Table: openstack_users - -This table shows data for Openstack Users. - -The primary key for this table is **id**. - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id|UUID| -|_cq_parent_id|UUID| -|default_project_id|String| -|description|String| -|domain_id|String| -|enabled|Bool| -|id (PK)|String| -|name|String| -|options|JSON| \ No newline at end of file diff --git a/docs/tables/openstack_volumes.md b/docs/tables/openstack_volumes.md deleted file mode 100644 index 26a1048..0000000 --- a/docs/tables/openstack_volumes.md +++ /dev/null @@ -1,43 +0,0 @@ -# Table: openstack_volumes - -This table shows data for Openstack Volumes. - -The primary key for this table is **id**. - -## Columns - -| Name | Type | -| ------------- | ------------- | -|_cq_source_name|String| -|_cq_sync_time|Timestamp| -|_cq_id|UUID| -|_cq_parent_id|UUID| -|id (PK)|String| -|status|String| -|size|Int| -|availability_zone|String| -|created_at|JSON| -|updated_at|JSON| -|attachments|JSON| -|name|String| -|description|String| -|volume_type|String| -|snapshot_id|String| -|source_volid|String| -|backup_id|String| -|group_id|String| -|metadata|JSON| -|user_id|String| -|bootable|String| -|encrypted|Bool| -|replication_status|String| -|consistencygroup_id|String| -|multiattach|Bool| -|volume_image_metadata|JSON| -|migration_status|String| -|host|String| -|migration_status_name|String| -|migration_status_tenant|String| -|provider_id|String| -|service_uuid|String| -|shared_targets|Bool| \ No newline at end of file diff --git a/go.mod b/go.mod index a5347dc..b581748 100644 --- a/go.mod +++ b/go.mod @@ -1,68 +1,129 @@ module github.com/dihedron/cq-source-openstack -go 1.21 - -toolchain go1.21.0 +go 1.22.1 require ( - github.com/apache/arrow/go/v13 v13.0.0-20230731205701-112f94971882 - github.com/cloudquery/plugin-sdk/v4 v4.5.0 - github.com/dihedron/cq-plugin-utils v0.0.0-20230816150611-90ab3d855604 - github.com/gophercloud/gophercloud v1.5.0 - github.com/hashicorp/go-multierror v1.1.1 - github.com/rs/zerolog v1.29.1 + github.com/apache/arrow/go/v15 v15.0.1 + github.com/cloudquery/plugin-sdk/v4 v4.32.1 + github.com/dihedron/cq-plugin-utils v0.0.0-20240311143204-56951d66ea65 + github.com/gophercloud/gophercloud v1.11.0 + github.com/rs/zerolog v1.32.0 ) require ( + github.com/BurntSushi/toml v1.3.2 // indirect + github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 // indirect + github.com/CloudyKit/jet/v6 v6.2.0 // indirect + github.com/Joker/jade v1.1.3 // indirect + github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 // indirect + github.com/adrg/xdg v0.4.0 // indirect + github.com/andybalholm/brotli v1.1.0 // indirect + github.com/apache/arrow/go/v13 v13.0.0 // indirect + github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect + github.com/aymerick/douceur v0.2.0 // indirect + github.com/bahlo/generic-list-go v0.2.0 // indirect + github.com/buger/jsonparser v1.1.1 // indirect + github.com/bytedance/sonic v1.11.2 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect - github.com/cloudquery/plugin-pb-go v1.9.2 // indirect + github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect + github.com/chenzhuoyu/iasm v0.9.1 // indirect + github.com/cloudquery/cloudquery-api-go v1.7.5 // indirect + github.com/cloudquery/plugin-pb-go v1.19.2 // indirect github.com/cloudquery/plugin-sdk/v2 v2.7.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/getsentry/sentry-go v0.20.0 // indirect + github.com/deepmap/oapi-codegen v1.16.2 // indirect + github.com/fatih/structs v1.1.0 // indirect + github.com/flosch/pongo2/v4 v4.0.2 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/getsentry/sentry-go v0.27.0 // indirect github.com/ghodss/yaml v1.0.0 // indirect - github.com/go-logr/logr v1.2.4 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/gin-gonic/gin v1.9.1 // indirect + github.com/go-logr/logr v1.4.1 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.19.0 // indirect + github.com/gobwas/glob v0.2.3 // indirect github.com/goccy/go-json v0.10.2 // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/google/flatbuffers v23.5.26+incompatible // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/grpc-ecosystem/go-grpc-middleware/providers/zerolog/v2 v2.0.0-rc.3 // indirect - github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0-rc.3 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect - github.com/hashicorp/errwrap v1.0.0 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47 // indirect + github.com/google/flatbuffers v24.3.7+incompatible // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/css v1.0.1 // indirect + github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.1 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/klauspost/compress v1.16.7 // indirect - github.com/klauspost/cpuid/v2 v2.2.5 // indirect + github.com/invopop/jsonschema v0.12.0 // indirect + github.com/iris-contrib/schema v0.0.6 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/kataras/blocks v0.0.8 // indirect + github.com/kataras/golog v0.1.11 // indirect + github.com/kataras/iris/v12 v12.2.10 // indirect + github.com/kataras/pio v0.0.13 // indirect + github.com/kataras/sitemap v0.0.6 // indirect + github.com/kataras/tunnel v0.0.4 // indirect + github.com/klauspost/compress v1.17.7 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/labstack/echo/v4 v4.11.4 // indirect + github.com/labstack/gommon v0.4.2 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/mailgun/raymond/v2 v2.0.48 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect - github.com/pierrec/lz4/v4 v4.1.18 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/microcosm-cc/bluemonday v1.0.26 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pelletier/go-toml/v2 v2.1.1 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/spf13/cobra v1.7.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect + github.com/schollz/closestmatch v2.1.0+incompatible // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/spf13/cobra v1.8.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/stretchr/testify v1.8.4 // indirect + github.com/stretchr/testify v1.9.0 // indirect + github.com/tdewolff/minify/v2 v2.20.18 // indirect + github.com/tdewolff/parse/v2 v2.7.12 // indirect github.com/thoas/go-funk v0.9.3 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasttemplate v1.2.2 // indirect + github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect + github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect + github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect + github.com/yosssi/ace v0.0.5 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect - go.opentelemetry.io/otel v1.16.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 // indirect - go.opentelemetry.io/otel/metric v1.16.0 // indirect - go.opentelemetry.io/otel/sdk v1.16.0 // indirect - go.opentelemetry.io/otel/trace v1.16.0 // indirect - go.opentelemetry.io/proto/otlp v0.19.0 // indirect - golang.org/x/exp v0.0.0-20230728194245-b0cb94b80691 // indirect - golang.org/x/mod v0.11.0 // indirect - golang.org/x/net v0.10.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.8.0 // indirect - golang.org/x/text v0.9.0 // indirect - golang.org/x/tools v0.6.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/genproto v0.0.0-20230731193218-e0aa005b6bdf // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230731193218-e0aa005b6bdf // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230731193218-e0aa005b6bdf // indirect - google.golang.org/grpc v1.57.0 // indirect - google.golang.org/protobuf v1.31.0 // indirect + go.opentelemetry.io/otel v1.24.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 // indirect + go.opentelemetry.io/otel/metric v1.24.0 // indirect + go.opentelemetry.io/otel/sdk v1.24.0 // indirect + go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/proto/otlp v1.1.0 // indirect + golang.org/x/arch v0.7.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect + golang.org/x/mod v0.16.0 // indirect + golang.org/x/net v0.22.0 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/time v0.5.0 // indirect + golang.org/x/tools v0.19.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240311132316-a219d84964c2 // indirect + google.golang.org/grpc v1.62.1 // indirect + google.golang.org/protobuf v1.33.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 465edeb..96f8e29 100644 --- a/go.sum +++ b/go.sum @@ -1,570 +1,380 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow/go/v13 v13.0.0-20230731205701-112f94971882 h1:mFDZW1FQk9yndPvxScp7RpcOpdSHaqcgBWO7sDlx4S8= -github.com/apache/arrow/go/v13 v13.0.0-20230731205701-112f94971882/go.mod h1:W69eByFNO0ZR30q1/7Sr9d83zcVZmF2MiP3fFYAWJOc= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= +github.com/CloudyKit/jet/v6 v6.2.0 h1:EpcZ6SR9n28BUGtNJSvlBqf90IpjeFr36Tizxhn/oME= +github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= +github.com/Joker/hpp v1.0.0 h1:65+iuJYdRXv/XyN62C1uEmmOx3432rNG/rKlX6V7Kkc= +github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Joker/jade v1.1.3 h1:Qbeh12Vq6BxURXT1qZBRHsDxeURB8ztcL6f3EXSGeHk= +github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= +github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= +github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 h1:KkH3I3sJuOLP3TjA/dfr4NAY8bghDwnXiU7cTKxQqo0= +github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= +github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= +github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= +github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= +github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/apache/arrow/go/v13 v13.0.0 h1:kELrvDQuKZo8csdWYqBQfyi431x6Zs/YJTEgUuSVcWk= +github.com/apache/arrow/go/v13 v13.0.0/go.mod h1:W69eByFNO0ZR30q1/7Sr9d83zcVZmF2MiP3fFYAWJOc= +github.com/apache/arrow/go/v15 v15.0.1 h1:mq61hYtKBel8wCYrOM4yY4YzJ05IA2qZUrevXe5IbZQ= +github.com/apache/arrow/go/v15 v15.0.1/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA= +github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= +github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= +github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= +github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= +github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= +github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/bradleyjkemp/cupaloy/v2 v2.8.0 h1:any4BmKE+jGIaMpnU8YgH/I2LPiLBufr6oMMlVBbn9M= github.com/bradleyjkemp/cupaloy/v2 v2.8.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= +github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= +github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= +github.com/bytedance/sonic v1.11.2 h1:ywfwo0a/3j9HR8wsYGWsIWl2mvRsI950HyoxiBERw5A= +github.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudquery/plugin-pb-go v1.9.2 h1:jApELKSgtyj1dKQlD2hKPMTFs1GqOdSK8u+5rEluj4M= -github.com/cloudquery/plugin-pb-go v1.9.2/go.mod h1:f00zd6V5mWD+8Qw9U0eb4HD8RnAobwV9byBexE7Qa+0= +github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= +github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= +github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= +github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= +github.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0= +github.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= +github.com/cloudquery/cloudquery-api-go v1.7.5 h1:rd5OQx7qRQASEzU9c8Wopzau7GMVCGj2PylRxSqHd0s= +github.com/cloudquery/cloudquery-api-go v1.7.5/go.mod h1:03fojQg0UpdgqXZ9tzZ5gF5CPad/F0sok66bsX6u4RA= +github.com/cloudquery/plugin-pb-go v1.19.2 h1:HExE7KUpz/ocJI0AWrewbf0k0VphaR2Qgbcc6nmKLso= +github.com/cloudquery/plugin-pb-go v1.19.2/go.mod h1:QfbIZ2/bsC+t44SzCumpK5G+uE5q57s8ZnQT1GtGKI4= github.com/cloudquery/plugin-sdk/v2 v2.7.0 h1:hRXsdEiaOxJtsn/wZMFQC9/jPfU1MeMK3KF+gPGqm7U= github.com/cloudquery/plugin-sdk/v2 v2.7.0/go.mod h1:pAX6ojIW99b/Vg4CkhnsGkRIzNaVEceYMR+Bdit73ug= -github.com/cloudquery/plugin-sdk/v4 v4.5.0 h1:NbUXQJumFQbc6jh0I6eN2CfoF2m4KsQaxjI0mZIAff4= -github.com/cloudquery/plugin-sdk/v4 v4.5.0/go.mod h1:lU/F5smij4Ud3sm2mqK//c/7loeYWywJdgq8lQrgOfY= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/cloudquery/plugin-sdk/v4 v4.32.1 h1:fTqzXNy79AZTl0Ng7+bX4I0G2DD0BzkdRTnoROBsgRw= +github.com/cloudquery/plugin-sdk/v4 v4.32.1/go.mod h1:BjBVpyjz50HuR8jeJi+roMoFGk3T/C01aci6QxVMM08= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dihedron/cq-plugin-utils v0.0.0-20230816150611-90ab3d855604 h1:uI33nSxIua04J+iZsuXMfwD0kCRxOM/ybcjIgN0AQy8= -github.com/dihedron/cq-plugin-utils v0.0.0-20230816150611-90ab3d855604/go.mod h1:unPTJvMVrO4Oaxtz4LTagptxJyWiD7+b35q13ho0J0I= +github.com/deepmap/oapi-codegen v1.16.2 h1:xGHx0dNqYfy9gE8a7AVgVM8Sd5oF9SEgePzP+UPAUXI= +github.com/deepmap/oapi-codegen v1.16.2/go.mod h1:rdYoEA2GE+riuZ91DvpmBX9hJbQpuY9wchXpfQ3n+ho= +github.com/dihedron/cq-plugin-utils v0.0.0-20240311143204-56951d66ea65 h1:v5IHQ6XM9cSmEfECXelnUnhBXAJY1PLmaz2RBxgCoYI= +github.com/dihedron/cq-plugin-utils v0.0.0-20240311143204-56951d66ea65/go.mod h1:VdAEnk6sp6sKeruzNpxgw+qQHK0smmMUjNp00AAmloc= github.com/dihedron/go-funk v0.0.0-20230503154649-f530b38601cc h1:rmlc13ZpRMQh2aKeT4pxBvUjhmLRJywgAR05OCcLCtk= github.com/dihedron/go-funk v0.0.0-20230503154649-f530b38601cc/go.mod h1:+IWnUfUmFO1+WVYQWQtIJHeRRdaIyyYglZN7xzUPe4Q= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/getsentry/sentry-go v0.20.0 h1:bwXW98iMRIWxn+4FgPW7vMrjmbym6HblXALmhjHmQaQ= -github.com/getsentry/sentry-go v0.20.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= +github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= +github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.19.0 h1:ol+5Fu+cSq9JD7SoSqe04GMI92cbn0+wvQ3bZ8b/AU4= +github.com/go-playground/validator/v10 v10.19.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg= -github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gophercloud/gophercloud v1.5.0 h1:cDN6XFCLKiiqvYpjQLq9AiM7RDRbIC9450WpPH+yvXo= -github.com/gophercloud/gophercloud v1.5.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= -github.com/grpc-ecosystem/go-grpc-middleware/providers/zerolog/v2 v2.0.0-rc.3 h1:hRcWZ7716+E1tkMSZJ/QeeC2dPGGB1R/4z4m9RsL8Qg= -github.com/grpc-ecosystem/go-grpc-middleware/providers/zerolog/v2 v2.0.0-rc.3/go.mod h1:54asssGY3Bohr5FRbew+bjfuQTT2WS9V7hW7gPqmcKM= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0-rc.2.0.20201002093600-73cf2ae9d891/go.mod h1:GhphxcdlaRyAuBSvo6rV71BvQcvB/vuX8ugCyybuS2k= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0-rc.3 h1:o95KDiV/b1xdkumY5YbLR0/n2+wBxUpgf3HgfKgTyLI= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0-rc.3/go.mod h1:hTxjzRcX49ogbTGVJ1sM5mz5s+SSgiGIyL3jjPxl32E= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47 h1:k4Tw0nt6lwro3Uin8eqoET7MDA4JnT8YgbCjc/g5E3k= +github.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= +github.com/google/flatbuffers v24.3.7+incompatible h1:BxGUkIQnOciBu33bd5BdvqY8Qvo0O/GR4SPhh7x9Ed0= +github.com/google/flatbuffers v24.3.7+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gophercloud/gophercloud v1.11.0 h1:ls0O747DIq1D8SUHc7r2vI8BFbMLeLFuENaAIfEx7OM= +github.com/gophercloud/gophercloud v1.11.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= +github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= +github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.1 h1:HcUWd006luQPljE73d5sk+/VgYPGUReEVz2y1/qylwY= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.1/go.mod h1:w9Y7gY31krpLmrVU5ZPG9H7l9fZuRu5/3R3S3FMtVQ4= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= +github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= +github.com/iris-contrib/httpexpect/v2 v2.15.2 h1:T9THsdP1woyAqKHwjkEsbCnMefsAFvk8iJJKokcJ3Go= +github.com/iris-contrib/httpexpect/v2 v2.15.2/go.mod h1:JLDgIqnFy5loDSUv1OA2j0mb6p/rDhiCqigP22Uq9xE= +github.com/iris-contrib/schema v0.0.6 h1:CPSBLyx2e91H2yJzPuhGuifVRnZBBJ3pCOMbOvPZaTw= +github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= +github.com/kataras/blocks v0.0.8 h1:MrpVhoFTCR2v1iOOfGng5VJSILKeZZI+7NGfxEh3SUM= +github.com/kataras/blocks v0.0.8/go.mod h1:9Jm5zx6BB+06NwA+OhTbHW1xkMOYxahnqTN5DveZ2Yg= +github.com/kataras/golog v0.1.11 h1:dGkcCVsIpqiAMWTlebn/ZULHxFvfG4K43LF1cNWSh20= +github.com/kataras/golog v0.1.11/go.mod h1:mAkt1vbPowFUuUGvexyQ5NFW6djEgGyxQBIARJ0AH4A= +github.com/kataras/iris/v12 v12.2.10 h1:rEJVM7qMoyhv8wpgkA1yGxibFcONE0jkJ70LFLibTAA= +github.com/kataras/iris/v12 v12.2.10/go.mod h1:z4+E+kLMqZ7U4WtDsYfFnG7BjMTXLkdzMAXLVMLnMNs= +github.com/kataras/pio v0.0.13 h1:x0rXVX0fviDTXOOLOmr4MUxOabu1InVSTu5itF8CXCM= +github.com/kataras/pio v0.0.13/go.mod h1:k3HNuSw+eJ8Pm2lA4lRhg3DiCjVgHlP8hmXApSej3oM= +github.com/kataras/sitemap v0.0.6 h1:w71CRMMKYMJh6LR2wTgnk5hSgjVNB9KL60n5e2KHvLY= +github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= +github.com/kataras/tunnel v0.0.4 h1:sCAqWuJV7nPzGrlb0os3j49lk2JhILT0rID38NHNLpA= +github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= +github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= +github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/labstack/echo/v4 v4.11.4 h1:vDZmA+qNeh1pd/cCkEicDMrjtrnMGQ1QFI9gWN1zGq8= +github.com/labstack/echo/v4 v4.11.4/go.mod h1:noh7EvLwqDsmh/X/HWKPUl1AjzJrhyptRyEbQJfxen8= +github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= +github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqACtjw= +github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= -github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/microcosm-cc/bluemonday v1.0.26 h1:xbqSvqzQMeEHCqMi64VAs4d8uy6Mequs3rQ0k/Khz58= +github.com/microcosm-cc/bluemonday v1.0.26/go.mod h1:JyzOCs9gkyQyjs+6h10UEVSe02CGwkhd72Xdqh78TWs= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI= +github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.19.0/go.mod h1:IzD0RJ65iWH0w97OQQebJEvTZYvsCUm9WVLWBQrJRjo= -github.com/rs/zerolog v1.29.1 h1:cO+d60CHkknCbvzEWxP0S9K6KqyTjrCNUy1LdQLCGPc= -github.com/rs/zerolog v1.29.1/go.mod h1:Le6ESbR7hc+DP6Lt1THiV8CQSdkkNrd3R0XbEgp3ZBU= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= +github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQo= +github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= +github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk= +github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= +github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tdewolff/minify/v2 v2.20.18 h1:y+s6OzlZwFqApgNXWNtaMuEMEPbHT72zrCyb9Az35Xo= +github.com/tdewolff/minify/v2 v2.20.18/go.mod h1:ulkFoeAVWMLEyjuDz1ZIWOA31g5aWOawCFRp9R/MudM= +github.com/tdewolff/parse/v2 v2.7.12 h1:tgavkHc2ZDEQVKy1oWxwIyh5bP4F5fEh/JmBwPP/3LQ= +github.com/tdewolff/parse/v2 v2.7.12/go.mod h1:3FbJWZp3XT9OWVN3Hmfp0p/a08v4h8J9W1aghka0soA= +github.com/tdewolff/test v1.0.11-0.20231101010635-f1265d231d52/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= +github.com/tdewolff/test v1.0.11-0.20240106005702-7de5f7df4739 h1:IkjBCtQOOjIn03u/dMQK9g+Iw9ewps4mCl1nB8Sscbo= +github.com/tdewolff/test v1.0.11-0.20240106005702-7de5f7df4739/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= +github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= +github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= +github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= +github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= +github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0/go.mod h1:vLarbg68dH2Wa77g71zmKQqlQ8+8Rq3GRG31uc0WcWI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 h1:cbsD4cUcviQGXdw8+bo5x2wazq10SKz8hEbtCRPcU78= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0/go.mod h1:JgXSGah17croqhJfhByOLVY719k1emAXC8MVhCIJlRs= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 h1:iqjq9LAB8aK++sKVcELezzn655JnBNdsDhghU4G/So8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0/go.mod h1:hGXzO5bhhSHZnKvrDaXB82Y9DRFour0Nz/KrBh7reWw= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= -go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= -go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= -go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 h1:t6wl9SPayj+c7lEIFgm4ooDBZVb01IhLB4InpomhRw8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0/go.mod h1:iSDOcsnSA5INXzZtwaBPrKp/lWu/V14Dd+llD0oI2EA= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 h1:Xw8U6u2f8DK2XAkGRFV7BBLENgnTGX9i4rQRxJf+/vs= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0/go.mod h1:6KW1Fm6R/s6Z3PGXwSJN2K4eT6wQB3vXX6CVnYX9NmM= +go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= +go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= +go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI= +go.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc= +golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230728194245-b0cb94b80691 h1:/yRP+0AN7mf5DkD3BAI6TOFnd51gEoDEb8o35jIFtgw= -golang.org/x/exp v0.0.0-20230728194245-b0cb94b80691/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= +golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.12.0 h1:xKuo6hzt+gMav00meVPUlXwSdoEJP46BR+wdxQEFK2o= gonum.org/v1/gonum v0.12.0/go.mod h1:73TDxJfAAHeA8Mk9mf8NlIppyhQNo5GLTcYeqgo2lvY= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20230731193218-e0aa005b6bdf h1:v5Cf4E9+6tawYrs/grq1q1hFpGtzlGFzgWHqwt6NFiU= -google.golang.org/genproto v0.0.0-20230731193218-e0aa005b6bdf/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= -google.golang.org/genproto/googleapis/api v0.0.0-20230731193218-e0aa005b6bdf h1:xkVZ5FdZJF4U82Q/JS+DcZA83s/GRVL+QrFMlexk9Yo= -google.golang.org/genproto/googleapis/api v0.0.0-20230731193218-e0aa005b6bdf/go.mod h1:5DZzOUPCLYL3mNkQ0ms0F3EuUNZ7py1Bqeq6sxzI7/Q= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230731193218-e0aa005b6bdf h1:guOdSPaeFgN+jEJwTo1dQ71hdBm+yKSCCKuTRkJzcVo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230731193218-e0aa005b6bdf/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= -google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= -google.golang.org/grpc/examples v0.0.0-20210424002626-9572fd6faeae/go.mod h1:Ly7ZA/ARzg8fnPU9TyZIxoz33sEUuWX7txiqs8lPTgE= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2 h1:rIo7ocm2roD9DcFIX67Ym8icoGCKSARAiPljFhh5suQ= +google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2/go.mod h1:O1cOfN1Cy6QEYr7VxtjOyP5AdAuR0aJ/MYZaaof623Y= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240311132316-a219d84964c2 h1:9IZDv+/GcI6u+a4jRFRLxQs0RUCfavGfoOgEW6jpkI0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240311132316-a219d84964c2/go.mod h1:UCOku4NytXMJuLQE5VuqA5lX3PcHCBo8pxNyvkf4xBs= +google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +moul.io/http2curl/v2 v2.3.0 h1:9r3JfDzWPcbIklMOs2TnIFzDYvfAZvjeavG6EzP7jYs= +moul.io/http2curl/v2 v2.3.0/go.mod h1:RW4hyBjTWSYDOxapodpNEtX0g5Eb16sxklBqmd2RHcE= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/plugin/plugin.go b/plugin/plugin.go new file mode 100644 index 0000000..3ebc1af --- /dev/null +++ b/plugin/plugin.go @@ -0,0 +1,7 @@ +package plugin + +var ( + Name = "cq-source-openstack" + Kind = "source" + Version = "0.1.0" +) diff --git a/resources/data_structs.go b/resources/data_structs.go deleted file mode 100644 index 7fa5df3..0000000 --- a/resources/data_structs.go +++ /dev/null @@ -1,10 +0,0 @@ -package resources - -type Single[V any] struct { - Name V `cq-name:"name"` -} - -type Pair[K comparable, V any] struct { - Key K `cq-name:"key"` - Value V `cq-name:"value"` -} diff --git a/resources/plugin/client.go b/resources/plugin/client.go index 327840c..c2ae814 100644 --- a/resources/plugin/client.go +++ b/resources/plugin/client.go @@ -10,8 +10,15 @@ import ( "github.com/cloudquery/plugin-sdk/v4/scheduler" "github.com/cloudquery/plugin-sdk/v4/schema" "github.com/cloudquery/plugin-sdk/v4/transformers" + "github.com/dihedron/cq-plugin-utils/pattern_matcher" "github.com/dihedron/cq-source-openstack/client" - "github.com/dihedron/cq-source-openstack/resources" + + "github.com/dihedron/cq-source-openstack/resources/services/baremetal" + "github.com/dihedron/cq-source-openstack/resources/services/blockstorage" + "github.com/dihedron/cq-source-openstack/resources/services/compute" + "github.com/dihedron/cq-source-openstack/resources/services/identity" + "github.com/dihedron/cq-source-openstack/resources/services/image" + "github.com/dihedron/cq-source-openstack/resources/services/networking" "github.com/rs/zerolog" ) @@ -26,26 +33,32 @@ type Client struct { } func Configure(ctx context.Context, logger zerolog.Logger, spec []byte, opts plugin.NewClientOptions) (plugin.Client, error) { + config := &client.Spec{} + // this prevents go doc to fail when spec is empty + if len(spec) != 0 { + if err := json.Unmarshal(spec, config); err != nil { + return nil, fmt.Errorf("failed to unmarshal spec: %w", err) + } + } + + tables := getTables(config) + if opts.NoConnection { return &Client{ logger: logger, - tables: getTables(), + tables: tables, }, nil } - config := &client.Spec{} - if err := json.Unmarshal(spec, config); err != nil { - return nil, fmt.Errorf("failed to unmarshal spec: %w", err) - } - syncClient, err := client.New(ctx, logger, config) if err != nil { return nil, fmt.Errorf("failed to create client: %w", err) } + return &Client{ logger: logger, config: *config, - tables: getTables(), + tables: tables, syncClient: syncClient, scheduler: scheduler.NewScheduler(scheduler.WithLogger(logger)), }, nil @@ -74,23 +87,57 @@ func (*Client) Close(_ context.Context) error { return nil } -func getTables() schema.Tables { - tables := schema.Tables{ - resources.Aggregates(), - resources.Attachments(), - resources.Flavors(), - resources.Hypervisors(), - resources.Instances(), - resources.Images(), - //resources.KeyPairs(), - resources.Networks(), - resources.Ports(), - resources.Projects(), - resources.SecurityGroups(), - resources.SecurityGroupRules(), - resources.Users(), - resources.Volumes(), +func getTables(spec *client.Spec) schema.Tables { + available_tables := schema.Tables{ + baremetal.Allocations(), + baremetal.Drivers(), + baremetal.Nodes(), + baremetal.Ports(), + blockstorage.Attachments(), + blockstorage.AvailabilityZones(), + blockstorage.Limits(), + blockstorage.QoS(), + blockstorage.QuotaSets(), + blockstorage.QuotaSetsUsage(), + blockstorage.Services(), + blockstorage.Snapshots(), + blockstorage.Volumes(), + compute.Aggregates(), + compute.Flavors(), + compute.Hypervisors(), + compute.Instances(), + compute.ServerUsage(), + identity.Domains(), + identity.Projects(), + identity.Regions(), + identity.RegisteredLimits(), + identity.Roles(), + identity.Users(), + identity.Services(), + image.Images(), + networking.Networks(), + networking.Ports(), + networking.SecurityGroups(), + networking.SecurityGroupRules(), } + + // must compile these patterns to be included + includesFromSpec := spec.IncludedTables + // must compile these patterns to be excluded + excludesFromSpec := spec.ExcludedTables + + pm := pattern_matcher.New( + pattern_matcher.WithReplaceIncludes(includesFromSpec), + pattern_matcher.WithReplaceExcludes(excludesFromSpec), + ) + + tables := schema.Tables{} + for _, t := range available_tables { + if pm.Match(t.Name) { + tables = append(tables, t) + } + } + if err := transformers.TransformTables(tables); err != nil { panic(err) } diff --git a/resources/plugin/plugin.go b/resources/plugin/plugin.go index 86e05fb..54459f0 100644 --- a/resources/plugin/plugin.go +++ b/resources/plugin/plugin.go @@ -2,12 +2,14 @@ package plugin import ( "github.com/cloudquery/plugin-sdk/v4/plugin" -) - -var ( - Version = "development" + internalPlugin "github.com/dihedron/cq-source-openstack/plugin" ) func Plugin() *plugin.Plugin { - return plugin.NewPlugin("dihedron-openstack", Version, Configure) + return plugin.NewPlugin( + internalPlugin.Name, + internalPlugin.Version, + Configure, + plugin.WithKind(internalPlugin.Kind), + ) } diff --git a/resources/services/baremetal/allocations.go b/resources/services/baremetal/allocations.go new file mode 100644 index 0000000..3ef5597 --- /dev/null +++ b/resources/services/baremetal/allocations.go @@ -0,0 +1,54 @@ +package baremetal + +import ( + "context" + + "github.com/cloudquery/plugin-sdk/v4/schema" + "github.com/cloudquery/plugin-sdk/v4/transformers" + "github.com/dihedron/cq-plugin-utils/format" + "github.com/dihedron/cq-source-openstack/client" + "github.com/gophercloud/gophercloud/openstack/baremetal/v1/allocations" +) + +func Allocations() *schema.Table { + return &schema.Table{ + Name: "openstack_baremetal_allocations", + Resolver: fetchAllocation, + Transform: transformers.TransformWithStruct( + &allocations.Allocation{}, + transformers.WithSkipFields("Links"), + ), + } +} + +func fetchAllocation(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + api := meta.(*client.Client) + + baremetal, err := api.GetServiceClient(client.BareMetalV1) + if err != nil { + api.Logger().Error().Err(err).Msg("error retrieving client") + return err + } + opts := allocations.ListOpts{} + + allPages, err := allocations.List(baremetal, opts).AllPages() + if err != nil { + api.Logger().Error().Err(err).Str("opts", format.ToPrettyJSON(opts)).Msg("error listing allocations with options") + return err + } + + allAllocations, err := allocations.ExtractAllocations(allPages) + if err != nil { + api.Logger().Err(err).Msg("error extracting allocations") + return err + } + for _, allocation := range allAllocations { + if ctx.Err() != nil { + api.Logger().Debug().Msg("context done, exit") + break + } + api.Logger().Debug().Str("name", allocation.Name).Msg("streaming allocation") + res <- allocation + } + return nil +} diff --git a/resources/services/baremetal/drivers.go b/resources/services/baremetal/drivers.go new file mode 100644 index 0000000..963f0fa --- /dev/null +++ b/resources/services/baremetal/drivers.go @@ -0,0 +1,55 @@ +package baremetal + +import ( + "context" + + "github.com/cloudquery/plugin-sdk/v4/schema" + "github.com/cloudquery/plugin-sdk/v4/transformers" + "github.com/dihedron/cq-plugin-utils/format" + "github.com/dihedron/cq-source-openstack/client" + "github.com/gophercloud/gophercloud/openstack/baremetal/v1/drivers" +) + +func Drivers() *schema.Table { + return &schema.Table{ + Name: "openstack_baremetal_drivers", + Resolver: fetchDriver, + Transform: transformers.TransformWithStruct( + &drivers.Driver{}, + transformers.WithSkipFields("Links"), + transformers.WithSkipFields("Properties"), + ), + } +} + +func fetchDriver(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + api := meta.(*client.Client) + + baremetal, err := api.GetServiceClient(client.BareMetalV1) + if err != nil { + api.Logger().Error().Err(err).Msg("error retrieving client") + return err + } + opts := drivers.ListDriversOpts{} + + allPages, err := drivers.ListDrivers(baremetal, opts).AllPages() + if err != nil { + api.Logger().Error().Err(err).Str("opts", format.ToPrettyJSON(opts)).Msg("error listing drivers with options") + return err + } + + allDrivers, err := drivers.ExtractDrivers(allPages) + if err != nil { + api.Logger().Err(err).Msg("error extracting drivers") + return err + } + for _, driver := range allDrivers { + if ctx.Err() != nil { + api.Logger().Debug().Msg("context done, exit") + break + } + api.Logger().Debug().Str("name", driver.Name).Msg("streaming driver") + res <- driver + } + return nil +} diff --git a/resources/services/baremetal/nodes.go b/resources/services/baremetal/nodes.go new file mode 100644 index 0000000..341f07e --- /dev/null +++ b/resources/services/baremetal/nodes.go @@ -0,0 +1,57 @@ +package baremetal + +import ( + "context" + + "github.com/cloudquery/plugin-sdk/v4/schema" + "github.com/cloudquery/plugin-sdk/v4/transformers" + "github.com/dihedron/cq-plugin-utils/format" + "github.com/dihedron/cq-source-openstack/client" + "github.com/gophercloud/gophercloud/openstack/baremetal/v1/nodes" +) + +func Nodes() *schema.Table { + return &schema.Table{ + Name: "openstack_baremetal_nodes", + Resolver: fetchNode, + Transform: transformers.TransformWithStruct( + &nodes.Node{}, + transformers.WithSkipFields("Properties"), + ), + } +} + +func fetchNode(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + api := meta.(*client.Client) + + baremetal, err := api.GetServiceClient(client.BareMetalV1) + if err != nil { + api.Logger().Error().Err(err).Msg("error retrieving client") + return err + } + opts := nodes.ListOpts{ + ProvisionState: nodes.Deploying, + Fields: []string{"name"}, + } + + allPages, err := nodes.List(baremetal, opts).AllPages() + if err != nil { + api.Logger().Error().Err(err).Str("opts", format.ToPrettyJSON(opts)).Msg("error listing nodes with options") + return err + } + + allNodes, err := nodes.ExtractNodes(allPages) + if err != nil { + api.Logger().Err(err).Msg("error extracting nodes") + return err + } + for _, node := range allNodes { + if ctx.Err() != nil { + api.Logger().Debug().Msg("context done, exit") + break + } + api.Logger().Debug().Str("name", node.Name).Msg("streaming node") + res <- node + } + return nil +} diff --git a/resources/services/baremetal/ports.go b/resources/services/baremetal/ports.go new file mode 100644 index 0000000..b437320 --- /dev/null +++ b/resources/services/baremetal/ports.go @@ -0,0 +1,86 @@ +package baremetal + +import ( + "context" + + "github.com/cloudquery/plugin-sdk/v4/schema" + "github.com/cloudquery/plugin-sdk/v4/transformers" + "github.com/dihedron/cq-plugin-utils/format" + "github.com/dihedron/cq-plugin-utils/transform" + "github.com/dihedron/cq-plugin-utils/utils" + "github.com/dihedron/cq-source-openstack/client" + "github.com/gophercloud/gophercloud/openstack/baremetal/v1/ports" +) + +func Ports() *schema.Table { + return &schema.Table{ + Name: "openstack_baremetal_ports", + Resolver: fetchPort, + Transform: transformers.TransformWithStruct( + &Port{}, + transformers.WithNameTransformer(transform.TagNameTransformer), // use cq-name tags to translate name + transformers.WithTypeTransformer(transform.TagTypeTransformer), // use cq-type tags to translate type + transformers.WithSkipFields("Links"), + ), + } +} + +func fetchPort(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + api := meta.(*client.Client) + + baremetal, err := api.GetServiceClient(client.BareMetalV1) + if err != nil { + api.Logger().Error().Err(err).Msg("error retrieving client") + return err + } + opts := ports.ListOpts{} + + allPages, err := ports.List(baremetal, opts).AllPages() + if err != nil { + api.Logger().Error().Err(err).Str("opts", format.ToPrettyJSON(opts)).Msg("error listing ports with options") + return err + } + + allPorts, err := ports.ExtractPorts(allPages) + if err != nil { + api.Logger().Err(err).Msg("error extracting ports") + return err + } + for _, port := range allPorts { + if ctx.Err() != nil { + api.Logger().Debug().Msg("context done, exit") + break + } + api.Logger().Debug().Str("name", port.UUID).Msg("streaming port") + res <- port + } + return nil +} + +type Port struct { + ID string `json:"id"` + UUID string `json:"uuid"` + TenantID string `json:"tenant_id"` + ProjectID string `json:"project_id"` + DeviceID string `json:"device_id"` + NetworkID string `json:"network_id"` + IpAddresses *[]string `json:"ip_addresses"` + IpAddress string `json:"ip_address"` + Name string `json:"name"` + Description string `json:"description"` + AdminStateUp bool `json:"admin_state_up"` + Status string `json:"status"` + Address string `json:"mac_address"` + FixedIPs *[]string `json:"fixed_ips"` + DeviceOwner string `json:"device_owner"` + SecurityGroups []struct { + Name string `json:"name"` + } `json:"security_groups"` + AllowedAddressPairs *[]string `json:"allowed_address_pairs"` + Tags *[]string `json:"tags"` + PropagateUplinkStatus bool `json:"propagate_uplink_status"` + ValueSpecs string `json:"value_specs"` + RevisionNumber int `json:"revision_number"` + CreatedAt *utils.Time `json:"created" cq-name:"created_at" cq-type:"timestamp"` + UpdatedAt *utils.Time `json:"updated" cq-name:"updated_at" cq-type:"timestamp"` +} diff --git a/resources/attachment_hosts.go b/resources/services/blockstorage/attachment_hosts.go similarity index 94% rename from resources/attachment_hosts.go rename to resources/services/blockstorage/attachment_hosts.go index 75d8d03..504eb27 100644 --- a/resources/attachment_hosts.go +++ b/resources/services/blockstorage/attachment_hosts.go @@ -1,4 +1,4 @@ -package resources +package blockstorage import ( "context" @@ -11,7 +11,7 @@ import ( func AttachmentHosts() *schema.Table { return &schema.Table{ - Name: "openstack_attachment_hosts", + Name: "openstack_blockstorage_attachment_hosts", Resolver: fetchAttachmentHosts, Transform: transformers.TransformWithStruct( &Host{}, diff --git a/resources/attachments.go b/resources/services/blockstorage/attachments.go similarity index 89% rename from resources/attachments.go rename to resources/services/blockstorage/attachments.go index 66cc574..599fec4 100644 --- a/resources/attachments.go +++ b/resources/services/blockstorage/attachments.go @@ -1,9 +1,11 @@ -package resources +package blockstorage import ( "context" - "github.com/apache/arrow/go/v13/arrow" + "github.com/dihedron/cq-plugin-utils/utils" + + "github.com/apache/arrow/go/v15/arrow" "github.com/cloudquery/plugin-sdk/v4/schema" "github.com/cloudquery/plugin-sdk/v4/transformers" "github.com/dihedron/cq-plugin-utils/format" @@ -15,7 +17,7 @@ import ( func Attachments() *schema.Table { return &schema.Table{ - Name: "openstack_attachments", + Name: "openstack_blockstorage_attachments", Resolver: fetchAttachments, Transform: transformers.TransformWithStruct( &Attachment{}, @@ -193,13 +195,13 @@ func fetchAttachments(ctx context.Context, meta schema.ClientMeta, parent *schem api := meta.(*client.Client) // get list of all projects - keystone, err := api.GetServiceClient(client.IdentityV3) + identity, err := api.GetServiceClient(client.IdentityV3) if err != nil { - api.Logger().Error().Err(err).Msg("error retrieving keystone client") + api.Logger().Error().Err(err).Msg("error retrieving identity client") return err } - allPages, err := projects.List(keystone, &projects.ListOpts{}).AllPages() + allPages, err := projects.List(identity, &projects.ListOpts{}).AllPages() if err != nil { api.Logger().Error().Err(err).Msg("error listing projects") return err @@ -217,13 +219,12 @@ func fetchAttachments(ctx context.Context, meta schema.ClientMeta, parent *schem api.Logger().Debug().Msg("context done, exit") break } - project := project projectIDs = append(projectIDs, project.ID) } - cinder, err := api.GetServiceClient(client.BlockStorageV3) + blockstorage, err := api.GetServiceClient(client.BlockStorageV3) if err != nil { - api.Logger().Error().Err(err).Msg("error retrieving cinder client") + api.Logger().Error().Err(err).Msg("error retrieving blockstorage client") return err } @@ -234,7 +235,7 @@ func fetchAttachments(ctx context.Context, meta schema.ClientMeta, parent *schem for _, projectID := range projectIDs { opts.ProjectID = projectID - allPages, err := attachments.List(cinder, opts).AllPages() + allPages, err := attachments.List(blockstorage, opts).AllPages() if err != nil { api.Logger().Error().Err(err).Str("options", format.ToPrettyJSON(opts)).Msg("error listing attachments with options") return err @@ -263,15 +264,15 @@ func fetchAttachments(ctx context.Context, meta schema.ClientMeta, parent *schem } type Attachment struct { - ID string `json:"id"` - AttachedAt Time `json:"attached_at"` - DetachedAt Time `json:"detached_at"` - AttachmentID string `json:"attachment_id"` - VolumeID string `json:"volume_id"` - Instance string `json:"instance" cq-name:"instance_id"` - Status string `json:"status"` - AttachMode string `json:"attach_mode"` - ProjectID string `json:"-" cq-name:"project_id"` + ID string `json:"id"` + AttachedAt utils.Time `json:"attached_at"` + DetachedAt utils.Time `json:"detached_at"` + AttachmentID string `json:"attachment_id"` + VolumeID string `json:"volume_id"` + Instance string `json:"instance" cq-name:"instance_id"` + Status string `json:"status"` + AttachMode string `json:"attach_mode"` + ProjectID string `json:"-" cq-name:"project_id"` ConnectionInfo struct { AccessMode string `json:"access_mode"` AttachmentID string `json:"attachment_id"` diff --git a/resources/services/blockstorage/availabilityzones.go b/resources/services/blockstorage/availabilityzones.go new file mode 100644 index 0000000..06d7af4 --- /dev/null +++ b/resources/services/blockstorage/availabilityzones.go @@ -0,0 +1,48 @@ +package blockstorage + +import ( + "context" + + "github.com/cloudquery/plugin-sdk/v4/schema" + "github.com/cloudquery/plugin-sdk/v4/transformers" + "github.com/dihedron/cq-source-openstack/client" + "github.com/gophercloud/gophercloud/openstack/blockstorage/extensions/availabilityzones" +) + +func AvailabilityZones() *schema.Table { + return &schema.Table{ + Name: "openstack_blockstorage_availabilityzones", + Resolver: fetchAvailabilityZones, + Transform: transformers.TransformWithStruct( + &availabilityzones.AvailabilityZone{}, + ), + } +} + +func fetchAvailabilityZones(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + api := meta.(*client.Client) + + blockstorage, err := api.GetServiceClient(client.BlockStorageV3) + if err != nil { + api.Logger().Error().Err(err).Msg("error retrieving client") + return err + } + + allPages, err := availabilityzones.List(blockstorage).AllPages() + if err != nil { + api.Logger().Err(err).Msg("error listing availabilityzones") + return err + } + + allAvailabilityZones, err := availabilityzones.ExtractAvailabilityZones(allPages) + if err != nil { + api.Logger().Error().Err(err).Msg("error getting availabilityzones") + return err + } + + for _, zoneInfo := range allAvailabilityZones { + res <- zoneInfo + } + + return nil +} diff --git a/resources/services/blockstorage/limits.go b/resources/services/blockstorage/limits.go new file mode 100644 index 0000000..64a7b6d --- /dev/null +++ b/resources/services/blockstorage/limits.go @@ -0,0 +1,145 @@ +package blockstorage + +import ( + "context" + + "github.com/apache/arrow/go/v15/arrow" + "github.com/cloudquery/plugin-sdk/v4/schema" + "github.com/cloudquery/plugin-sdk/v4/transformers" + "github.com/dihedron/cq-source-openstack/client" + "github.com/gophercloud/gophercloud/openstack/blockstorage/extensions/limits" +) + +func Limits() *schema.Table { + return &schema.Table{ + Name: "openstack_blockstorage_limits", + Resolver: fetchLimits, + Transform: transformers.TransformWithStruct( + &limits.Limit{}, + transformers.WithSkipFields("Absolute", "Rate"), + ), + Columns: []schema.Column{ + { + Name: "max_total_volumes", + Type: arrow.PrimitiveTypes.Int64, + Description: "The maximum number of volumes that can be created.", + Resolver: schema.PathResolver("Absolute.MaxTotalVolumes"), + }, + { + Name: "max_total_snapshots", + Type: arrow.PrimitiveTypes.Int64, + Description: "The maximum number of snapshots that can be created.", + Resolver: schema.PathResolver("Absolute.MaxTotalSnapshots"), + }, + { + Name: "max_total_volume_gigabytes", + Type: arrow.PrimitiveTypes.Int64, + Description: "The maximum number of gigabytes that can be used for volumes.", + Resolver: schema.PathResolver("Absolute.MaxTotalVolumeGigabytes"), + }, + { + Name: "max_total_backups", + Type: arrow.PrimitiveTypes.Int64, + Description: "The maximum number of backups that can be created.", + Resolver: schema.PathResolver("Absolute.MaxTotalBackups"), + }, + { + Name: "max_total_backup_gigabytes", + Type: arrow.PrimitiveTypes.Int64, + Description: "The maximum number of gigabytes that can be used for backups.", + Resolver: schema.PathResolver("Absolute.MaxTotalBackupGigabytes"), + }, + { + Name: "total_volumes_used", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of volumes that have been created.", + Resolver: schema.PathResolver("Absolute.TotalVolumesUsed"), + }, + { + Name: "total_gigabytes_used", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of gigabytes that have been used for volumes.", + Resolver: schema.PathResolver("Absolute.TotalGigabytesUsed"), + }, + { + Name: "total_snapshots_used", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of snapshots that have been created.", + Resolver: schema.PathResolver("Absolute.TotalSnapshotsUsed"), + }, + { + Name: "total_backups_used", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of backups that have been created.", + Resolver: schema.PathResolver("Absolute.TotalBackupsUsed"), + }, + { + Name: "total_backup_gigabytes_used", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of gigabytes that have been used for backups.", + Resolver: schema.PathResolver("Absolute.TotalBackupGigabytesUsed"), + }, + { + Name: "regex", + Type: arrow.ListOf(arrow.BinaryTypes.String), + Description: "The regular expression used to match the URI.", + Resolver: schema.PathResolver("Rate.Regex"), + }, + { + Name: "uri", + Type: arrow.ListOf(arrow.BinaryTypes.String), + Description: "The URI that the regular expression matches.", + Resolver: schema.PathResolver("Rate.URI"), + }, + { + Name: "verb", + Type: arrow.ListOf(arrow.BinaryTypes.String), + Description: "The HTTP verb used to match the URI.", + Resolver: schema.PathResolver("Rate.Limit.Verb"), + }, + { + Name: "next_available", + Type: arrow.ListOf(arrow.BinaryTypes.String), + Description: "The next available time for the rate limit.", + Resolver: schema.PathResolver("Rate.Limit.NextAvailable"), + }, + { + Name: "unit", + Type: arrow.ListOf(arrow.BinaryTypes.String), + Description: "The unit of the rate limit.", + Resolver: schema.PathResolver("Rate.Limit.Unit"), + }, + { + Name: "value", + Type: arrow.ListOf(arrow.PrimitiveTypes.Int64), + Description: "The value of the rate limit.", + Resolver: schema.PathResolver("Rate.Limit.Value"), + }, + { + Name: "remaining", + Type: arrow.ListOf(arrow.PrimitiveTypes.Int64), + Description: "The number of requests remaining in the current rate limit window.", + Resolver: schema.PathResolver("Rate.Limit.Remaining"), + }, + }, + } +} + +func fetchLimits(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + api := meta.(*client.Client) + + blockstorage, err := api.GetServiceClient(client.BlockStorageV3) + if err != nil { + api.Logger().Error().Err(err).Msg("error retrieving client") + return err + } + + allLimits, err := limits.Get(blockstorage).Extract() + if err != nil { + api.Logger().Error().Err(err).Msg("error getting limits") + return err + } + + res <- allLimits + return nil +} diff --git a/resources/services/blockstorage/qos.go b/resources/services/blockstorage/qos.go new file mode 100644 index 0000000..71ed13d --- /dev/null +++ b/resources/services/blockstorage/qos.go @@ -0,0 +1,54 @@ +package blockstorage + +import ( + "context" + + "github.com/cloudquery/plugin-sdk/v4/schema" + "github.com/cloudquery/plugin-sdk/v4/transformers" + "github.com/dihedron/cq-plugin-utils/format" + "github.com/dihedron/cq-source-openstack/client" + "github.com/gophercloud/gophercloud/openstack/blockstorage/v3/qos" +) + +func QoS() *schema.Table { + return &schema.Table{ + Name: "openstack_blockstorage_qos", + Resolver: fetchQoS, + Transform: transformers.TransformWithStruct( + &qos.QoS{}, + transformers.WithPrimaryKeys("ID"), + ), + } +} + +func fetchQoS(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + api := meta.(*client.Client) + + blockstorage, err := api.GetServiceClient(client.BlockStorageV3) + if err != nil { + api.Logger().Error().Err(err).Msg("error retrieving client") + return err + } + + opts := qos.ListOpts{} + + allPages, err := qos.List(blockstorage, opts).AllPages() + if err != nil { + api.Logger().Error().Err(err).Str("options", format.ToPrettyJSON(opts)).Msg("error listing qos with options") + return err + } + allQoS, err := qos.ExtractQoS(allPages) + if err != nil { + api.Logger().Err(err).Msg("error extracting QoS") + return err + } + for _, qos := range allQoS { + if ctx.Err() != nil { + api.Logger().Debug().Msg("context done, exit") + break + } + api.Logger().Debug().Str("data", qos.ID).Msg("streaming qos") + res <- qos + } + return nil +} diff --git a/resources/services/blockstorage/quotasets.go b/resources/services/blockstorage/quotasets.go new file mode 100644 index 0000000..a28a8a4 --- /dev/null +++ b/resources/services/blockstorage/quotasets.go @@ -0,0 +1,72 @@ +package blockstorage + +import ( + "context" + + "github.com/cloudquery/plugin-sdk/v4/schema" + "github.com/cloudquery/plugin-sdk/v4/transformers" + "github.com/dihedron/cq-source-openstack/client" + "github.com/gophercloud/gophercloud/openstack/blockstorage/extensions/quotasets" + "github.com/gophercloud/gophercloud/openstack/identity/v3/projects" +) + +func QuotaSets() *schema.Table { + return &schema.Table{ + Name: "openstack_blockstorage_quotasets", + Resolver: fetchQuotaSets, + Transform: transformers.TransformWithStruct( + "asets.QuotaSet{}, + // transformers.WithSkipFields("Extra"), + ), + } +} + +func fetchQuotaSets(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + + api := meta.(*client.Client) + + // get list of all projects + identity, err := api.GetServiceClient(client.IdentityV3) + if err != nil { + api.Logger().Error().Err(err).Msg("error retrieving identity client") + return err + } + + allPages, err := projects.List(identity, &projects.ListOpts{}).AllPages() + if err != nil { + api.Logger().Error().Err(err).Msg("error listing projects") + return err + } + allProjects, err := projects.ExtractProjects(allPages) + if err != nil { + api.Logger().Error().Err(err).Msg("error extracting projects") + return err + } + api.Logger().Debug().Int("count", len(allProjects)).Msg("projects retrieved") + + projectIDs := []string{} + for _, project := range allProjects { + if ctx.Err() != nil { + api.Logger().Debug().Msg("context done, exit") + break + } + projectIDs = append(projectIDs, project.ID) + } + + blockstorage, err := api.GetServiceClient(client.BlockStorageV3) + if err != nil { + api.Logger().Error().Err(err).Msg("error retrieving blockstorage client") + return err + } + + // for each project, get the associated QuotaSets + for _, projectID := range projectIDs { + quotaset, err := quotasets.Get(blockstorage, projectID).Extract() + if err != nil { + api.Logger().Error().Err(err).Msg("error extracting quota sets for project " + projectID) + return err + } + res <- quotaset + } + return nil +} diff --git a/resources/services/blockstorage/quotasets_usage.go b/resources/services/blockstorage/quotasets_usage.go new file mode 100644 index 0000000..601df58 --- /dev/null +++ b/resources/services/blockstorage/quotasets_usage.go @@ -0,0 +1,245 @@ +package blockstorage + +import ( + "context" + + "github.com/apache/arrow/go/v15/arrow" + "github.com/cloudquery/plugin-sdk/v4/schema" + "github.com/cloudquery/plugin-sdk/v4/transformers" + "github.com/dihedron/cq-plugin-utils/transform" + "github.com/dihedron/cq-source-openstack/client" + "github.com/gophercloud/gophercloud/openstack/blockstorage/extensions/quotasets" + "github.com/gophercloud/gophercloud/openstack/identity/v3/projects" +) + +func QuotaSetsUsage() *schema.Table { + return &schema.Table{ + Name: "openstack_blockstorage_quotasets_usage", + Resolver: fetchQuotaSetsUsage, + Transform: transformers.TransformWithStruct( + "asets.QuotaUsageSet{}, + transformers.WithNameTransformer(transform.TagNameTransformer), // use cq-name tags to translate name + transformers.WithSkipFields("Volumes", "Snapshots", "Gigabytes", "PerVolumeGigabytes", "Backups", "BackupGigabytes", "Groups"), + ), + Columns: []schema.Column{ + { + Name: "volumes_in_use", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of volumes currently in use.", + Resolver: schema.PathResolver("Volumes.InUse"), + }, + { + Name: "volumes_allocated", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of volumes currently allocated.", + Resolver: schema.PathResolver("Volumes.Allocated"), + }, + { + Name: "volumes_reserved", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of volumes currently reserved.", + Resolver: schema.PathResolver("Volumes.Reserved"), + }, + { + Name: "volumes_limit", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of volumes currently allowed.", + Resolver: schema.PathResolver("Volumes.Limit"), + }, + { + Name: "snapshots_in_use", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of snapshots currently in use.", + Resolver: schema.PathResolver("Snapshots.InUse"), + }, + { + Name: "snapshots_allocated", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of snapshots currently allocated.", + Resolver: schema.PathResolver("Snapshots.Allocated"), + }, + { + Name: "snapshots_reserved", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of snapshots currently reserved.", + Resolver: schema.PathResolver("Snapshots.Reserved"), + }, + { + Name: "snapshots_limit", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of snapshots currently allowed.", + Resolver: schema.PathResolver("Snapshots.Limit"), + }, + { + Name: "gigabytes_in_use", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of gigabytes currently in use.", + Resolver: schema.PathResolver("Gigabytes.InUse"), + }, + { + Name: "gigabytes_allocated", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of gigabytes currently allocated.", + Resolver: schema.PathResolver("Gigabytes.Allocated"), + }, + { + Name: "gigabytes_reserved", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of gigabytes currently reserved.", + Resolver: schema.PathResolver("Gigabytes.Reserved"), + }, + { + Name: "gigabytes_limit", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of gigabytes currently allowed.", + Resolver: schema.PathResolver("Gigabytes.Limit"), + }, + { + Name: "per_volume_gigabytes_in_use", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of gigabytes currently in use per volume.", + Resolver: schema.PathResolver("PerVolumeGigabytes.InUse"), + }, + { + Name: "per_volume_gigabytes_allocated", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of gigabytes currently allocated per volume.", + Resolver: schema.PathResolver("PerVolumeGigabytes.Allocated"), + }, + { + Name: "per_volume_gigabytes_reserved", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of gigabytes currently reserved per volume.", + Resolver: schema.PathResolver("PerVolumeGigabytes.Reserved"), + }, + { + Name: "per_volume_gigabytes_limit", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of gigabytes currently allowed per volume.", + Resolver: schema.PathResolver("PerVolumeGigabytes.Limit"), + }, + { + Name: "backups_in_use", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of backups currently in use.", + Resolver: schema.PathResolver("Backups.InUse"), + }, + { + Name: "backups_allocated", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of backups currently allocated.", + Resolver: schema.PathResolver("Backups.Allocated"), + }, + { + Name: "backups_reserved", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of backups currently reserved.", + Resolver: schema.PathResolver("Backups.Reserved"), + }, + { + Name: "backups_limit", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of backups currently allowed.", + Resolver: schema.PathResolver("Backups.Limit"), + }, + { + Name: "backup_gigabytes_in_use", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of backup gigabytes currently in use.", + Resolver: schema.PathResolver("BackupGigabytes.InUse"), + }, + { + Name: "backup_gigabytes_allocated", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of backup gigabytes currently allocated.", + Resolver: schema.PathResolver("BackupGigabytes.Allocated"), + }, + { + Name: "backup_gigabytes_reserved", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of backup gigabytes currently reserved.", + Resolver: schema.PathResolver("BackupGigabytes.Reserved"), + }, + { + Name: "backup_gigabytes_limit", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of backup gigabytes currently allowed.", + Resolver: schema.PathResolver("BackupGigabytes.Limit"), + }, + { + Name: "groups_in_use", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of groups currently in use.", + Resolver: schema.PathResolver("Groups.InUse"), + }, + { + Name: "groups_allocated", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of groups currently allocated.", + Resolver: schema.PathResolver("Groups.Allocated"), + }, + { + Name: "groups_reserved", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of groups currently reserved.", + Resolver: schema.PathResolver("Groups.Reserved"), + }, + { + Name: "groups_limit", + Type: arrow.PrimitiveTypes.Int64, + Description: "The number of groups currently allowed.", + Resolver: schema.PathResolver("Groups.Limit"), + }, + }, + } +} + +func fetchQuotaSetsUsage(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + + api := meta.(*client.Client) + + // get list of all projects + identity, err := api.GetServiceClient(client.IdentityV3) + if err != nil { + api.Logger().Error().Err(err).Msg("error retrieving identity client") + return err + } + + allPages, err := projects.List(identity, &projects.ListOpts{}).AllPages() + if err != nil { + api.Logger().Error().Err(err).Msg("error listing projects") + return err + } + allProjects, err := projects.ExtractProjects(allPages) + if err != nil { + api.Logger().Error().Err(err).Msg("error extracting projects") + return err + } + api.Logger().Debug().Int("count", len(allProjects)).Msg("projects retrieved") + + projectIDs := []string{} + for _, project := range allProjects { + if ctx.Err() != nil { + api.Logger().Debug().Msg("context done, exit") + break + } + projectIDs = append(projectIDs, project.ID) + } + + blockstorage, err := api.GetServiceClient(client.BlockStorageV3) + if err != nil { + api.Logger().Error().Err(err).Msg("error retrieving blockstorage client") + return err + } + + // for each project, get the associated QuotaUsageSet + for _, projectID := range projectIDs { + quotausageset, err := quotasets.GetUsage(blockstorage, projectID).Extract() + if err != nil { + api.Logger().Error().Err(err).Msg("error extracting quota sets for project " + projectID) + return err + } + res <- quotausageset + } + return nil +} diff --git a/resources/services/blockstorage/services.go b/resources/services/blockstorage/services.go new file mode 100644 index 0000000..adfc357 --- /dev/null +++ b/resources/services/blockstorage/services.go @@ -0,0 +1,55 @@ +package blockstorage + +import ( + "context" + + "github.com/cloudquery/plugin-sdk/v4/schema" + "github.com/cloudquery/plugin-sdk/v4/transformers" + "github.com/dihedron/cq-source-openstack/client" + "github.com/gophercloud/gophercloud/openstack/blockstorage/extensions/services" +) + +func Services() *schema.Table { + return &schema.Table{ + Name: "openstack_blockstorage_services", + Resolver: fetchServices, + Transform: transformers.TransformWithStruct( + &services.Service{}, + ), + } +} + +func fetchServices(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + + api := meta.(*client.Client) + + blockstorage, err := api.GetServiceClient(client.BlockStorageV3) + if err != nil { + api.Logger().Error().Err(err).Msg("error retrieving blockstorage client") + return err + } + + opts := services.ListOpts{} + + allPages, err := services.List(blockstorage, opts).AllPages() + if err != nil { + api.Logger().Error().Err(err).Msg("error listing services") + return err + } + allServices, err := services.ExtractServices(allPages) + if err != nil { + api.Logger().Error().Err(err).Msg("error extracting services") + return err + } + api.Logger().Debug().Int("count", len(allServices)).Msg("services retrieved") + + for _, service := range allServices { + if ctx.Err() != nil { + api.Logger().Debug().Msg("context done, exit") + break + } + res <- service + } + + return nil +} diff --git a/resources/services/blockstorage/snapshots.go b/resources/services/blockstorage/snapshots.go new file mode 100644 index 0000000..295a547 --- /dev/null +++ b/resources/services/blockstorage/snapshots.go @@ -0,0 +1,56 @@ +package blockstorage + +import ( + "context" + + "github.com/cloudquery/plugin-sdk/v4/schema" + "github.com/cloudquery/plugin-sdk/v4/transformers" + "github.com/dihedron/cq-plugin-utils/format" + "github.com/dihedron/cq-source-openstack/client" + "github.com/gophercloud/gophercloud/openstack/blockstorage/v3/snapshots" +) + +func Snapshots() *schema.Table { + return &schema.Table{ + Name: "openstack_blockstorage_snapshots", + Resolver: fetchSnapshots, + Transform: transformers.TransformWithStruct( + &snapshots.Snapshot{}, + transformers.WithPrimaryKeys("ID"), + ), + } +} + +func fetchSnapshots(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + api := meta.(*client.Client) + + blockstorage, err := api.GetServiceClient(client.BlockStorageV3) + if err != nil { + api.Logger().Error().Err(err).Msg("error retrieving client") + return err + } + + opts := snapshots.ListOpts{ + AllTenants: true, + } + + allPages, err := snapshots.List(blockstorage, opts).AllPages() + if err != nil { + api.Logger().Error().Err(err).Str("options", format.ToPrettyJSON(opts)).Msg("error listing snapshots with options") + return err + } + allSnapshots, err := snapshots.ExtractSnapshots(allPages) + if err != nil { + api.Logger().Err(err).Msg("error extracting snapshots") + return err + } + for _, snapshot := range allSnapshots { + if ctx.Err() != nil { + api.Logger().Debug().Msg("context done, exit") + break + } + api.Logger().Debug().Str("data", snapshot.ID).Msg("streaming snapshot") + res <- snapshot + } + return nil +} diff --git a/resources/volumes.go b/resources/services/blockstorage/volumes.go similarity index 90% rename from resources/volumes.go rename to resources/services/blockstorage/volumes.go index adf0e57..3e0e367 100644 --- a/resources/volumes.go +++ b/resources/services/blockstorage/volumes.go @@ -1,8 +1,10 @@ -package resources +package blockstorage import ( "context" + "github.com/dihedron/cq-plugin-utils/utils" + "github.com/cloudquery/plugin-sdk/v4/schema" "github.com/cloudquery/plugin-sdk/v4/transformers" "github.com/dihedron/cq-plugin-utils/format" @@ -14,7 +16,7 @@ import ( func Volumes() *schema.Table { return &schema.Table{ - Name: "openstack_volumes", + Name: "openstack_blockstorage_volumes", Resolver: fetchVolumes, Transform: transformers.TransformWithStruct( &Volume{}, @@ -24,16 +26,9 @@ func Volumes() *schema.Table { transformers.WithSkipFields("Links"), ), - // Columns: []schema.Column{ - // { - // Name: "tags", - // Type: schema.TypeStringArray, - // Description: "The set of tags on the project.", - // Resolver: transform.Apply( - // transform.OnObjectField("Tags"), - // ), - // }, - // }, + Relations: []*schema.Table{ + VolumesBackups(), + }, } } @@ -41,7 +36,7 @@ func fetchVolumes(ctx context.Context, meta schema.ClientMeta, parent *schema.Re api := meta.(*client.Client) - cinder, err := api.GetServiceClient(client.BlockStorageV3) + blockstorage, err := api.GetServiceClient(client.BlockStorageV3) if err != nil { api.Logger().Error().Err(err).Msg("error retrieving client") return err @@ -51,7 +46,7 @@ func fetchVolumes(ctx context.Context, meta schema.ClientMeta, parent *schema.Re AllTenants: true, } - allPages, err := volumes.List(cinder, opts).AllPages() + allPages, err := volumes.List(blockstorage, opts).AllPages() if err != nil { api.Logger().Error().Err(err).Str("options", format.ToPrettyJSON(opts)).Msg("error listing volumes with options") return err @@ -86,9 +81,9 @@ type Volume struct { // AvailabilityZone is which availability zone the volume is in. AvailabilityZone string `json:"availability_zone"` // The date when this volume was created. - CreatedAt Time `json:"created_at"` + CreatedAt utils.Time `json:"created_at"` // The date when this volume was last updated - UpdatedAt Time `json:"updated_at"` + UpdatedAt utils.Time `json:"updated_at"` // Instances onto which the volume is attached. Attachments []volumes.Attachment `json:"attachments"` // Human-readable display name for the volume. diff --git a/resources/services/blockstorage/volumes_backups.go b/resources/services/blockstorage/volumes_backups.go new file mode 100644 index 0000000..c9f3459 --- /dev/null +++ b/resources/services/blockstorage/volumes_backups.go @@ -0,0 +1,98 @@ +package blockstorage + +import ( + "context" + + "github.com/cloudquery/plugin-sdk/v4/schema" + "github.com/cloudquery/plugin-sdk/v4/transformers" + "github.com/dihedron/cq-plugin-utils/transform" + "github.com/dihedron/cq-plugin-utils/utils" + "github.com/dihedron/cq-source-openstack/client" + "github.com/gophercloud/gophercloud/openstack/blockstorage/extensions/backups" +) + +func VolumesBackups() *schema.Table { + return &schema.Table{ + Name: "openstack_blockstorage_volumes_backups", + Resolver: fetchVolumesBackups, + Transform: transformers.TransformWithStruct( + &Backup{}, + transformers.WithPrimaryKeys("ID"), + transformers.WithTypeTransformer(transform.TagTypeTransformer), // use cq-type tags to translate type + ), + } +} + +func fetchVolumesBackups(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + api := meta.(*client.Client) + + volume := parent.Item.(*Volume) + + blockstorage, err := api.GetServiceClient(client.BlockStorageV3) + if err != nil { + api.Logger().Error().Err(err).Msg("error retrieving client") + return err + } + + listOpts := backups.ListOpts{ + VolumeID: volume.ID, + } + + allPages, err := backups.List(blockstorage, listOpts).AllPages() + if err != nil { + api.Logger().Err(err).Msg("error listing backups") + return err + } + allBackups, err := backups.ExtractBackups(allPages) + if err != nil { + api.Logger().Error().Err(err).Msg("error extracting backups") + return err + } + api.Logger().Debug().Str("volume id", volume.ID).Msg("streaming volume backups") + res <- allBackups + + return nil +} + +type Backup struct { + // ID is the Unique identifier of the backup. + ID string `json:"id"` + // CreatedAt is the date the backup was created. + CreatedAt *utils.Time `json:"created_at" cq-type:"timestamp"` + // UpdatedAt is the date the backup was updated. + UpdatedAt *utils.Time `json:"updated_at" cq-type:"timestamp"` + // Name is the display name of the backup. + Name string `json:"name"` + // Description is the description of the backup. + Description string `json:"description"` + // VolumeID is the ID of the Volume from which this backup was created. + VolumeID string `json:"volume_id"` + // SnapshotID is the ID of the snapshot from which this backup was created. + SnapshotID string `json:"snapshot_id"` + // Status is the status of the backup. + Status string `json:"status"` + // Size is the size of the backup, in GB. + Size int `json:"size"` + // Object Count is the number of objects in the backup. + ObjectCount int `json:"object_count"` + // Container is the container where the backup is stored. + Container string `json:"container"` + // HasDependentBackups is whether there are other backups + // depending on this backup. + HasDependentBackups bool `json:"has_dependent_backups"` + // FailReason has the reason for the backup failure. + FailReason string `json:"fail_reason"` + // IsIncremental is whether this is an incremental backup. + IsIncremental bool `json:"is_incremental"` + // DataTimestamp is the time when the data on the volume was first saved. + DataTimestamp *utils.Time `json:"data_timestamp" cq-type:"timestamp"` + // ProjectID is the ID of the project that owns the backup. This is + // an admin-only field. + ProjectID string `json:"os-backup-project-attr:project_id"` + // Metadata is metadata about the backup. + // This requires microversion 3.43 or later. + Metadata *map[string]string `json:"metadata"` + // AvailabilityZone is the Availability Zone of the backup. + // This requires microversion 3.51 or later. + AvailabilityZone *string `json:"availability_zone"` +} diff --git a/resources/aggregate_hosts.go b/resources/services/compute/aggregate_hosts.go similarity index 85% rename from resources/aggregate_hosts.go rename to resources/services/compute/aggregate_hosts.go index bdf9b40..8a26b64 100644 --- a/resources/aggregate_hosts.go +++ b/resources/services/compute/aggregate_hosts.go @@ -1,8 +1,10 @@ -package resources +package compute import ( "context" + "github.com/dihedron/cq-plugin-utils/utils" + "github.com/cloudquery/plugin-sdk/v4/schema" "github.com/cloudquery/plugin-sdk/v4/transformers" "github.com/dihedron/cq-plugin-utils/transform" @@ -12,10 +14,10 @@ import ( func AggregateHosts() *schema.Table { return &schema.Table{ - Name: "openstack_aggregate_hosts", + Name: "openstack_compute_aggregate_hosts", Resolver: fetchAggregateHosts, Transform: transformers.TransformWithStruct( - &Single[string]{}, + &utils.Single[string]{}, transformers.WithNameTransformer(transform.TagNameTransformer), // use cq-name tags to translate name transformers.WithTypeTransformer(transform.TagTypeTransformer), // use cq-type tags to translate type ), @@ -26,7 +28,7 @@ func fetchAggregateHosts(ctx context.Context, meta schema.ClientMeta, parent *sc api := meta.(*client.Client) aggregate := parent.Item.(aggregates.Aggregate) for _, v := range aggregate.Hosts { - host := &Single[string]{Name: v} + host := &utils.Single[string]{Name: v} api.Logger().Debug().Int("aggregate id", aggregate.ID).Str("host", v).Msg("streaming aggregate host") res <- host } diff --git a/resources/aggregates.go b/resources/services/compute/aggregates.go similarity index 96% rename from resources/aggregates.go rename to resources/services/compute/aggregates.go index 19498ba..01e82a1 100644 --- a/resources/aggregates.go +++ b/resources/services/compute/aggregates.go @@ -1,4 +1,4 @@ -package resources +package compute import ( "context" @@ -12,7 +12,7 @@ import ( func Aggregates() *schema.Table { return &schema.Table{ - Name: "openstack_aggregates", + Name: "openstack_compute_aggregates", Resolver: fetchAggregates, Transform: transformers.TransformWithStruct( &aggregates.Aggregate{}, diff --git a/resources/flavor_accesses.go b/resources/services/compute/flavor_accesses.go similarity index 92% rename from resources/flavor_accesses.go rename to resources/services/compute/flavor_accesses.go index 392506e..1b92a8c 100644 --- a/resources/flavor_accesses.go +++ b/resources/services/compute/flavor_accesses.go @@ -1,4 +1,4 @@ -package resources +package compute import ( "context" @@ -15,7 +15,7 @@ import ( func FlavorAccesses() *schema.Table { return &schema.Table{ - Name: "openstack_flavor_accesses", + Name: "openstack_compute_flavor_accesses", Resolver: fetchFlavorAccesses, Transform: transformers.TransformWithStruct( &FlavorAccess{}, @@ -29,7 +29,7 @@ func fetchFlavorAccesses(ctx context.Context, meta schema.ClientMeta, parent *sc api := meta.(*client.Client) - nova, err := api.GetServiceClient(client.ComputeV2) + compute, err := api.GetServiceClient(client.ComputeV2) if err != nil { api.Logger().Error().Err(err).Msg("error retrieving client") return err @@ -38,7 +38,7 @@ func fetchFlavorAccesses(ctx context.Context, meta schema.ClientMeta, parent *sc flavor := parent.Item.(*Flavor) api.Logger().Debug().Str("flavor id", *flavor.ID).Msg("retrieving accesses for flavor") - allPages, err := flavors.ListAccesses(nova, *flavor.ID).AllPages() + allPages, err := flavors.ListAccesses(compute, *flavor.ID).AllPages() if err != nil { if _, ok := err.(gophercloud.ErrDefault404); ok { api.Logger().Warn().Err(err).Str("flavor id", *flavor.ID).Msg("no flavor accesses for flavor") diff --git a/resources/flavor_extra_specs.go b/resources/services/compute/flavor_extra_specs.go similarity index 84% rename from resources/flavor_extra_specs.go rename to resources/services/compute/flavor_extra_specs.go index 26fd2c5..b4d3f06 100644 --- a/resources/flavor_extra_specs.go +++ b/resources/services/compute/flavor_extra_specs.go @@ -1,4 +1,4 @@ -package resources +package compute import ( "context" @@ -6,15 +6,16 @@ import ( "github.com/cloudquery/plugin-sdk/v4/schema" "github.com/cloudquery/plugin-sdk/v4/transformers" "github.com/dihedron/cq-plugin-utils/transform" + "github.com/dihedron/cq-plugin-utils/utils" "github.com/dihedron/cq-source-openstack/client" ) func FlavorExtraSpecs() *schema.Table { return &schema.Table{ - Name: "openstack_flavor_extra_specs", + Name: "openstack_compute_flavor_extra_specs", Resolver: fetchFlavorExtraSpecs, Transform: transformers.TransformWithStruct( - &Pair[string, string]{}, + &utils.Pair[string, string]{}, transformers.WithNameTransformer(transform.TagNameTransformer), // use cq-name tags to translate name transformers.WithTypeTransformer(transform.TagTypeTransformer), // use cq-type tags to translate type ), @@ -29,7 +30,7 @@ func fetchFlavorExtraSpecs(ctx context.Context, meta schema.ClientMeta, parent * if flavor.ExtraSpecsMap != nil { for k, v := range *flavor.ExtraSpecsMap { - pair := &Pair[string, string]{ + pair := &utils.Pair[string, string]{ Key: k, Value: v, } diff --git a/resources/flavors.go b/resources/services/compute/flavors.go similarity index 95% rename from resources/flavors.go rename to resources/services/compute/flavors.go index 2be9af4..0807917 100644 --- a/resources/flavors.go +++ b/resources/services/compute/flavors.go @@ -1,4 +1,4 @@ -package resources +package compute import ( "context" @@ -16,7 +16,7 @@ import ( func Flavors() *schema.Table { return &schema.Table{ - Name: "openstack_flavors", + Name: "openstack_compute_flavors", Resolver: fetchFlavors, Transform: transformers.TransformWithStruct( &Flavor{}, @@ -35,7 +35,7 @@ func fetchFlavors(ctx context.Context, meta schema.ClientMeta, parent *schema.Re api := meta.(*client.Client) - nova, err := api.GetServiceClient(client.ComputeV2) + compute, err := api.GetServiceClient(client.ComputeV2) if err != nil { api.Logger().Error().Err(err).Msg("error retrieving client") return err @@ -45,7 +45,7 @@ func fetchFlavors(ctx context.Context, meta schema.ClientMeta, parent *schema.Re AccessType: "None", } - allPages, err := flavors.ListDetail(nova, opts).AllPages() + allPages, err := flavors.ListDetail(compute, opts).AllPages() if err != nil { api.Logger().Error().Err(err).Str("options", format.ToPrettyJSON(opts)).Msg("error listing flavors with options") return err @@ -65,7 +65,7 @@ func fetchFlavors(ctx context.Context, meta schema.ClientMeta, parent *schema.Re flavor := flavor // retrieve the extra specs - extraSpecs := flavors.ListExtraSpecs(nova, *flavor.ID) + extraSpecs := flavors.ListExtraSpecs(compute, *flavor.ID) if err != nil { api.Logger().Error().Err(err).Str("flavor id", *flavor.ID).Msg("error getting flavor extra specs") return err diff --git a/resources/hypervisors.go b/resources/services/compute/hypervisors.go similarity index 92% rename from resources/hypervisors.go rename to resources/services/compute/hypervisors.go index 5b19f34..5690b0a 100644 --- a/resources/hypervisors.go +++ b/resources/services/compute/hypervisors.go @@ -1,4 +1,4 @@ -package resources +package compute import ( "context" @@ -13,7 +13,7 @@ import ( func Hypervisors() *schema.Table { return &schema.Table{ - Name: "openstack_hypervisors", + Name: "openstack_compute_hypervisors", Resolver: fetchHypervisors, Transform: transformers.TransformWithStruct( &hypervisors.Hypervisor{}, @@ -21,11 +21,6 @@ func Hypervisors() *schema.Table { transformers.WithTypeTransformer(transform.TagTypeTransformer), // use cq-type tags to translate type transformers.WithSkipFields("Links"), ), - Relations: []*schema.Table{ - // ImageMetadata(), - // ImageProperties(), - // ImageTags(), - }, } } diff --git a/resources/instance_addresses.go b/resources/services/compute/instance_addresses.go similarity index 96% rename from resources/instance_addresses.go rename to resources/services/compute/instance_addresses.go index c6c376c..dce1048 100644 --- a/resources/instance_addresses.go +++ b/resources/services/compute/instance_addresses.go @@ -1,4 +1,4 @@ -package resources +package compute import ( "context" @@ -12,7 +12,7 @@ import ( func InstanceAddresses() *schema.Table { return &schema.Table{ - Name: "openstack_instance_addresses", + Name: "openstack_compute_instance_addresses", Resolver: fetchInstanceAddresses, Transform: transformers.TransformWithStruct( &Address{}, diff --git a/resources/instance_attached_volumes.go b/resources/services/compute/instance_attached_volumes.go similarity index 93% rename from resources/instance_attached_volumes.go rename to resources/services/compute/instance_attached_volumes.go index 0810526..0e98af4 100644 --- a/resources/instance_attached_volumes.go +++ b/resources/services/compute/instance_attached_volumes.go @@ -1,4 +1,4 @@ -package resources +package compute import ( "context" @@ -12,7 +12,7 @@ import ( func InstanceAttachedVolumes() *schema.Table { return &schema.Table{ - Name: "openstack_instance_attached_volumes", + Name: "openstack_compute_instance_attached_volumes", Resolver: fetchInstanceAttachedVolumes, Transform: transformers.TransformWithStruct( &servers.AttachedVolume{}, diff --git a/resources/instance_flavor_extra_specs.go b/resources/services/compute/instance_flavor_extra_specs.go similarity index 85% rename from resources/instance_flavor_extra_specs.go rename to resources/services/compute/instance_flavor_extra_specs.go index fee5052..53c8f42 100644 --- a/resources/instance_flavor_extra_specs.go +++ b/resources/services/compute/instance_flavor_extra_specs.go @@ -1,8 +1,10 @@ -package resources +package compute import ( "context" + "github.com/dihedron/cq-plugin-utils/utils" + "github.com/cloudquery/plugin-sdk/v4/schema" "github.com/cloudquery/plugin-sdk/v4/transformers" "github.com/dihedron/cq-plugin-utils/transform" @@ -11,10 +13,10 @@ import ( func InstanceFlavorExtraSpecs() *schema.Table { return &schema.Table{ - Name: "openstack_instance_flavor_extra_specs", + Name: "openstack_compute_instance_flavor_extra_specs", Resolver: fetchInstanceFlavorExtraSpecs, Transform: transformers.TransformWithStruct( - &Pair[string, string]{}, + &utils.Pair[string, string]{}, transformers.WithNameTransformer(transform.TagNameTransformer), // use cq-name tags to translate name transformers.WithTypeTransformer(transform.TagTypeTransformer), // use cq-type tags to translate type ), @@ -32,7 +34,7 @@ func fetchInstanceFlavorExtraSpecs(ctx context.Context, meta schema.ClientMeta, if instance.Flavor.ExtraSpecsMap != nil { for k, v := range *instance.Flavor.ExtraSpecsMap { - pair := &Pair[string, string]{ + pair := &utils.Pair[string, string]{ Key: k, Value: v, } diff --git a/resources/instance_flavors.go b/resources/services/compute/instance_flavors.go similarity index 95% rename from resources/instance_flavors.go rename to resources/services/compute/instance_flavors.go index 3dbf60c..6fc5df7 100644 --- a/resources/instance_flavors.go +++ b/resources/services/compute/instance_flavors.go @@ -1,11 +1,11 @@ -package resources +package compute import ( "context" "encoding/json" "sync" - "github.com/apache/arrow/go/v13/arrow" + "github.com/apache/arrow/go/v15/arrow" "github.com/cloudquery/plugin-sdk/v4/schema" "github.com/cloudquery/plugin-sdk/v4/transformers" "github.com/dihedron/cq-plugin-utils/format" @@ -15,7 +15,7 @@ import ( func InstanceFlavors() *schema.Table { return &schema.Table{ - Name: "openstack_instance_flavors", + Name: "openstack_compute_instance_flavors", Resolver: fetchInstanceFlavors, Transform: transformers.TransformWithStruct( &InstanceFlavor{}, @@ -99,7 +99,7 @@ func InstanceFlavors() *schema.Table { { Name: "watchdog_action", Type: arrow.BinaryTypes.String, - Description: "The action to take when the Nova watchdog detects the instance is not responding.", + Description: "The action to take when the Compute watchdog detects the instance is not responding.", Resolver: schema.PathResolver("ExtraSpecsObj.WatchdogAction"), }, }, diff --git a/resources/instance_metadata.go b/resources/services/compute/instance_metadata.go similarity index 84% rename from resources/instance_metadata.go rename to resources/services/compute/instance_metadata.go index 480559c..b45f70e 100644 --- a/resources/instance_metadata.go +++ b/resources/services/compute/instance_metadata.go @@ -1,4 +1,4 @@ -package resources +package compute import ( "context" @@ -6,15 +6,16 @@ import ( "github.com/cloudquery/plugin-sdk/v4/schema" "github.com/cloudquery/plugin-sdk/v4/transformers" "github.com/dihedron/cq-plugin-utils/transform" + "github.com/dihedron/cq-plugin-utils/utils" "github.com/dihedron/cq-source-openstack/client" ) func InstanceMetadata() *schema.Table { return &schema.Table{ - Name: "openstack_instance_metadata", + Name: "openstack_compute_instance_metadata", Resolver: fetchInstanceMetadata, Transform: transformers.TransformWithStruct( - &Pair[string, string]{}, + &utils.Pair[string, string]{}, transformers.WithNameTransformer(transform.TagNameTransformer), // use cq-name tags to translate name transformers.WithTypeTransformer(transform.TagTypeTransformer), // use cq-type tags to translate type //transformers.WithSkipFields("OriginalName", "ExtraSpecs"), @@ -29,7 +30,7 @@ func fetchInstanceMetadata(ctx context.Context, meta schema.ClientMeta, parent * instance := parent.Item.(*Instance) for k, v := range instance.Metadata { - pair := &Pair[string, string]{ + pair := &utils.Pair[string, string]{ Key: k, Value: v, } diff --git a/resources/instance_security_groups.go b/resources/services/compute/instance_security_groups.go similarity index 85% rename from resources/instance_security_groups.go rename to resources/services/compute/instance_security_groups.go index 80b13a1..90641b3 100644 --- a/resources/instance_security_groups.go +++ b/resources/services/compute/instance_security_groups.go @@ -1,4 +1,4 @@ -package resources +package compute import ( "context" @@ -11,10 +11,10 @@ import ( func InstanceSecurityGroups() *schema.Table { return &schema.Table{ - Name: "openstack_instance_security_groups", + Name: "openstack_compute_instance_security_groups", Resolver: fetchInstanceSecurityGroups, Transform: transformers.TransformWithStruct( - &SecurityGroup{}, + &InstanceSecurityGroup{}, transformers.WithNameTransformer(transform.TagNameTransformer), // use cq-name tags to translate name transformers.WithTypeTransformer(transform.TagTypeTransformer), // use cq-type tags to translate type //transformers.WithSkipFields("OriginalName", "ExtraSpecs"), @@ -28,17 +28,15 @@ func fetchInstanceSecurityGroups(ctx context.Context, meta schema.ClientMeta, pa instance := parent.Item.(*Instance) - //if instance.SecurityGroups != nil { for _, group := range instance.SecurityGroups { api.Logger().Debug().Str("instance id", instance.ID).Msg("streaming instance security group") - res <- SecurityGroup{ + res <- InstanceSecurityGroup{ Name: group.Name, } } - //} return nil } -type SecurityGroup struct { +type InstanceSecurityGroup struct { Name string `json:"name"` } diff --git a/resources/instance_tags.go b/resources/services/compute/instance_tags.go similarity index 86% rename from resources/instance_tags.go rename to resources/services/compute/instance_tags.go index 7d5e5dc..7117bcc 100644 --- a/resources/instance_tags.go +++ b/resources/services/compute/instance_tags.go @@ -1,8 +1,10 @@ -package resources +package compute import ( "context" + "github.com/dihedron/cq-plugin-utils/utils" + "github.com/cloudquery/plugin-sdk/v4/schema" "github.com/cloudquery/plugin-sdk/v4/transformers" "github.com/dihedron/cq-plugin-utils/transform" @@ -11,10 +13,10 @@ import ( func InstanceTags() *schema.Table { return &schema.Table{ - Name: "openstack_instance_tags", + Name: "openstack_compute_instance_tags", Resolver: fetchInstanceTags, Transform: transformers.TransformWithStruct( - &Tag{}, + &utils.Tag{}, transformers.WithNameTransformer(transform.TagNameTransformer), // use cq-name tags to translate name transformers.WithTypeTransformer(transform.TagTypeTransformer), // use cq-type tags to translate type ), @@ -29,14 +31,10 @@ func fetchInstanceTags(ctx context.Context, meta schema.ClientMeta, parent *sche if instance.Tags != nil { for _, v := range *instance.Tags { - tag := &Tag{Value: v} + tag := &utils.Tag{Value: v} api.Logger().Debug().Str("instance id", instance.ID).Msg("streaming instance tag") res <- tag } } return nil } - -type Tag struct { - Value string `cq-name:"value"` -} diff --git a/resources/instances.go b/resources/services/compute/instances.go similarity index 91% rename from resources/instances.go rename to resources/services/compute/instances.go index 39aea96..b701d68 100644 --- a/resources/instances.go +++ b/resources/services/compute/instances.go @@ -1,9 +1,11 @@ -package resources +package compute import ( "context" - "github.com/apache/arrow/go/v13/arrow" + "github.com/dihedron/cq-plugin-utils/utils" + + "github.com/apache/arrow/go/v15/arrow" "github.com/cloudquery/plugin-sdk/v4/schema" "github.com/cloudquery/plugin-sdk/v4/transformers" "github.com/dihedron/cq-plugin-utils/format" @@ -14,7 +16,7 @@ import ( func Instances() *schema.Table { return &schema.Table{ - Name: "openstack_instances", + Name: "openstack_compute_instances", Resolver: fetchInstances, Transform: transformers.TransformWithStruct( &Instance{}, @@ -35,7 +37,7 @@ func Instances() *schema.Table { { Name: "image_id", Type: arrow.BinaryTypes.String, - Description: "The Glance image used to start the instance.", + Description: "The Image image used to start the instance.", Resolver: transform.Apply( transform.OnObjectField("Image"), transform.GetMapEntry[string, any]("id"), @@ -67,7 +69,7 @@ func fetchInstances(ctx context.Context, meta schema.ClientMeta, parent *schema. api := meta.(*client.Client) - nova, err := api.GetServiceClient(client.ComputeV2) + compute, err := api.GetServiceClient(client.ComputeV2) if err != nil { api.Logger().Error().Err(err).Msg("error retrieving client") return err @@ -77,7 +79,7 @@ func fetchInstances(ctx context.Context, meta schema.ClientMeta, parent *schema. AllTenants: true, } - allPages, err := servers.List(nova, opts).AllPages() + allPages, err := servers.List(compute, opts).AllPages() if err != nil { api.Logger().Error().Err(err).Str("options", format.ToPrettyJSON(opts)).Msg("error listing instances with options") return err @@ -113,10 +115,10 @@ type Instance struct { TenantID string `json:"tenant_id"` UserID string `json:"user_id"` Name string `json:"name"` - CreatedAt *Time `json:"created" cq-name:"created_at" cq-type:"timestamp"` - LaunchedAt *Time `json:"OS-SRV-USG:launched_at" cq-name:"launched_at" cq-type:"timestamp"` - UpdatedAt *Time `json:"updated" cq-name:"updated_at" cq-type:"timestamp"` - TerminatedAt *Time `json:"OS-SRV-USG:terminated_at" cq-name:"terminated_at" cq-type:"timestamp"` + CreatedAt *utils.Time `json:"created" cq-name:"created_at" cq-type:"timestamp"` + LaunchedAt *utils.Time `json:"OS-SRV-USG:launched_at" cq-name:"launched_at" cq-type:"timestamp"` + UpdatedAt *utils.Time `json:"updated" cq-name:"updated_at" cq-type:"timestamp"` + TerminatedAt *utils.Time `json:"OS-SRV-USG:terminated_at" cq-name:"terminated_at" cq-type:"timestamp"` HostID string `json:"hostid"` Status string `json:"status"` Progress int `json:"progress"` diff --git a/resources/project_limits.go b/resources/services/compute/project_limits.go similarity index 95% rename from resources/project_limits.go rename to resources/services/compute/project_limits.go index 57d2cd8..e6eba9e 100644 --- a/resources/project_limits.go +++ b/resources/services/compute/project_limits.go @@ -1,4 +1,4 @@ -package resources +package compute import ( "context" @@ -15,7 +15,7 @@ import ( func ProjectLimits() *schema.Table { return &schema.Table{ - Name: "openstack_project_limits", + Name: "openstack_compute_project_limits", Resolver: fetchProjectLimits, Transform: transformers.TransformWithStruct( &limits.Absolute{}, @@ -23,7 +23,6 @@ func ProjectLimits() *schema.Table { transformers.WithTypeTransformer(transform.TagTypeTransformer), // use cq-type tags to translate type transformers.WithSkipFields("Links"), ), - Relations: []*schema.Table{}, } } diff --git a/resources/services/compute/usage.go b/resources/services/compute/usage.go new file mode 100644 index 0000000..f2f3145 --- /dev/null +++ b/resources/services/compute/usage.go @@ -0,0 +1,72 @@ +package compute + +import ( + "context" + + "github.com/cloudquery/plugin-sdk/v4/schema" + "github.com/cloudquery/plugin-sdk/v4/transformers" + "github.com/dihedron/cq-plugin-utils/transform" + "github.com/dihedron/cq-plugin-utils/utils" + "github.com/dihedron/cq-source-openstack/client" + "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/usage" + "github.com/gophercloud/gophercloud/pagination" +) + +func ServerUsage() *schema.Table { + return &schema.Table{ + Name: "openstack_compute_serverusage", + Resolver: fetchServerUsage, + Transform: transformers.TransformWithStruct( + &Usage{}, + transformers.WithTypeTransformer(transform.TagTypeTransformer), // use cq-type tags to translate type + ), + } +} + +func fetchServerUsage(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + + api := meta.(*client.Client) + + compute, err := api.GetServiceClient(client.ComputeV2) + if err != nil { + api.Logger().Error().Err(err).Msg("error retrieving client") + return err + } + + allTenantsOpts := usage.AllTenantsOpts{ + Detailed: true, + } + + err = usage.AllTenants(compute, allTenantsOpts).EachPage(func(page pagination.Page) (bool, error) { + allTenantsUsage, err := usage.ExtractAllTenants(page) + if err != nil { + return false, err + } + + res <- allTenantsUsage + + return true, nil + }) + + if err != nil { + api.Logger().Error().Err(err).Msg("error extracting all tenants usage") + return err + } + + return nil +} + +type Usage struct { + EndedAt *utils.Time `json:"-" cq-type:"timestamp"` + Flavor string `json:"flavor"` + Hours float64 `json:"hours"` + InstanceID string `json:"instance_id"` + LocalGB int `json:"local_gb"` + MemoryMB int `json:"memory_mb"` + Name string `json:"name"` + StartedAt *utils.Time `json:"-" cq-type:"timestamp"` + State string `json:"state"` + TenantID string `json:"tenant_id"` + Uptime int `json:"uptime"` + VCPUs int `json:"vcpus"` +} diff --git a/resources/services/identity/domain_groups.go b/resources/services/identity/domain_groups.go new file mode 100644 index 0000000..059ed40 --- /dev/null +++ b/resources/services/identity/domain_groups.go @@ -0,0 +1,62 @@ +package identity + +import ( + "context" + + "github.com/cloudquery/plugin-sdk/v4/schema" + "github.com/cloudquery/plugin-sdk/v4/transformers" + "github.com/dihedron/cq-plugin-utils/format" + "github.com/dihedron/cq-source-openstack/client" + "github.com/gophercloud/gophercloud/openstack/identity/v3/domains" + "github.com/gophercloud/gophercloud/openstack/identity/v3/groups" +) + +func DomainGroups() *schema.Table { + return &schema.Table{ + Name: "openstack_identity_domain_groups", + Resolver: fetchDomainGroups, + Transform: transformers.TransformWithStruct( + &groups.Group{}, + transformers.WithSkipFields("Links"), + ), + } +} + +func fetchDomainGroups(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + + api := meta.(*client.Client) + + domain := parent.Item.(domains.Domain) + + identity, err := api.GetServiceClient(client.IdentityV3) + if err != nil { + api.Logger().Error().Err(err).Msg("error retrieving client") + return err + } + + opts := groups.ListOpts{ + DomainID: domain.ID, + } + + allPages, err := groups.List(identity, opts).AllPages() + if err != nil { + api.Logger().Error().Err(err).Str("options", format.ToPrettyJSON(opts)).Msg("error listing groups with options") + return err + } + allGroups, err := groups.ExtractGroups(allPages) + if err != nil { + api.Logger().Error().Err(err).Msg("error extracting groups") + return err + } + api.Logger().Debug().Int("count", len(allGroups)).Msg("groups retrieved") + + for _, group := range allGroups { + if ctx.Err() != nil { + api.Logger().Debug().Msg("context done, exit") + break + } + api.Logger().Debug().Str("user id", group.ID).Str("data", format.ToPrettyJSON(group)).Msg("streaming group") + res <- group + } + return nil +} diff --git a/resources/services/identity/domains.go b/resources/services/identity/domains.go new file mode 100644 index 0000000..59c862c --- /dev/null +++ b/resources/services/identity/domains.go @@ -0,0 +1,64 @@ +package identity + +import ( + "context" + + "github.com/cloudquery/plugin-sdk/v4/schema" + "github.com/cloudquery/plugin-sdk/v4/transformers" + "github.com/dihedron/cq-plugin-utils/format" + "github.com/dihedron/cq-source-openstack/client" + + "github.com/gophercloud/gophercloud/openstack/identity/v3/domains" +) + +func Domains() *schema.Table { + return &schema.Table{ + Name: "openstack_identity_domains", + Resolver: fetchDomains, + Transform: transformers.TransformWithStruct( + &domains.Domain{}, + transformers.WithSkipFields("Links"), + ), + Relations: []*schema.Table{ + DomainGroups(), + }, + } +} + +func fetchDomains(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + + api := meta.(*client.Client) + + identity, err := api.GetServiceClient(client.IdentityV3) + if err != nil { + api.Logger().Error().Err(err).Msg("error retrieving client") + return err + } + + api.Logger().Debug().Msg("getting list of domains...") + + opts := domains.ListOpts{} + + allPages, err := domains.List(identity, opts).AllPages() + if err != nil { + api.Logger().Error().Err(err).Str("options", format.ToPrettyJSON(opts)).Msg("error listing domains with options") + return err + } + + allDomains, err := domains.ExtractDomains(allPages) + if err != nil { + api.Logger().Error().Err(err).Msg("error extracting domains") + return err + } + api.Logger().Debug().Int("count", len(allDomains)).Msg("domains retrieved") + + for _, domain := range allDomains { + if ctx.Err() != nil { + api.Logger().Debug().Msg("context done, exit") + break + } + api.Logger().Debug().Str("domain id", domain.ID).Str("data", format.ToJSON(domain)).Msg("streaming domain") + res <- domain + } + return nil +} diff --git a/resources/projects.go b/resources/services/identity/projects.go similarity index 85% rename from resources/projects.go rename to resources/services/identity/projects.go index 3e1eed7..a4fb684 100644 --- a/resources/projects.go +++ b/resources/services/identity/projects.go @@ -1,4 +1,4 @@ -package resources +package identity import ( "context" @@ -7,13 +7,14 @@ import ( "github.com/cloudquery/plugin-sdk/v4/transformers" "github.com/dihedron/cq-plugin-utils/format" "github.com/dihedron/cq-source-openstack/client" + "github.com/dihedron/cq-source-openstack/resources/services/compute" "github.com/gophercloud/gophercloud/openstack/identity/v3/projects" ) func Projects() *schema.Table { return &schema.Table{ - Name: "openstack_projects", + Name: "openstack_identity_projects", Resolver: fetchProjects, Transform: transformers.TransformWithStruct( &projects.Project{}, @@ -21,7 +22,7 @@ func Projects() *schema.Table { transformers.WithSkipFields("Links"), ), Relations: []*schema.Table{ - ProjectLimits(), + compute.ProjectLimits(), }, // Columns: []schema.Column{ // { @@ -40,7 +41,7 @@ func fetchProjects(ctx context.Context, meta schema.ClientMeta, parent *schema.R api := meta.(*client.Client) - keystone, err := api.GetServiceClient(client.IdentityV3) + identity, err := api.GetServiceClient(client.IdentityV3) if err != nil { api.Logger().Error().Err(err).Msg("error retrieving client") return err @@ -48,7 +49,7 @@ func fetchProjects(ctx context.Context, meta schema.ClientMeta, parent *schema.R opts := projects.ListOpts{} - allPages, err := projects.List(keystone, opts).AllPages() + allPages, err := projects.List(identity, opts).AllPages() if err != nil { api.Logger().Error().Err(err).Str("options", format.ToPrettyJSON(opts)).Msg("error listing projects with options") return err @@ -65,8 +66,6 @@ func fetchProjects(ctx context.Context, meta schema.ClientMeta, parent *schema.R api.Logger().Debug().Msg("context done, exit") break } - project := project - //api.Logger().Debug().Str("data", format.ToPrettyJSON(project)).Msg("streaming project") api.Logger().Debug().Str("id", project.ID).Msg("streaming project") res <- project } diff --git a/resources/services/identity/regions.go b/resources/services/identity/regions.go new file mode 100644 index 0000000..426f61e --- /dev/null +++ b/resources/services/identity/regions.go @@ -0,0 +1,61 @@ +package identity + +import ( + "context" + + "github.com/cloudquery/plugin-sdk/v4/schema" + "github.com/cloudquery/plugin-sdk/v4/transformers" + "github.com/dihedron/cq-plugin-utils/format" + "github.com/dihedron/cq-source-openstack/client" + + "github.com/gophercloud/gophercloud/openstack/identity/v3/regions" +) + +func Regions() *schema.Table { + return &schema.Table{ + Name: "openstack_identity_regions", + Resolver: fetchRegions, + Transform: transformers.TransformWithStruct( + ®ions.Region{}, + transformers.WithSkipFields("Links", "Extra"), + ), + } +} + +func fetchRegions(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + + api := meta.(*client.Client) + + identity, err := api.GetServiceClient(client.IdentityV3) + if err != nil { + api.Logger().Error().Err(err).Msg("error retrieving client") + return err + } + + api.Logger().Debug().Msg("getting list of regions...") + + opts := regions.ListOpts{} + + allPages, err := regions.List(identity, opts).AllPages() + if err != nil { + api.Logger().Error().Err(err).Str("options", format.ToPrettyJSON(opts)).Msg("error listing regions with options") + return err + } + + allRegions, err := regions.ExtractRegions(allPages) + if err != nil { + api.Logger().Error().Err(err).Msg("error extracting regions") + return err + } + api.Logger().Debug().Int("count", len(allRegions)).Msg("regions retrieved") + + for _, region := range allRegions { + if ctx.Err() != nil { + api.Logger().Debug().Msg("context done, exit") + break + } + api.Logger().Debug().Str("region id", region.ID).Str("data", format.ToJSON(region)).Msg("streaming region") + res <- region + } + return nil +} diff --git a/resources/services/identity/registeredlimits.go b/resources/services/identity/registeredlimits.go new file mode 100644 index 0000000..7db6094 --- /dev/null +++ b/resources/services/identity/registeredlimits.go @@ -0,0 +1,61 @@ +package identity + +import ( + "context" + + "github.com/cloudquery/plugin-sdk/v4/schema" + "github.com/cloudquery/plugin-sdk/v4/transformers" + "github.com/dihedron/cq-plugin-utils/format" + "github.com/dihedron/cq-source-openstack/client" + + "github.com/gophercloud/gophercloud/openstack/identity/v3/registeredlimits" +) + +func RegisteredLimits() *schema.Table { + return &schema.Table{ + Name: "openstack_identity_registeredlimits", + Resolver: fetchRegisteredLimits, + Transform: transformers.TransformWithStruct( + ®isteredlimits.RegisteredLimit{}, + transformers.WithSkipFields("Links"), + ), + } +} + +func fetchRegisteredLimits(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + + api := meta.(*client.Client) + + identity, err := api.GetServiceClient(client.IdentityV3) + if err != nil { + api.Logger().Error().Err(err).Msg("error retrieving client") + return err + } + + api.Logger().Debug().Msg("getting list of registered_limits...") + + opts := registeredlimits.ListOpts{} + + allPages, err := registeredlimits.List(identity, opts).AllPages() + if err != nil { + api.Logger().Error().Err(err).Str("options", format.ToPrettyJSON(opts)).Msg("error listing registered_limits with options") + return err + } + + allLimits, err := registeredlimits.ExtractRegisteredLimits(allPages) + if err != nil { + api.Logger().Error().Err(err).Msg("error extracting registeredlimits") + return err + } + api.Logger().Debug().Int("count", len(allLimits)).Msg("registeredlimits retrieved") + + for _, registered_limit := range allLimits { + if ctx.Err() != nil { + api.Logger().Debug().Msg("context done, exit") + break + } + api.Logger().Debug().Str("registered_limit id", registered_limit.ID).Str("data", format.ToJSON(registered_limit)).Msg("streaming registered_limit") + res <- registered_limit + } + return nil +} diff --git a/resources/services/identity/roles.go b/resources/services/identity/roles.go new file mode 100644 index 0000000..7dc4d29 --- /dev/null +++ b/resources/services/identity/roles.go @@ -0,0 +1,61 @@ +package identity + +import ( + "context" + + "github.com/cloudquery/plugin-sdk/v4/schema" + "github.com/cloudquery/plugin-sdk/v4/transformers" + "github.com/dihedron/cq-plugin-utils/format" + "github.com/dihedron/cq-source-openstack/client" + + "github.com/gophercloud/gophercloud/openstack/identity/v3/roles" +) + +func Roles() *schema.Table { + return &schema.Table{ + Name: "openstack_identity_roles", + Resolver: fetchRoles, + Transform: transformers.TransformWithStruct( + &roles.Role{}, + transformers.WithSkipFields("Links", "Extra"), + ), + } +} + +func fetchRoles(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + + api := meta.(*client.Client) + + identity, err := api.GetServiceClient(client.IdentityV3) + if err != nil { + api.Logger().Error().Err(err).Msg("error retrieving client") + return err + } + + api.Logger().Debug().Msg("getting list of roles...") + + opts := roles.ListOpts{} + + allPages, err := roles.List(identity, opts).AllPages() + if err != nil { + api.Logger().Error().Err(err).Str("options", format.ToPrettyJSON(opts)).Msg("error listing roles with options") + return err + } + + allRegions, err := roles.ExtractRoles(allPages) + if err != nil { + api.Logger().Error().Err(err).Msg("error extracting roles") + return err + } + api.Logger().Debug().Int("count", len(allRegions)).Msg("roles retrieved") + + for _, role := range allRegions { + if ctx.Err() != nil { + api.Logger().Debug().Msg("context done, exit") + break + } + api.Logger().Debug().Str("role id", role.ID).Str("data", format.ToJSON(role)).Msg("streaming role") + res <- role + } + return nil +} diff --git a/resources/services/identity/services.go b/resources/services/identity/services.go new file mode 100644 index 0000000..8b4b630 --- /dev/null +++ b/resources/services/identity/services.go @@ -0,0 +1,61 @@ +package identity + +import ( + "context" + + "github.com/cloudquery/plugin-sdk/v4/schema" + "github.com/cloudquery/plugin-sdk/v4/transformers" + "github.com/dihedron/cq-plugin-utils/format" + "github.com/dihedron/cq-source-openstack/client" + + "github.com/gophercloud/gophercloud/openstack/identity/v3/services" +) + +func Services() *schema.Table { + return &schema.Table{ + Name: "openstack_identity_services", + Resolver: fetchServices, + Transform: transformers.TransformWithStruct( + &services.Service{}, + transformers.WithSkipFields("Links", "Extra"), + ), + } +} + +func fetchServices(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + + api := meta.(*client.Client) + + identity, err := api.GetServiceClient(client.IdentityV3) + if err != nil { + api.Logger().Error().Err(err).Msg("error retrieving client") + return err + } + + opts := services.ListOpts{ + // ServiceType: catalog.Type, + } + + allPages, err := services.List(identity, opts).AllPages() + if err != nil { + api.Logger().Error().Err(err).Str("options", format.ToPrettyJSON(opts)).Msg("error listing services with options") + return err + } + + allService, err := services.ExtractServices(allPages) + if err != nil { + api.Logger().Error().Err(err).Msg("error extracting services") + return err + } + api.Logger().Debug().Int("count", len(allService)).Msg("services retrieved") + + for _, service := range allService { + if ctx.Err() != nil { + api.Logger().Debug().Msg("context done, exit") + break + } + api.Logger().Debug().Str("service id", service.ID).Str("data", format.ToJSON(service)).Msg("streaming service") + res <- service + } + return nil +} diff --git a/resources/user_keypairs.go b/resources/services/identity/user_keypairs.go similarity index 96% rename from resources/user_keypairs.go rename to resources/services/identity/user_keypairs.go index 76d758f..ec7d5f8 100644 --- a/resources/user_keypairs.go +++ b/resources/services/identity/user_keypairs.go @@ -1,4 +1,4 @@ -package resources +package identity import ( "context" @@ -14,7 +14,7 @@ import ( func UserKeyPairs() *schema.Table { return &schema.Table{ - Name: "openstack_user_keypairs", + Name: "openstack_identity_user_keypairs", Resolver: fetchUserKeyPairs, Transform: transformers.TransformWithStruct( &keypairs.KeyPair{}, @@ -22,7 +22,6 @@ func UserKeyPairs() *schema.Table { transformers.WithTypeTransformer(transform.TagTypeTransformer), // use cq-type tags to translate type transformers.WithSkipFields("Links"), ), - Relations: []*schema.Table{}, } } diff --git a/resources/users.go b/resources/services/identity/users.go similarity index 95% rename from resources/users.go rename to resources/services/identity/users.go index 1fd3593..a3a7d34 100644 --- a/resources/users.go +++ b/resources/services/identity/users.go @@ -1,11 +1,11 @@ -package resources +package identity import ( "context" "encoding/json" "time" - "github.com/apache/arrow/go/v13/arrow" + "github.com/apache/arrow/go/v15/arrow" "github.com/cloudquery/plugin-sdk/v4/schema" "github.com/cloudquery/plugin-sdk/v4/transformers" "github.com/dihedron/cq-plugin-utils/format" @@ -18,7 +18,7 @@ import ( func Users() *schema.Table { return &schema.Table{ - Name: "openstack_users", + Name: "openstack_identity_users", Resolver: fetchUsers, Transform: transformers.TransformWithStruct( &User{}, @@ -54,7 +54,7 @@ func fetchUsers(ctx context.Context, meta schema.ClientMeta, parent *schema.Reso api := meta.(*client.Client) - keystone, err := api.GetServiceClient(client.IdentityV3) + identity, err := api.GetServiceClient(client.IdentityV3) if err != nil { api.Logger().Error().Err(err).Msg("error retrieving client") return err @@ -64,7 +64,7 @@ func fetchUsers(ctx context.Context, meta schema.ClientMeta, parent *schema.Reso opts := users.ListOpts{} - allPages, err := users.List(keystone, opts).AllPages() + allPages, err := users.List(identity, opts).AllPages() if err != nil { api.Logger().Error().Err(err).Str("options", format.ToPrettyJSON(opts)).Msg("error listing users with options") return err diff --git a/resources/services/image/image_members.go b/resources/services/image/image_members.go new file mode 100644 index 0000000..b4bade4 --- /dev/null +++ b/resources/services/image/image_members.go @@ -0,0 +1,75 @@ +package image + +import ( + "context" + + "github.com/cloudquery/plugin-sdk/v4/schema" + "github.com/cloudquery/plugin-sdk/v4/transformers" + "github.com/dihedron/cq-plugin-utils/format" + "github.com/dihedron/cq-plugin-utils/transform" + "github.com/dihedron/cq-plugin-utils/utils" + "github.com/dihedron/cq-source-openstack/client" + "github.com/gophercloud/gophercloud/openstack/imageservice/v2/images" + "github.com/gophercloud/gophercloud/openstack/imageservice/v2/members" +) + +func ImageMembers() *schema.Table { + return &schema.Table{ + Name: "openstack_image_image_members", + Resolver: fetchImageMembers, + Transform: transformers.TransformWithStruct( + &Member{}, + transformers.WithTypeTransformer(transform.TagTypeTransformer), // use cq-type tags to translate type + ), + } +} + +func fetchImageMembers(ctx context.Context, meta schema.ClientMeta, parent *schema.Resource, res chan<- interface{}) error { + + api := meta.(*client.Client) + + image_service, err := api.GetServiceClient(client.ImageV2) + if err != nil { + api.Logger().Error().Err(err).Msg("error retrieving client") + return err + } + + image := parent.Item.(images.Image) + + // An image must have the shared visibility in order for image members to be added to it. + if image.Visibility == "shared" { + imageID := image.ID + allPages, err := members.List(image_service, imageID).AllPages() + if err != nil { + api.Logger().Error().Err(err).Msg("error listing image members") + return err + } + + allMembers, err := members.ExtractMembers(allPages) + if err != nil { + api.Logger().Error().Err(err).Msg("error extracting image members") + return err + } + api.Logger().Debug().Int("count", len(allMembers)).Msg("image members retrieved") + + for _, member := range allMembers { + if ctx.Err() != nil { + api.Logger().Debug().Msg("context done, exit") + break + } + api.Logger().Debug().Str("member id", member.MemberID).Str("data", format.ToJSON(member)).Msg("streaming image member") + res <- member + } + } + + return nil +} + +type Member struct { + CreatedAt *utils.Time `json:"created_at" cq-type:"timestamp"` + ImageID string `json:"image_id"` + MemberID string `json:"member_id"` + Schema string `json:"schema"` + Status string `json:"status"` + UpdatedAt *utils.Time `json:"updated_at" cq-type:"timestamp"` +} diff --git a/resources/image_metadata.go b/resources/services/image/image_metadata.go similarity index 85% rename from resources/image_metadata.go rename to resources/services/image/image_metadata.go index 3772792..e815824 100644 --- a/resources/image_metadata.go +++ b/resources/services/image/image_metadata.go @@ -1,4 +1,4 @@ -package resources +package image import ( "context" @@ -6,16 +6,17 @@ import ( "github.com/cloudquery/plugin-sdk/v4/schema" "github.com/cloudquery/plugin-sdk/v4/transformers" "github.com/dihedron/cq-plugin-utils/transform" + "github.com/dihedron/cq-plugin-utils/utils" "github.com/dihedron/cq-source-openstack/client" "github.com/gophercloud/gophercloud/openstack/imageservice/v2/images" ) func ImageMetadata() *schema.Table { return &schema.Table{ - Name: "openstack_image_metadata", + Name: "openstack_image_image_metadata", Resolver: fetchImageMetadata, Transform: transformers.TransformWithStruct( - &Pair[string, string]{}, + &utils.Pair[string, string]{}, transformers.WithNameTransformer(transform.TagNameTransformer), // use cq-name tags to translate name transformers.WithTypeTransformer(transform.TagTypeTransformer), // use cq-type tags to translate type //transformers.WithSkipFields("OriginalName", "ExtraSpecs"), @@ -30,7 +31,7 @@ func fetchImageMetadata(ctx context.Context, meta schema.ClientMeta, parent *sch image := parent.Item.(images.Image) for k, v := range image.Metadata { - pair := &Pair[string, string]{ + pair := &utils.Pair[string, string]{ Key: k, Value: v, } diff --git a/resources/image_properties.go b/resources/services/image/image_properties.go similarity index 86% rename from resources/image_properties.go rename to resources/services/image/image_properties.go index 841c367..6e46ae7 100644 --- a/resources/image_properties.go +++ b/resources/services/image/image_properties.go @@ -1,4 +1,4 @@ -package resources +package image import ( "context" @@ -7,16 +7,17 @@ import ( "github.com/cloudquery/plugin-sdk/v4/schema" "github.com/cloudquery/plugin-sdk/v4/transformers" "github.com/dihedron/cq-plugin-utils/transform" + "github.com/dihedron/cq-plugin-utils/utils" "github.com/dihedron/cq-source-openstack/client" "github.com/gophercloud/gophercloud/openstack/imageservice/v2/images" ) func ImageProperties() *schema.Table { return &schema.Table{ - Name: "openstack_image_properties", + Name: "openstack_image_image_properties", Resolver: fetchImageProperties, Transform: transformers.TransformWithStruct( - &Pair[string, string]{}, + &utils.Pair[string, string]{}, transformers.WithNameTransformer(transform.TagNameTransformer), // use cq-name tags to translate name transformers.WithTypeTransformer(transform.TagTypeTransformer), // use cq-type tags to translate type //transformers.WithSkipFields("OriginalName", "ExtraSpecs"), @@ -31,7 +32,7 @@ func fetchImageProperties(ctx context.Context, meta schema.ClientMeta, parent *s image := parent.Item.(images.Image) for k, v := range image.Properties { - pair := &Pair[string, string]{ + pair := &utils.Pair[string, string]{ Key: k, Value: fmt.Sprintf("%v", v), } diff --git a/resources/image_tags.go b/resources/services/image/image_tags.go similarity index 87% rename from resources/image_tags.go rename to resources/services/image/image_tags.go index ae99a8a..597a5c5 100644 --- a/resources/image_tags.go +++ b/resources/services/image/image_tags.go @@ -1,8 +1,10 @@ -package resources +package image import ( "context" + "github.com/dihedron/cq-plugin-utils/utils" + "github.com/cloudquery/plugin-sdk/v4/schema" "github.com/cloudquery/plugin-sdk/v4/transformers" "github.com/dihedron/cq-plugin-utils/transform" @@ -12,10 +14,10 @@ import ( func ImageTags() *schema.Table { return &schema.Table{ - Name: "openstack_image_tags", + Name: "openstack_image_image_tags", Resolver: fetchImageTags, Transform: transformers.TransformWithStruct( - &Tag{}, + &utils.Tag{}, transformers.WithNameTransformer(transform.TagNameTransformer), // use cq-name tags to translate name transformers.WithTypeTransformer(transform.TagTypeTransformer), // use cq-type tags to translate type //transformers.WithSkipFields("OriginalName", "ExtraSpecs"), @@ -31,7 +33,7 @@ func fetchImageTags(ctx context.Context, meta schema.ClientMeta, parent *schema. if image.Tags != nil { for _, v := range image.Tags { - tag := &Tag{Value: v} + tag := &utils.Tag{Value: v} api.Logger().Debug().Str("image id", image.ID).Msg("streaming image tag") res <- tag } diff --git a/resources/images.go b/resources/services/image/images.go similarity index 91% rename from resources/images.go rename to resources/services/image/images.go index a1d7284..4713980 100644 --- a/resources/images.go +++ b/resources/services/image/images.go @@ -1,4 +1,4 @@ -package resources +package image import ( "context" @@ -13,7 +13,7 @@ import ( func Images() *schema.Table { return &schema.Table{ - Name: "openstack_images", + Name: "openstack_image_images", Resolver: fetchImages, Transform: transformers.TransformWithStruct( &images.Image{}, @@ -24,6 +24,7 @@ func Images() *schema.Table { transformers.WithSkipFields("Links"), ), Relations: []*schema.Table{ + ImageMembers(), ImageMetadata(), ImageProperties(), ImageTags(), @@ -35,7 +36,7 @@ func fetchImages(ctx context.Context, meta schema.ClientMeta, parent *schema.Res api := meta.(*client.Client) - glance, err := api.GetServiceClient(client.ImageServiceV2) + image, err := api.GetServiceClient(client.ImageV2) if err != nil { api.Logger().Error().Err(err).Msg("error retrieving client") return err @@ -43,7 +44,7 @@ func fetchImages(ctx context.Context, meta schema.ClientMeta, parent *schema.Res opts := images.ListOpts{} - allPages, err := images.List(glance, opts).AllPages() + allPages, err := images.List(image, opts).AllPages() if err != nil { api.Logger().Error().Err(err).Str("options", format.ToPrettyJSON(opts)).Msg("error listing images with options") return err diff --git a/resources/network_subnets.go b/resources/services/networking/network_subnets.go similarity index 83% rename from resources/network_subnets.go rename to resources/services/networking/network_subnets.go index 34b576c..2c0a32f 100644 --- a/resources/network_subnets.go +++ b/resources/services/networking/network_subnets.go @@ -1,8 +1,10 @@ -package resources +package networking import ( "context" + "github.com/dihedron/cq-plugin-utils/utils" + "github.com/cloudquery/plugin-sdk/v4/schema" "github.com/cloudquery/plugin-sdk/v4/transformers" "github.com/dihedron/cq-plugin-utils/transform" @@ -11,10 +13,10 @@ import ( func NetworkSubnets() *schema.Table { return &schema.Table{ - Name: "openstack_network_subnets", + Name: "openstack_networking_network_subnets", Resolver: fetchNetworkSubnets, Transform: transformers.TransformWithStruct( - &Single[string]{}, + &utils.Single[string]{}, transformers.WithNameTransformer(transform.TagNameTransformer), // use cq-name tags to translate name transformers.WithTypeTransformer(transform.TagTypeTransformer), // use cq-type tags to translate type ), @@ -25,7 +27,7 @@ func fetchNetworkSubnets(ctx context.Context, meta schema.ClientMeta, parent *sc api := meta.(*client.Client) network := parent.Item.(*Network) for _, v := range network.Subnets { - subnet := &Single[string]{Name: v} + subnet := &utils.Single[string]{Name: v} api.Logger().Debug().Str("network id", network.ID).Msg("streaming subnet") res <- subnet } diff --git a/resources/network_tags.go b/resources/services/networking/network_tags.go similarity index 85% rename from resources/network_tags.go rename to resources/services/networking/network_tags.go index e2da1c5..ace929c 100644 --- a/resources/network_tags.go +++ b/resources/services/networking/network_tags.go @@ -1,8 +1,10 @@ -package resources +package networking import ( "context" + "github.com/dihedron/cq-plugin-utils/utils" + "github.com/cloudquery/plugin-sdk/v4/schema" "github.com/cloudquery/plugin-sdk/v4/transformers" "github.com/dihedron/cq-plugin-utils/transform" @@ -11,10 +13,10 @@ import ( func NetworkTags() *schema.Table { return &schema.Table{ - Name: "openstack_network_tags", + Name: "openstack_networking_network_tags", Resolver: fetchNetworkTags, Transform: transformers.TransformWithStruct( - &Tag{}, + &utils.Tag{}, transformers.WithNameTransformer(transform.TagNameTransformer), // use cq-name tags to translate name transformers.WithTypeTransformer(transform.TagTypeTransformer), // use cq-type tags to translate type ), @@ -26,7 +28,7 @@ func fetchNetworkTags(ctx context.Context, meta schema.ClientMeta, parent *schem network := parent.Item.(*Network) if network.Tags != nil { for _, v := range network.Tags { - tag := &Tag{Value: v} + tag := &utils.Tag{Value: v} api.Logger().Debug().Str("network id", network.ID).Msg("streaming network tag") res <- tag } diff --git a/resources/networks.go b/resources/services/networking/networks.go similarity index 94% rename from resources/networks.go rename to resources/services/networking/networks.go index b8afaf4..240db16 100644 --- a/resources/networks.go +++ b/resources/services/networking/networks.go @@ -1,4 +1,4 @@ -package resources +package networking import ( "context" @@ -14,7 +14,7 @@ import ( func Networks() *schema.Table { return &schema.Table{ - Name: "openstack_networks", + Name: "openstack_networking_networks", Resolver: fetchNetworks, Transform: transformers.TransformWithStruct( &Network{}, @@ -34,7 +34,7 @@ func fetchNetworks(ctx context.Context, meta schema.ClientMeta, parent *schema.R api := meta.(*client.Client) - neutron, err := api.GetServiceClient(client.NetworkV2) + networking, err := api.GetServiceClient(client.NetworkingV2) if err != nil { api.Logger().Error().Err(err).Msg("error retrieving client") return err @@ -42,7 +42,7 @@ func fetchNetworks(ctx context.Context, meta schema.ClientMeta, parent *schema.R opts := networks.ListOpts{} - allPages, err := networks.List(neutron, opts).AllPages() + allPages, err := networks.List(networking, opts).AllPages() if err != nil { api.Logger().Error().Err(err).Str("options", format.ToPrettyJSON(opts)).Msg("error listing networks with options") return err diff --git a/resources/ports.go b/resources/services/networking/ports.go similarity index 88% rename from resources/ports.go rename to resources/services/networking/ports.go index 9093cdc..74aa3cc 100644 --- a/resources/ports.go +++ b/resources/services/networking/ports.go @@ -1,9 +1,9 @@ -package resources +package networking import ( "context" - "github.com/apache/arrow/go/v13/arrow" + "github.com/apache/arrow/go/v15/arrow" "github.com/cloudquery/plugin-sdk/v4/schema" "github.com/cloudquery/plugin-sdk/v4/transformers" "github.com/dihedron/cq-plugin-utils/format" @@ -14,7 +14,7 @@ import ( func Ports() *schema.Table { return &schema.Table{ - Name: "openstack_ports", + Name: "openstack_networking_ports", Resolver: fetchPorts, Transform: transformers.TransformWithStruct( &ports.Port{}, @@ -51,7 +51,7 @@ func fetchPorts(ctx context.Context, meta schema.ClientMeta, parent *schema.Reso api := meta.(*client.Client) - neutron, err := api.GetServiceClient(client.NetworkV2) + networking, err := api.GetServiceClient(client.NetworkingV2) if err != nil { api.Logger().Error().Err(err).Msg("error retrieving client") return err @@ -59,7 +59,7 @@ func fetchPorts(ctx context.Context, meta schema.ClientMeta, parent *schema.Reso opts := ports.ListOpts{} - allPages, err := ports.List(neutron, opts).AllPages() + allPages, err := ports.List(networking, opts).AllPages() if err != nil { api.Logger().Error().Err(err).Str("options", format.ToPrettyJSON(opts)).Msg("error listing ports with options") return err @@ -76,8 +76,6 @@ func fetchPorts(ctx context.Context, meta schema.ClientMeta, parent *schema.Reso api.Logger().Debug().Msg("context done, exit") break } - port := port - //api.Logger().Debug().Str("data", format.ToPrettyJSON(port)).Msg("streaming port") api.Logger().Debug().Str("id", port.ID).Msg("streaming port") res <- port } diff --git a/resources/security_group_rules.go b/resources/services/networking/security_group_rules.go similarity index 92% rename from resources/security_group_rules.go rename to resources/services/networking/security_group_rules.go index 8965a20..55beeea 100644 --- a/resources/security_group_rules.go +++ b/resources/services/networking/security_group_rules.go @@ -1,4 +1,4 @@ -package resources +package networking import ( "context" @@ -13,7 +13,7 @@ import ( func SecurityGroupRules() *schema.Table { return &schema.Table{ - Name: "openstack_security_group_rules", + Name: "openstack_networking_security_group_rules", Resolver: fetchSecurityGroupRules, Transform: transformers.TransformWithStruct( &rules.SecGroupRule{}, @@ -40,7 +40,7 @@ func fetchSecurityGroupRules(ctx context.Context, meta schema.ClientMeta, parent api := meta.(*client.Client) - neutron, err := api.GetServiceClient(client.NetworkV2) + networking, err := api.GetServiceClient(client.NetworkingV2) if err != nil { api.Logger().Error().Err(err).Msg("error retrieving client") return err @@ -48,7 +48,7 @@ func fetchSecurityGroupRules(ctx context.Context, meta schema.ClientMeta, parent opts := rules.ListOpts{} - allPages, err := rules.List(neutron, opts).AllPages() + allPages, err := rules.List(networking, opts).AllPages() if err != nil { api.Logger().Error().Err(err).Str("options", format.ToPrettyJSON(opts)).Msg("error listing security group rules with options") return err diff --git a/resources/security_groups.go b/resources/services/networking/security_groups.go similarity index 90% rename from resources/security_groups.go rename to resources/services/networking/security_groups.go index a5ea1f1..ffbada6 100644 --- a/resources/security_groups.go +++ b/resources/services/networking/security_groups.go @@ -1,9 +1,9 @@ -package resources +package networking import ( "context" - "github.com/apache/arrow/go/v13/arrow" + "github.com/apache/arrow/go/v15/arrow" "github.com/cloudquery/plugin-sdk/v4/schema" "github.com/cloudquery/plugin-sdk/v4/transformers" "github.com/dihedron/cq-plugin-utils/format" @@ -14,7 +14,7 @@ import ( func SecurityGroups() *schema.Table { return &schema.Table{ - Name: "openstack_security_groups", + Name: "openstack_networking_security_groups", Resolver: fetchSecurityGroups, Transform: transformers.TransformWithStruct( &groups.SecGroup{}, @@ -41,7 +41,7 @@ func fetchSecurityGroups(ctx context.Context, meta schema.ClientMeta, parent *sc api := meta.(*client.Client) - neutron, err := api.GetServiceClient(client.NetworkV2) + networking, err := api.GetServiceClient(client.NetworkingV2) if err != nil { api.Logger().Error().Err(err).Msg("error retrieving client") return err @@ -49,7 +49,7 @@ func fetchSecurityGroups(ctx context.Context, meta schema.ClientMeta, parent *sc opts := groups.ListOpts{} - allPages, err := groups.List(neutron, opts).AllPages() + allPages, err := groups.List(networking, opts).AllPages() if err != nil { api.Logger().Error().Err(err).Str("options", format.ToPrettyJSON(opts)).Msg("error listing security groups with options") return err diff --git a/resources/time.go b/resources/time.go deleted file mode 100644 index 586f7e8..0000000 --- a/resources/time.go +++ /dev/null @@ -1,69 +0,0 @@ -package resources - -import ( - "fmt" - "strings" - "time" - - "github.com/hashicorp/go-multierror" -) - -type Time time.Time - -var layouts = []string{ - "2006-01-02T15:04:05Z0700", - "2006-01-02T15:04:05.000000", -} - -func (t *Time) Format(format string) string { - if t != nil { - return time.Time(*t).Format(format) - } - return "" -} - -//const layout2 = "2006-01-02T15:04:05Z" -// CCYY-MM-DDThh:mm:ss±hh:mm - -// updated: 2022-10-07T18:56:03Z -// create: 2022-10-07T18:55:42Z -// launched at: 2022-10-07T18:56:02.000000 -// terminated at: 2022-10-07T18:56:02.000000 - -func (t *Time) UnmarshalJSON(b []byte) error { - s := strings.Trim(string(b), "\"") - if s == "null" || s == "" { - *t = Time(time.Time{}) - return nil - } - var errors error - for _, layout := range layouts { - //var t0 time.Time - if t0, err := time.Parse(layout, s); err != nil { - errors = multierror.Append(errors, err) - continue - } else { - *t = Time(t0) - return nil - } - } - return errors -} - -func (t *Time) MarshalJSON() ([]byte, error) { - if (time.Time(*t)).IsZero() { - return []byte("null"), nil - } - return []byte(fmt.Sprintf("\"%s\"", (time.Time(*t)).Format(layouts[0]))), nil -} - -func (t *Time) String() string { - return (time.Time(*t)).String() -} - -func (t *Time) IsZero() bool { - if t == nil { - return true - } - return time.Time(*t).IsZero() -} diff --git a/resources/time_test.go b/resources/time_test.go deleted file mode 100644 index 993ba89..0000000 --- a/resources/time_test.go +++ /dev/null @@ -1,27 +0,0 @@ -package resources - -import ( - "encoding/json" - "testing" -) - -func TestOpenStackTime(t *testing.T) { - - type Test struct { - Time Time - } - - var tests = []string{ - `{"Time": "2022-09-24T13:53:23Z"}`, - `{"Time": "2022-10-11T14:17:48.000000"}`, - } - - for _, test := range tests { - a := Test{} - err := json.Unmarshal([]byte(test), &a) - if err != nil { - t.Fatal(err) - } - t.Logf("after unmarshalling: %q", a.Time.String()) - } -}