diff --git a/1.cfm b/1.cfm
index 1892075..9f0caf1 100644
--- a/1.cfm
+++ b/1.cfm
@@ -7,9 +7,5 @@ test
--->
-
-
-
- Log Out: #request.logout_url#
-
-
+
+
diff --git a/Application.cfc b/Application.cfc
index 5546152..72b0047 100644
--- a/Application.cfc
+++ b/Application.cfc
@@ -15,6 +15,7 @@
+
@@ -24,8 +25,9 @@
+
-
+
@@ -75,7 +77,7 @@
-
+
@@ -151,7 +153,7 @@
-
+
@@ -175,12 +177,11 @@
+
var requestData = GetHttpRequestData();
var headers = requestData.headers;
-
- //writedump(headers); flush;
- if (structKeyExists(headers,"authorization")) {
+ if (structKeyExists(headers,"authorization")) { // аутентификация для клиента ЛК
var authorizationHeader = headers.authorization;
if (authorizationHeader.startsWith("Bearer ")) {
var bearerToken = Mid(authorizationHeader, 8);
@@ -211,7 +212,9 @@
}
result = prefix.filecontent;
var idpUserData=deserializeJson(result);
- request.auth.wz=idpUserData.userInfo.ClientId;//GUID!
+ //request.auth.wz=idpUserData.userInfo.ClientId;//GUID!
+
+
request.auth.login = idpUserData.userInfo.login;
//request.usrUid=idpUserData.userInfo.contactId;//userId; //GUID!
//writedump(idpUserData);abort;
@@ -240,14 +243,14 @@
// Приклеивать query_string как-то не пришлось, браузер сам справляется
// refresh
- idp = new lib.oauth2(this.client_id, this.client_secret, this.auth_endpoint, this.access_token_endpoint, this.redirect_uri);
- resp = idp.refreshAccessTokenRequest(request.auth.refresh_token);
+ var idp = new lib.oauth2(this.client_id, this.client_secret, this.auth_endpoint, this.access_token_endpoint, this.redirect_uri);
+ var resp = idp.refreshAccessTokenRequest(request.auth.refresh_token);
lock scope="application" type="readonly" timeout="1" {
idpCertificate = application.idpCertificate;
}
- auth = parseIdpresponse(resp, idpCertificate, this.client_secret); //все эти сложности из-за опасений насчет многопоточности и блокировок
+ var auth = parseIdpresponse(resp, idpCertificate, this.client_secret); //все эти сложности из-за опасений насчет многопоточности и блокировок
lock scope="session" type="exclusive" timeout="1" {
session.auth = auth;
@@ -264,7 +267,7 @@
session.auth_state = request.auth_state;
}
- idp = new lib.oauth2(this.client_id, this.client_secret, this.auth_endpoint, this.access_token_endpoint, this.redirect_uri);
+ var idp = new lib.oauth2(this.client_id, this.client_secret, this.auth_endpoint, this.access_token_endpoint, this.redirect_uri);
/*
часто появляется ошибка: после неудачного запроса к IDP
в адресной строке браузера остается все, с чем его редиректил IDP,
@@ -278,13 +281,13 @@
try {
//writeOutput("idp.makeAccessTokenRequest");
//writeOutput(getTickCount()-request.startTickCount);
- resp = idp.makeAccessTokenRequest(url.code);
+ var resp = idp.makeAccessTokenRequest(url.code);
lock scope="application" type="readonly" timeout="1" {
idpCertificate = application.idpCertificate;
}
- auth = parseIdpresponse(resp, idpCertificate, this.client_secret); //все эти сложности из-за опасений насчет многопоточности и блокировок
+ var auth = parseIdpresponse(resp, idpCertificate, this.client_secret); //все эти сложности из-за опасений насчет многопоточности и блокировок
lock scope="session" type="exclusive" timeout="1" {
session.auth = auth;
@@ -294,7 +297,7 @@
} catch (e) {echo('
****************** #e.message# : #e.detail# **************');}
} else { //отправляем браузер к IDP
- strURL =idp.buildRedirectToAuthURL({"scope":'openid profile email',"state":request.auth_state,"allow_signup":false});
+ var strURL =idp.buildRedirectToAuthURL({"scope":'openid profile email',"state":request.auth_state,"allow_signup":false});
echo('self-made Auth link (idp) #strURL#
');
location(strUrl,false);
}
@@ -309,6 +312,8 @@
// внимание, здесь подразумевается, что redirect_uri не содержит query_string
// после возвращения от IDP нам нужно будет зачистить сессию SSO, сделаем это по слову logout
}
+
+ request.auth.wz='WZ01348'; //*******************
@@ -472,7 +477,7 @@
}
}
- private struct function parseIdpresponse(struct resp, string certificate, string jwt_secret) {
+ private struct function parseIdpResponse(struct resp, string certificate, string jwt_secret) {
var auth = structNew("linked");
var data = deserializeJson(arguments.resp.content);
diff --git a/etc/2do.txt b/etc/2do.txt
new file mode 100644
index 0000000..d422f00
--- /dev/null
+++ b/etc/2do.txt
@@ -0,0 +1,6 @@
+корректный период
+другие WZ
+? full join
+детализация - для S3 это бакеты
+
+
diff --git a/etc/db/billing_schema.sql b/etc/db/billing_schema.sql
new file mode 100644
index 0000000..caaf1d3
--- /dev/null
+++ b/etc/db/billing_schema.sql
@@ -0,0 +1,595 @@
+база rpt сделана из базы billing (название изменено, чтобы избежать путаницы)
+-- удалены последовательности, переназначены владельцы и права
+-- удалены внешние ключи
+
+-- создать роль dbo (владелец), без connect
+-- создать пользователя nifi, с правом логина
+-- создать пользователя appserver, с правом логина
+-- дать права пользователю nifi на схемы и таблицы
+-- дать права пользователю appserver на схемы и таблицы на чтение
+
+SET ROLE postgres;
+
+CREATE SCHEMA IF NOT EXISTS s3billing;
+CREATE SCHEMA IF NOT EXISTS ngcloud_ru;
+
+ALTER SCHEMA s3billing OWNER TO dbo;
+ALTER SCHEMA ngcloud_ru OWNER TO dbo;
+ALTER DATABASE rpt SET search_path TO s3billing, ngcloud_ru;
+
+ALTER DEFAULT PRIVILEGES FOR ROLE dbo, postgres GRANT ALL ON TABLES TO nifi;
+ALTER DEFAULT PRIVILEGES FOR ROLE dbo, postgres GRANT SELECT ON TABLES TO appserver;
+
+SET ROLE dbo;
+
+GRANT USAGE ON SCHEMA s3billing TO appserver,nifi;
+GRANT USAGE ON SCHEMA ngcloud_ru TO appserver,nifi;
+
+GRANT ALL ON ALL TABLES IN SCHEMA s3billing TO nifi;
+GRANT SELECT ON ALL TABLES IN SCHEMA s3billing TO appserver;
+
+GRANT ALL ON ALL TABLES IN SCHEMA ngcloud_ru TO nifi;
+GRANT SELECT ON ALL TABLES IN SCHEMA ngcloud_ru TO appserver;
+
+--GRANT ALL ON ALL SEQUENCES IN SCHEMA s3billing TO appserver,nifi;
+--GRANT ALL ON ALL SEQUENCES IN SCHEMA ngcloud_ru TO appserver,nifi;
+
+
+--ALTER DEFAULT PRIVILEGES FOR ROLE dbo GRANT ALL ON SEQUENCES TO appserver,nifi;
+
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 16.0
+-- Dumped by pg_dump version 16.4
+
+-- Started on 2025-09-15 09:50:58
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+SET default_tablespace = '';
+
+SET default_table_access_method = heap;
+
+--
+-- TOC entry 230 (class 1259 OID 2160668)
+-- Name: bucket_info; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+DROP TABLE IF EXISTS s3billing.bucket_info;
+CREATE TABLE s3billing.bucket_info (
+ id integer NOT NULL,
+ bucket_id character varying(255) NOT NULL,
+ name character varying(255) NOT NULL,
+ marker character varying(255) NOT NULL,
+ placement_id bigint DEFAULT 0 NOT NULL
+);
+
+
+
+
+--
+-- TOC entry 226 (class 1259 OID 2160642)
+-- Name: bucket_stat; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+DROP TABLE IF EXISTS s3billing.bucket_stat;
+CREATE TABLE s3billing.bucket_stat (
+ bucket_id bigint,
+ num_shards bigint NOT NULL,
+ tenant character varying(255) DEFAULT NULL::character varying,
+ zone_group bigint NOT NULL,
+ placement_id bigint NOT NULL,
+ explicit_placement_data_pool character varying(255) DEFAULT NULL::character varying,
+ explicit_placement_data_extra_pool character varying(255) DEFAULT NULL::character varying,
+ explicit_placement_index_pool character varying(255) DEFAULT NULL::character varying,
+ index_type_id bigint NOT NULL,
+ versioned boolean DEFAULT false,
+ versioning_enabled boolean DEFAULT false,
+ object_lock_enabled boolean DEFAULT false,
+ mfa_enabled boolean DEFAULT false,
+ owner character varying(255) NOT NULL,
+ bucket_quota_enabled boolean DEFAULT false,
+ bucket_quota_check_on_raw boolean DEFAULT false,
+ bucket_quota_max_size bigint NOT NULL,
+ bucket_quota_max_size_kb bigint NOT NULL,
+ bucket_quota_max_objects bigint NOT NULL,
+ usage_rgw_main_size bigint NOT NULL,
+ usage_rgw_main_size_actual bigint NOT NULL,
+ usage_rgw_main_size_utilized bigint NOT NULL,
+ usage_rgw_main_size_kb bigint NOT NULL,
+ usage_rgw_main_size_kb_actual bigint NOT NULL,
+ usage_rgw_main_size_kb_utilized bigint NOT NULL,
+ usage_rgw_main_num_objects bigint NOT NULL,
+ usage_rgw_multimeta_size bigint,
+ usage_rgw_multimeta_size_actual bigint,
+ usage_rgw_multimeta_size_utilized bigint,
+ usage_rgw_multimeta_size_kb bigint,
+ usage_rgw_multimeta_size_kb_actual bigint,
+ usage_rgw_multimeta_size_kb_utilized bigint,
+ usage_rgw_multimeta_num_objects bigint,
+ creation_time timestamp without time zone NOT NULL,
+ mtime timestamp without time zone NOT NULL,
+ timestamp_addition timestamp without time zone DEFAULT date_trunc('hour'::text, CURRENT_TIMESTAMP)
+);
+
+--
+-- TOC entry 245 (class 1259 OID 2160763)
+-- Name: category; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+DROP TABLE IF EXISTS s3billing.category;
+CREATE TABLE s3billing.category (
+ id integer NOT NULL,
+ name character varying(255) NOT NULL
+);
+
+--
+-- TOC entry 225 (class 1259 OID 2160635)
+-- Name: goose_db_version; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+DROP TABLE IF EXISTS s3billing.goose_db_version;
+CREATE TABLE s3billing.goose_db_version (
+ id integer NOT NULL,
+ version_id bigint NOT NULL,
+ is_applied boolean NOT NULL,
+ tstamp timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+--
+-- TOC entry 234 (class 1259 OID 2160684)
+-- Name: index_type; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+DROP TABLE IF EXISTS index_type;
+CREATE TABLE s3billing.index_type (
+ id integer NOT NULL,
+ name character varying(255) NOT NULL
+);
+
+
+--
+-- TOC entry 232 (class 1259 OID 2160677)
+-- Name: placement; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+DROP TABLE IF EXISTS s3billing.placement;
+CREATE TABLE s3billing.placement (
+ id integer NOT NULL,
+ name character varying(255) NOT NULL
+);
+
+
+
+--
+-- TOC entry 239 (class 1259 OID 2160705)
+-- Name: usage_bucket_by_user; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+DROP TABLE IF EXISTS s3billing.usage_bucket_by_user;
+CREATE TABLE s3billing.usage_bucket_by_user (
+ bucketid bigint,
+ "time" timestamp without time zone NOT NULL,
+ bytes_sent bigint NOT NULL,
+ bytes_received bigint NOT NULL,
+ ops bigint NOT NULL,
+ successful_ops bigint NOT NULL,
+ date_start timestamp without time zone NOT NULL,
+ date_end timestamp without time zone NOT NULL,
+ user_id bigint NOT NULL,
+ category_id bigint NOT NULL
+);
+
+
+--
+-- TOC entry 238 (class 1259 OID 2160698)
+-- Name: usage_stat_summary; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+DROP TABLE IF EXISTS s3billing.usage_stat_summary;
+CREATE TABLE s3billing.usage_stat_summary (
+ id integer NOT NULL,
+ userid character varying(255) NOT NULL,
+ category character varying(255) NOT NULL,
+ bytes_sent bigint NOT NULL,
+ bytes_received bigint NOT NULL,
+ ops bigint NOT NULL,
+ successful_ops bigint NOT NULL,
+ date_start timestamp without time zone NOT NULL,
+ date_end timestamp without time zone NOT NULL
+);
+
+
+--
+-- TOC entry 236 (class 1259 OID 2160691)
+-- Name: usage_stat_total; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+DROP TABLE IF EXISTS s3billing.usage_stat_total;
+CREATE TABLE s3billing.usage_stat_total (
+ id integer NOT NULL,
+ userid character varying(255) NOT NULL,
+ bytes_sent bigint NOT NULL,
+ bytes_received bigint NOT NULL,
+ ops bigint NOT NULL,
+ successful_ops bigint NOT NULL,
+ date_start timestamp without time zone NOT NULL,
+ date_end timestamp without time zone NOT NULL
+);
+
+--
+-- TOC entry 243 (class 1259 OID 2160751)
+-- Name: user_info; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+DROP TABLE IF EXISTS s3billing.user_info;
+CREATE TABLE s3billing.user_info (
+ id integer NOT NULL,
+ name character varying(255) NOT NULL,
+ owner character varying(255) NOT NULL
+);
+
+
+--
+-- TOC entry 241 (class 1259 OID 2160712)
+-- Name: user_quota_bucket; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+DROP TABLE IF EXISTS s3billing.user_quota_bucket;
+CREATE TABLE s3billing.user_quota_bucket (
+ id integer NOT NULL,
+ userid character varying(255) NOT NULL,
+ enabled boolean DEFAULT false,
+ check_on_raw boolean DEFAULT false,
+ max_size bigint NOT NULL,
+ max_size_kb bigint NOT NULL,
+ max_objects bigint NOT NULL
+);
+
+
+--
+-- TOC entry 228 (class 1259 OID 2160661)
+-- Name: zone_group; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+DROP TABLE IF EXISTS s3billing.zone_group;
+CREATE TABLE s3billing.zone_group (
+ id integer NOT NULL,
+ name uuid NOT NULL
+);
+
+--
+-- TOC entry 3278 (class 2606 OID 2160675)
+-- Name: bucket_info bucket_info_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.bucket_info
+ ADD CONSTRAINT bucket_info_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3273 (class 2606 OID 2476484)
+-- Name: bucket_stat bucket_stat_unique; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+--ALTER TABLE ONLY s3billing.bucket_stat
+-- ADD CONSTRAINT bucket_stat_unique UNIQUE (bucket_id, placement_id, timestamp_addition);
+
+ALTER TABLE ONLY s3billing.bucket_stat
+ ADD CONSTRAINT bucket_stat_pkey PRIMARY KEY (bucket_id, placement_id, timestamp_addition);
+
+
+--
+-- TOC entry 3298 (class 2606 OID 2160768)
+-- Name: category category_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.category
+ ADD CONSTRAINT category_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3270 (class 2606 OID 2160640)
+-- Name: goose_db_version goose_db_version_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.goose_db_version
+ ADD CONSTRAINT goose_db_version_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3284 (class 2606 OID 2160689)
+-- Name: index_type index_type_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.index_type
+ ADD CONSTRAINT index_type_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3282 (class 2606 OID 2160682)
+-- Name: placement placement_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.placement
+ ADD CONSTRAINT placement_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3290 (class 2606 OID 2476705)
+-- Name: usage_bucket_by_user usage_bucket_by_user_unique; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+--ALTER TABLE ONLY s3billing.usage_bucket_by_user
+-- ADD CONSTRAINT usage_bucket_by_user_unique UNIQUE (bucketid, date_start, date_end, user_id, category_id);
+ALTER TABLE ONLY s3billing.usage_bucket_by_user
+ ADD CONSTRAINT usage_bucket_by_user_pkey PRIMARY KEY (bucketid, date_start, date_end, user_id, category_id);
+
+
+--
+-- TOC entry 3288 (class 2606 OID 2160703)
+-- Name: usage_stat_summary usage_stat_summary_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.usage_stat_summary
+ ADD CONSTRAINT usage_stat_summary_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3286 (class 2606 OID 2160696)
+-- Name: usage_stat_total usage_stat_total_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.usage_stat_total
+ ADD CONSTRAINT usage_stat_total_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3295 (class 2606 OID 2160758)
+-- Name: user_info user_info_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.user_info
+ ADD CONSTRAINT user_info_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3292 (class 2606 OID 2160719)
+-- Name: user_quota_bucket user_quota_bucket_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.user_quota_bucket
+ ADD CONSTRAINT user_quota_bucket_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3275 (class 2606 OID 2160666)
+-- Name: zone_group zone_group_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.zone_group
+ ADD CONSTRAINT zone_group_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3276 (class 1259 OID 2474077)
+-- Name: bucket_info_name_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
+--
+
+CREATE INDEX bucket_info_name_idx ON s3billing.bucket_info USING btree (name);
+
+
+--
+-- TOC entry 3279 (class 1259 OID 2474078)
+-- Name: bucket_info_placement_id_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
+--
+
+CREATE INDEX bucket_info_placement_id_idx ON s3billing.bucket_info USING btree (placement_id);
+
+
+--
+-- TOC entry 3271 (class 1259 OID 2474094)
+-- Name: bucket_stat_owner_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
+--
+
+CREATE INDEX bucket_stat_owner_idx ON s3billing.bucket_stat USING btree (owner);
+
+
+--
+-- TOC entry 3296 (class 1259 OID 2474445)
+-- Name: category_name_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
+--
+
+CREATE UNIQUE INDEX category_name_idx ON s3billing.category USING btree (name);
+
+
+--
+-- TOC entry 3280 (class 1259 OID 2474468)
+-- Name: placement_name_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
+--
+
+CREATE UNIQUE INDEX placement_name_idx ON s3billing.placement USING btree (name);
+
+
+--
+-- TOC entry 3293 (class 1259 OID 2474438)
+-- Name: user_info_name_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
+--
+
+CREATE INDEX user_info_name_idx ON s3billing.user_info USING btree (name);
+
+
+
+-- Completed on 2025-09-15 09:50:59
+
+--
+-- PostgreSQL database dump complete
+--
+
+-------------------------------------------------------------------------------------
+-------------------------------------------------------------------------------------
+-------------------------------------------------------------------------------------
+
+DROP TABLE IF EXISTS ngcloud_ru.capacity_resource;
+CREATE TABLE ngcloud_ru.capacity_resource (
+ vdc_id uuid NOT NULL,
+ "timestamp" timestamp with time zone NOT NULL,
+ cpu_allocated integer NOT NULL,
+ cpu_limit integer NOT NULL,
+ cpu_reserved integer NOT NULL,
+ cpu_used integer NOT NULL,
+ cpu_speed integer NOT NULL,
+ mem_allocated integer NOT NULL,
+ mem_limit integer NOT NULL,
+ mem_reserved integer NOT NULL,
+ mem_used integer NOT NULL
+);
+
+--
+-- TOC entry 223 (class 1259 OID 1893993)
+-- Name: capacity_storage; Type: TABLE; Schema: ngcloud_ru; Owner: vc_billing
+--
+DROP TABLE IF EXISTS ngcloud_ru.capacity_storage;
+CREATE TABLE ngcloud_ru.capacity_storage (
+ vdc_id uuid NOT NULL,
+ storage_profile_types_id integer NOT NULL,
+ "timestamp" timestamp with time zone NOT NULL,
+ id uuid NOT NULL,
+ "limit" integer NOT NULL,
+ used integer NOT NULL
+);
+
+--
+-- TOC entry 220 (class 1259 OID 1893965)
+-- Name: storage_profile_types; Type: TABLE; Schema: ngcloud_ru; Owner: vc_billing
+--
+DROP TABLE IF EXISTS ngcloud_ru.storage_profile_types;
+CREATE TABLE ngcloud_ru.storage_profile_types (
+ id integer NOT NULL,
+ name character varying(255) NOT NULL
+);
+
+--
+-- TOC entry 218 (class 1259 OID 1893959)
+-- Name: tenant; Type: TABLE; Schema: ngcloud_ru; Owner: vc_billing
+--
+DROP TABLE IF EXISTS ngcloud_ru.tenant;
+CREATE TABLE ngcloud_ru.tenant (
+ id uuid NOT NULL,
+ name character varying(255) NOT NULL,
+ wzcode bigint
+);
+
+
+--
+-- TOC entry 221 (class 1259 OID 1893973)
+-- Name: vdc; Type: TABLE; Schema: ngcloud_ru; Owner: vc_billing
+--
+DROP TABLE IF EXISTS ngcloud_ru.vdc;
+CREATE TABLE ngcloud_ru.vdc (
+ id uuid NOT NULL,
+ tenant_id uuid NOT NULL,
+ name character varying(255) NOT NULL
+);
+
+
+
+
+
+--
+-- TOC entry 3255 (class 2606 OID 1893987)
+-- Name: capacity_resource capacity_resource_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.capacity_resource
+ ADD CONSTRAINT capacity_resource_pkey PRIMARY KEY (vdc_id, "timestamp");
+
+
+--
+-- TOC entry 3257 (class 2606 OID 1893997)
+-- Name: capacity_storage capacity_storage_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.capacity_storage
+ ADD CONSTRAINT capacity_storage_pkey PRIMARY KEY (vdc_id, id, "timestamp");
+
+
+--
+-- TOC entry 3249 (class 2606 OID 1893972)
+-- Name: storage_profile_types storage_profile_types_name_key; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.storage_profile_types
+ ADD CONSTRAINT storage_profile_types_name_key UNIQUE (name);
+
+
+--
+-- TOC entry 3251 (class 2606 OID 1893970)
+-- Name: storage_profile_types storage_profile_types_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.storage_profile_types
+ ADD CONSTRAINT storage_profile_types_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3247 (class 2606 OID 1893963)
+-- Name: tenant tenant_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.tenant
+ ADD CONSTRAINT tenant_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3253 (class 2606 OID 1893977)
+-- Name: vdc vdc_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.vdc
+ ADD CONSTRAINT vdc_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3259 (class 2606 OID 1893988)
+-- Name: capacity_resource capacity_resource_vdc_id_fkey; Type: FK CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+--ALTER TABLE ONLY ngcloud_ru.capacity_resource
+-- ADD CONSTRAINT capacity_resource_vdc_id_fkey FOREIGN KEY (vdc_id) REFERENCES ngcloud_ru.vdc(id) ON DELETE CASCADE;
+
+
+--
+-- TOC entry 3260 (class 2606 OID 1894003)
+-- Name: capacity_storage capacity_storage_storage_profile_types_id_fkey; Type: FK CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+--ALTER TABLE ONLY ngcloud_ru.capacity_storage
+-- ADD CONSTRAINT capacity_storage_storage_profile_types_id_fkey FOREIGN KEY (storage_profile_types_id) REFERENCES ngcloud_ru.storage_profile_types(id);
+
+
+--
+-- TOC entry 3261 (class 2606 OID 1893998)
+-- Name: capacity_storage capacity_storage_vdc_id_fkey; Type: FK CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+--ALTER TABLE ONLY ngcloud_ru.capacity_storage
+-- ADD CONSTRAINT capacity_storage_vdc_id_fkey FOREIGN KEY (vdc_id) REFERENCES ngcloud_ru.vdc(id) ON DELETE CASCADE;
+
+
+--
+-- TOC entry 3258 (class 2606 OID 1893978)
+-- Name: vdc vdc_tenant_id_fkey; Type: FK CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+--ALTER TABLE ONLY ngcloud_ru.vdc
+-- ADD CONSTRAINT vdc_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES ngcloud_ru.tenant(id);
+
+
+-- Completed on 2025-09-15 09:53:18
+
+--
+-- PostgreSQL database dump complete
+--
+
diff --git a/etc/db/billing_schema2.sql b/etc/db/billing_schema2.sql
new file mode 100644
index 0000000..71bef00
--- /dev/null
+++ b/etc/db/billing_schema2.sql
@@ -0,0 +1,1766 @@
+--
+-- PostgreSQL database dump
+--
+
+\restrict M18FnaokuZFKQZjWu9az6dzOO6o2cSlpJgAocs2PXfRbmzHVcXEXaiZZcaOPZko
+
+-- Dumped from database version 16.0
+-- Dumped by pg_dump version 17.6
+
+-- Started on 2025-10-24 14:30:46
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET transaction_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+--
+-- TOC entry 6 (class 2615 OID 1891106)
+-- Name: def; Type: SCHEMA; Schema: -; Owner: dbo
+--
+
+CREATE SCHEMA def;
+
+
+ALTER SCHEMA def OWNER TO dbo;
+
+--
+-- TOC entry 7 (class 2615 OID 1891160)
+-- Name: ngcloud_ru; Type: SCHEMA; Schema: -; Owner: vc_billing
+--
+
+CREATE SCHEMA ngcloud_ru;
+
+
+ALTER SCHEMA ngcloud_ru OWNER TO vc_billing;
+
+--
+-- TOC entry 8 (class 2615 OID 2160630)
+-- Name: s3billing; Type: SCHEMA; Schema: -; Owner: s3billing
+--
+
+CREATE SCHEMA s3billing;
+
+
+ALTER SCHEMA s3billing OWNER TO s3billing;
+
+--
+-- TOC entry 246 (class 1255 OID 2426393)
+-- Name: billing(timestamp with time zone, timestamp with time zone, character varying); Type: FUNCTION; Schema: s3billing; Owner: dsorokin
+--
+
+CREATE FUNCTION s3billing.billing(_ds timestamp with time zone, _df timestamp with time zone, _user character varying) RETURNS TABLE(bucket_name character varying, placement character varying, size numeric, put numeric, get numeric, bytes_sent numeric)
+ LANGUAGE plpgsql
+ AS $$
+BEGIN
+SELECT
+ s3billing.bucket_info.name AS bucket_name
+ ,s3billing.placement.name AS placement
+ ,coalesce(round(sum(usage_rgw_main_size_actual)/(24*(SELECT DATE_PART('day', (_ds-_df))))),0) AS size
+ ,coalesce(s2.get, 0) AS get
+ ,coalesce(s2.put, 0) AS put
+ ,coalesce(s2.bytes_sent, 0) as bytes_sent
+FROM s3billing.bucket_stat
+INNER JOIN s3billing.placement ON s3billing.bucket_stat.placement_id=s3billing.placement.id
+INNER JOIN s3billing.bucket_info ON s3billing.bucket_stat.bucket_id=s3billing.bucket_info.id
+LEFT JOIN (
+ SELECT
+ s1.bucket_id AS bucket_id
+ ,s1.bucket_name AS bucket_name
+ ,s1.placement AS placement
+ ,coalesce(sum(s1.get) ,0) AS get
+ ,coalesce(sum(s1.put) ,0) AS put
+ ,coalesce(sum(s1.bytes_sent), 0) AS bytes_sent
+ FROM (
+ SELECT
+ s3billing.bucket_info.id AS bucket_id
+ ,s3billing.bucket_info.name AS bucket_name
+ ,s3billing.placement.name AS placement
+ ,(CASE
+ WHEN ( s3billing.category.name LIKE 'get%'
+ OR s3billing.category.name LIKE 'head%'
+ OR s3billing.category.name LIKE 'options%'
+ ) THEN coalesce(sum(ops), 0)
+ END) AS get
+ ,(CASE
+ WHEN ( s3billing.category.name LIKE 'put%'
+ OR s3billing.category.name LIKE 'post%'
+ OR s3billing.category.name LIKE 'patch%'
+ OR s3billing.category.name LIKE 'list%'
+ ) THEN coalesce(sum(ops), 0)
+ END) AS put
+ ,coalesce(sum(usage_bucket_by_user.bytes_sent), 0) AS bytes_sent
+ FROM
+ s3billing.usage_bucket_by_user
+ INNER JOIN s3billing.bucket_info ON s3billing.usage_bucket_by_user.bucketid = s3billing.bucket_info.id
+ INNER JOIN s3billing.placement ON s3billing.bucket_info.placement_id = s3billing.placement.id
+ INNER JOIN s3billing.user_info ON s3billing.usage_bucket_by_user.user_id = s3billing.user_info.id
+ INNER JOIN s3billing.category ON s3billing.usage_bucket_by_user.category_id = s3billing.category.id
+
+ WHERE
+ s3billing.user_info.name=_user
+ AND s3billing.usage_bucket_by_user.time >= _ds
+ AND s3billing.usage_bucket_by_user.time < _df
+ GROUP BY
+ s3billing.bucket_info.name
+ ,s3billing.placement.name
+ ,s3billing.category.name
+ ,s3billing.bucket_info.id
+ ) AS s1
+ GROUP BY
+ s1.bucket_name
+ ,s1.bucket_id
+ ,s1.placement
+ ORDER BY
+ s1.placement
+ ,s1.bucket_name
+) AS s2 ON s2.bucket_id = s3billing.bucket_stat.bucket_id
+WHERE owner=_user
+ AND timestamp_addition >= _ds
+ AND timestamp_addition < _df
+GROUP BY
+ s3billing.bucket_info.name
+ ,s3billing.placement.name
+ ,s3billing.bucket_stat.bucket_id
+ ,s2.get
+ ,s2.put
+ ,s2.bytes_sent
+ORDER BY
+ s3billing.placement.name
+,s3billing.bucket_info.name
+;
+END
+$$;
+
+
+ALTER FUNCTION s3billing.billing(_ds timestamp with time zone, _df timestamp with time zone, _user character varying) OWNER TO dsorokin;
+
+--
+-- TOC entry 260 (class 1255 OID 2434574)
+-- Name: billing_per_user(character varying, character varying, character varying); Type: FUNCTION; Schema: s3billing; Owner: dsorokin
+--
+
+CREATE FUNCTION s3billing.billing_per_user(_ds character varying, _df character varying, _user character varying) RETURNS TABLE(bucket_name character varying, placement character varying, size numeric, get numeric, put numeric, bytes_sent numeric)
+ LANGUAGE plpgsql
+ AS $$
+BEGIN
+RETURN QUERY
+
+SELECT
+ s3billing.bucket_info.name AS bucket_name
+ ,s3billing.placement.name AS placement
+ ,coalesce(round(sum(usage_rgw_main_size_actual)/
+ (SELECT (DATE_PART('day',
+ ((TO_TIMESTAMP(_df, 'YYYY-MM-DD HH24:MI:SS'))
+ -TO_TIMESTAMP(_ds, 'YYYY-MM-DD HH24:MI:SS'))
+ )*24+
+ DATE_PART('hour',
+ ((TO_TIMESTAMP(_df, 'YYYY-MM-DD HH24:MI:SS'))
+ -TO_TIMESTAMP(_ds, 'YYYY-MM-DD HH24:MI:SS'))
+ )))
+
+ )::numeric,0) AS size
+ ,coalesce(s2.get, 0) AS get
+ ,coalesce(s2.put, 0) AS put
+ ,coalesce(s2.bytes_sent, 0) as bytes_sent
+FROM s3billing.bucket_stat
+INNER JOIN s3billing.placement ON s3billing.bucket_stat.placement_id=s3billing.placement.id
+INNER JOIN s3billing.bucket_info ON s3billing.bucket_stat.bucket_id=s3billing.bucket_info.id
+LEFT JOIN (
+ SELECT
+ s1.bucket_id AS bucket_id
+ ,s1.bucket_name AS bucket_name
+ ,s1.placement AS placement
+ ,coalesce(sum(s1.get) ,0) AS get
+ ,coalesce(sum(s1.put) ,0) AS put
+ ,coalesce(sum(s1.bytes_sent), 0) AS bytes_sent
+ FROM (
+ SELECT
+ s3billing.bucket_info.id AS bucket_id
+ ,s3billing.bucket_info.name AS bucket_name
+ ,s3billing.placement.name AS placement
+ ,(CASE
+ WHEN ( s3billing.category.name LIKE 'get%'
+ OR s3billing.category.name LIKE 'head%'
+ OR s3billing.category.name LIKE 'options%'
+ ) THEN coalesce(sum(ops), 0)
+ END) AS get
+ ,(CASE
+ WHEN ( s3billing.category.name LIKE 'put%'
+ OR s3billing.category.name LIKE 'post%'
+ OR s3billing.category.name LIKE 'patch%'
+ OR s3billing.category.name LIKE 'list%'
+ ) THEN coalesce(sum(ops), 0)
+ END) AS put
+ ,coalesce(sum(usage_bucket_by_user.bytes_sent), 0) AS bytes_sent
+
+ FROM
+ s3billing.usage_bucket_by_user
+ INNER JOIN s3billing.bucket_info ON s3billing.usage_bucket_by_user.bucketid = s3billing.bucket_info.id
+ INNER JOIN s3billing.placement ON s3billing.bucket_info.placement_id = s3billing.placement.id
+ INNER JOIN s3billing.user_info ON s3billing.usage_bucket_by_user.user_id = s3billing.user_info.id
+ INNER JOIN s3billing.category ON s3billing.usage_bucket_by_user.category_id = s3billing.category.id
+
+ WHERE
+ s3billing.user_info.name=_user
+ AND s3billing.usage_bucket_by_user.time >=TO_TIMESTAMP(_ds, 'YYYY-MM-DD HH24:MI:SS')
+ AND s3billing.usage_bucket_by_user.time < TO_TIMESTAMP(_df, 'YYYY-MM-DD HH24:MI:SS')
+ GROUP BY
+ s3billing.bucket_info.name
+ ,s3billing.placement.name
+ ,s3billing.category.name
+ ,s3billing.bucket_info.id
+ ) AS s1
+
+ GROUP BY
+ s1.bucket_name
+ ,s1.bucket_id
+ ,s1.placement
+
+ ORDER BY
+ s1.placement
+ ,s1.bucket_name
+
+) AS s2 ON s2.bucket_id = s3billing.bucket_stat.bucket_id
+WHERE owner=_user
+ AND timestamp_addition >= TO_TIMESTAMP(_ds, 'YYYY-MM-DD HH24:MI:SS')
+ AND timestamp_addition < TO_TIMESTAMP(_df, 'YYYY-MM-DD HH24:MI:SS')
+GROUP BY
+ s3billing.bucket_info.name
+ ,s3billing.placement.name
+ ,s3billing.bucket_stat.bucket_id
+ ,s2.get
+ ,s2.put
+ ,s2.bytes_sent
+ORDER BY
+ s3billing.placement.name
+,s3billing.bucket_info.name
+;
+END;
+$$;
+
+
+ALTER FUNCTION s3billing.billing_per_user(_ds character varying, _df character varying, _user character varying) OWNER TO dsorokin;
+
+--
+-- TOC entry 261 (class 1255 OID 2435525)
+-- Name: billing_per_user_fix_pl(character varying, character varying, character varying); Type: FUNCTION; Schema: s3billing; Owner: dsorokin
+--
+
+CREATE FUNCTION s3billing.billing_per_user_fix_pl(_ds character varying, _df character varying, _user character varying) RETURNS TABLE(bucket_name character varying, placement character varying, size numeric, get numeric, put numeric, bytes_sent numeric)
+ LANGUAGE plpgsql
+ AS $$
+BEGIN
+RETURN QUERY
+
+SELECT
+ s3billing.bucket_info.name AS bucket_name,
+ (case
+ when ( s3billing.placement.name = 'default-placement') then 'HOT'
+ WHEN ( not s3billing.placement.name = 'default-placement' ) THEN s3billing.placement.name
+ end
+ ) as placement,
+ coalesce(round(sum(usage_rgw_main_size_actual)/
+ (SELECT (DATE_PART('day',
+ ((TO_TIMESTAMP(_df, 'YYYY-MM-DD HH24:MI:SS'))
+ -TO_TIMESTAMP(_ds, 'YYYY-MM-DD HH24:MI:SS'))
+ )*24+
+ DATE_PART('hour',
+ ((TO_TIMESTAMP(_df, 'YYYY-MM-DD HH24:MI:SS'))
+ -TO_TIMESTAMP(_ds, 'YYYY-MM-DD HH24:MI:SS'))
+ )))
+
+ )::numeric,0) AS size
+ ,coalesce(s2.get, 0) AS get
+ ,coalesce(s2.put, 0) AS put
+ ,coalesce(s2.bytes_sent, 0) as bytes_sent
+FROM s3billing.bucket_stat
+INNER JOIN s3billing.placement ON s3billing.bucket_stat.placement_id=s3billing.placement.id
+INNER JOIN s3billing.bucket_info ON s3billing.bucket_stat.bucket_id=s3billing.bucket_info.id
+LEFT JOIN (
+ SELECT
+ s1.bucket_id AS bucket_id
+ ,s1.bucket_name AS bucket_name,
+ (case
+ when ( s1.placement = 'default-placement') then 'HOT'
+ WHEN ( not s1.placement = 'default-placement' ) THEN s1.placement
+ end
+ ) as placement
+ ,coalesce(sum(s1.get) ,0) AS get
+ ,coalesce(sum(s1.put) ,0) AS put
+ ,coalesce(sum(s1.bytes_sent), 0) AS bytes_sent
+ FROM (
+ SELECT
+ s3billing.bucket_info.id AS bucket_id
+ ,s3billing.bucket_info.name AS bucket_name
+ ,(case
+ when ( s3billing.placement.name = 'default-placement') then 'HOT'
+ WHEN ( not s3billing.placement.name = 'default-placement' ) THEN s3billing.placement.name
+ end
+ ) as placement
+ ,(CASE
+ WHEN ( s3billing.category.name LIKE 'get%'
+ OR s3billing.category.name LIKE 'head%'
+ OR s3billing.category.name LIKE 'options%'
+ ) THEN coalesce(sum(ops), 0)
+ END) AS get
+ ,(CASE
+ WHEN ( s3billing.category.name LIKE 'put%'
+ OR s3billing.category.name LIKE 'post%'
+ OR s3billing.category.name LIKE 'patch%'
+ OR s3billing.category.name LIKE 'list%'
+ ) THEN coalesce(sum(ops), 0)
+ END) AS put
+ ,coalesce(sum(usage_bucket_by_user.bytes_sent), 0) AS bytes_sent
+
+ FROM
+ s3billing.usage_bucket_by_user
+ INNER JOIN s3billing.bucket_info ON s3billing.usage_bucket_by_user.bucketid = s3billing.bucket_info.id
+ INNER JOIN s3billing.placement ON s3billing.bucket_info.placement_id = s3billing.placement.id
+ INNER JOIN s3billing.user_info ON s3billing.usage_bucket_by_user.user_id = s3billing.user_info.id
+ INNER JOIN s3billing.category ON s3billing.usage_bucket_by_user.category_id = s3billing.category.id
+
+ WHERE
+ s3billing.user_info.name=_user
+ AND s3billing.usage_bucket_by_user.time >=TO_TIMESTAMP(_ds, 'YYYY-MM-DD HH24:MI:SS')
+ AND s3billing.usage_bucket_by_user.time < TO_TIMESTAMP(_df, 'YYYY-MM-DD HH24:MI:SS')
+ GROUP BY
+ s3billing.bucket_info.name
+ ,s3billing.placement.name
+ ,s3billing.category.name
+ ,s3billing.bucket_info.id
+ ) AS s1
+
+ GROUP BY
+ s1.bucket_name
+ ,s1.bucket_id
+ ,s1.placement
+
+ ORDER BY
+ s1.placement
+ ,s1.bucket_name
+
+) AS s2 ON s2.bucket_id = s3billing.bucket_stat.bucket_id
+WHERE owner=_user
+ AND timestamp_addition >= TO_TIMESTAMP(_ds, 'YYYY-MM-DD HH24:MI:SS')
+ AND timestamp_addition < TO_TIMESTAMP(_df, 'YYYY-MM-DD HH24:MI:SS')
+GROUP BY
+ s3billing.bucket_info.name
+ ,s3billing.placement.name
+ ,s3billing.bucket_stat.bucket_id
+ ,s2.get
+ ,s2.put
+ ,s2.bytes_sent
+ORDER BY
+ s3billing.placement.name
+,s3billing.bucket_info.name
+;
+END;
+$$;
+
+
+ALTER FUNCTION s3billing.billing_per_user_fix_pl(_ds character varying, _df character varying, _user character varying) OWNER TO dsorokin;
+
+--
+-- TOC entry 263 (class 1255 OID 2437728)
+-- Name: billing_per_user_fix_pl_sv(character varying, character varying, character varying); Type: FUNCTION; Schema: s3billing; Owner: postgres
+--
+
+CREATE FUNCTION s3billing.billing_per_user_fix_pl_sv(ds character varying, df character varying, _user character varying) RETURNS TABLE(bucket_name character varying, placement character varying, size numeric, get numeric, put numeric, bytes_sent numeric)
+ LANGUAGE plpgsql
+ AS $$
+
+DECLARE
+ _ds TIMESTAMP;
+ _df TIMESTAMP;
+ _days INT;
+ _hours INT;
+
+BEGIN
+SELECT TO_TIMESTAMP(ds, 'YYYY-MM-DD HH24:MI:SS') INTO _ds;
+SELECT TO_TIMESTAMP(df, 'YYYY-MM-DD HH24:MI:SS') INTO _df;
+SELECT DATE_PART('day', _df - _ds) INTO _days;
+SELECT CEIL(EXTRACT(EPOCH FROM (_df - _ds))/3600) INTO _hours;
+
+RETURN QUERY
+
+SELECT
+ s3billing.bucket_info.name AS bucket_name,
+ (CASE
+ WHEN ( s3billing.placement.name = 'default-placement') THEN 'HOT'
+ WHEN ( not s3billing.placement.name = 'default-placement' ) THEN s3billing.placement.name
+ END
+ ) AS placement
+ ,coalesce(ceil(sum(usage_rgw_main_size_actual)/_days)::numeric, 0) AS size
+ ,coalesce(s2.get, 0) AS get
+ ,coalesce(s2.put, 0) AS put
+ ,coalesce(s2.bytes_sent, 0) AS bytes_sent
+FROM s3billing.bucket_stat
+INNER JOIN s3billing.placement ON s3billing.bucket_stat.placement_id=s3billing.placement.id
+INNER JOIN s3billing.bucket_info ON s3billing.bucket_stat.bucket_id=s3billing.bucket_info.id
+LEFT JOIN (
+ SELECT
+ s1.bucket_id AS bucket_id
+ ,s1.bucket_name AS bucket_name
+ ,(CASE
+ WHEN ( s1.placement = 'default-placement') THEN 'HOT'
+ WHEN ( not s1.placement = 'default-placement' ) THEN s1.placement
+ END
+ ) AS placement
+ ,coalesce(sum(s1.get) ,0) AS get
+ ,coalesce(sum(s1.put) ,0) AS put
+ ,coalesce(sum(s1.bytes_sent), 0) AS bytes_sent
+ FROM (
+ SELECT
+ s3billing.bucket_info.id AS bucket_id
+ ,s3billing.bucket_info.name AS bucket_name
+ ,(CASE
+ WHEN ( s3billing.placement.name = 'default-placement') THEN 'HOT'
+ WHEN ( not s3billing.placement.name = 'default-placement' ) THEN s3billing.placement.name
+ END
+ ) AS placement
+ ,(CASE
+ WHEN ( s3billing.category.name LIKE 'get%'
+ OR s3billing.category.name LIKE 'head%'
+ OR s3billing.category.name LIKE 'options%'
+ ) THEN coalesce(sum(ops), 0)
+ END
+ ) AS get
+ ,(CASE
+ WHEN ( s3billing.category.name LIKE 'put%'
+ OR s3billing.category.name LIKE 'post%'
+ OR s3billing.category.name LIKE 'patch%'
+ OR s3billing.category.name LIKE 'list%'
+ ) THEN coalesce(sum(ops), 0)
+ END
+ ) AS put
+ ,coalesce(sum(usage_bucket_by_user.bytes_sent), 0) AS bytes_sent
+
+ FROM
+ s3billing.usage_bucket_by_user
+ INNER JOIN s3billing.bucket_info ON s3billing.usage_bucket_by_user.bucketid = s3billing.bucket_info.id
+ INNER JOIN s3billing.placement ON s3billing.bucket_info.placement_id = s3billing.placement.id
+ INNER JOIN s3billing.user_info ON s3billing.usage_bucket_by_user.user_id = s3billing.user_info.id
+ INNER JOIN s3billing.category ON s3billing.usage_bucket_by_user.category_id = s3billing.category.id
+
+ WHERE
+ s3billing.user_info.name=_user
+ AND s3billing.usage_bucket_by_user.time >= _ds
+ AND s3billing.usage_bucket_by_user.time < _df
+ GROUP BY
+ s3billing.bucket_info.name
+ ,s3billing.placement.name
+ ,s3billing.category.name
+ ,s3billing.bucket_info.id
+ ) AS s1
+
+ GROUP BY
+ s1.bucket_name
+ ,s1.bucket_id
+ ,s1.placement
+
+ ORDER BY
+ s1.placement
+ ,s1.bucket_name
+
+) AS s2 ON s2.bucket_id = s3billing.bucket_stat.bucket_id
+WHERE owner=_user
+ AND timestamp_addition >= _ds
+ AND timestamp_addition < _df
+GROUP BY
+ s3billing.bucket_info.name
+ ,s3billing.placement.name
+ ,s3billing.bucket_stat.bucket_id
+ ,s2.get
+ ,s2.put
+ ,s2.bytes_sent
+ORDER BY
+ s3billing.placement.name
+,s3billing.bucket_info.name
+;
+END;
+$$;
+
+
+ALTER FUNCTION s3billing.billing_per_user_fix_pl_sv(ds character varying, df character varying, _user character varying) OWNER TO postgres;
+
+--
+-- TOC entry 262 (class 1255 OID 2436167)
+-- Name: billing_per_user_summary(character varying, character varying, character varying); Type: FUNCTION; Schema: s3billing; Owner: dsorokin
+--
+
+CREATE FUNCTION s3billing.billing_per_user_summary(_ds character varying, _df character varying, _user character varying) RETURNS TABLE(placement character varying, size_gb numeric, get_10k numeric, put_10k numeric, bytes_sent_gb numeric)
+ LANGUAGE plpgsql
+ AS $$
+BEGIN
+RETURN QUERY
+(
+select
+ billing_per_user_fix_pl.placement as placement,
+ (CASE
+ WHEN ( billing_per_user_fix_pl.placement = 'HOT'
+ ) THEN greatest(ceil(sum(size)/1024/1024/1024)-1,0)
+ WHEN ( not billing_per_user_fix_pl.placement = 'HOT'
+ ) THEN ceil(sum(size)/1024/1024/1024)
+ END) AS size_GB,
+ (CASE
+ WHEN ( billing_per_user_fix_pl.placement = 'HOT'
+ ) THEN greatest(ceil(sum(get)/10000)-10,0)
+ WHEN ( not billing_per_user_fix_pl.placement = 'HOT'
+ ) THEN ceil(sum(get)/10000)
+ END) AS get_10k,
+ (CASE
+ WHEN ( billing_per_user_fix_pl.placement = 'HOT'
+ ) THEN greatest(ceil(sum(put)/10000)-1,0)
+ WHEN ( not billing_per_user_fix_pl.placement = 'HOT'
+ ) THEN ceil(sum(put)/10000)
+ END) AS put_10k,
+ (CASE
+ WHEN ( billing_per_user_fix_pl.placement = 'HOT'
+ ) then greatest(ceil(sum(bytes_sent)/1024/1024/1024)-100,0)
+ WHEN ( not billing_per_user_fix_pl.placement = 'HOT'
+ ) THEN ceil(sum(bytes_sent)/1024/1024/1024)
+ END) AS bytes_sent_GB
+ from s3billing.billing_per_user_fix_pl(_ds,_df,_user)
+ group by billing_per_user_fix_pl.placement
+UNION all
+select
+ 'HOT_FREE_LIMIT' as placement,
+ '1' AS size_GB,
+ '10' AS get_10k,
+ '1' AS put_10k,
+ '100' AS bytes_sent_GB
+ );
+END;
+$$;
+
+
+ALTER FUNCTION s3billing.billing_per_user_summary(_ds character varying, _df character varying, _user character varying) OWNER TO dsorokin;
+
+--
+-- TOC entry 259 (class 1255 OID 2426971)
+-- Name: billing_varchar(character varying, character varying, character varying); Type: FUNCTION; Schema: s3billing; Owner: dsorokin
+--
+
+CREATE FUNCTION s3billing.billing_varchar(_ds character varying, _df character varying, _user character varying) RETURNS TABLE(bucket_name character varying, placement character varying, size numeric, get numeric, put numeric, bytes_sent numeric)
+ LANGUAGE plpgsql
+ AS $$
+BEGIN
+RETURN QUERY
+
+SELECT
+ s3billing.bucket_info.name AS bucket_name
+ ,s3billing.placement.name AS placement
+ ,coalesce(round(sum(usage_rgw_main_size_actual)/
+ (SELECT (DATE_PART('day',
+ ((TO_TIMESTAMP(_df, 'YYYY-MM-DD HH24:MI:SS'))
+ -TO_TIMESTAMP(_ds, 'YYYY-MM-DD HH24:MI:SS'))
+ )*24+
+ DATE_PART('hour',
+ ((TO_TIMESTAMP(_df, 'YYYY-MM-DD HH24:MI:SS'))
+ -TO_TIMESTAMP(_ds, 'YYYY-MM-DD HH24:MI:SS'))
+ )))
+
+ )::numeric,0) AS size
+ ,coalesce(s2.get, 0) AS get
+ ,coalesce(s2.put, 0) AS put
+ ,coalesce(s2.bytes_sent, 0) as bytes_sent
+FROM s3billing.bucket_stat
+INNER JOIN s3billing.placement ON s3billing.bucket_stat.placement_id=s3billing.placement.id
+INNER JOIN s3billing.bucket_info ON s3billing.bucket_stat.bucket_id=s3billing.bucket_info.id
+LEFT JOIN (
+ SELECT
+ s1.bucket_id AS bucket_id
+ ,s1.bucket_name AS bucket_name
+ ,s1.placement AS placement
+ ,coalesce(sum(s1.get) ,0) AS get
+ ,coalesce(sum(s1.put) ,0) AS put
+ ,coalesce(sum(s1.bytes_sent), 0) AS bytes_sent
+ FROM (
+ SELECT
+ s3billing.bucket_info.id AS bucket_id
+ ,s3billing.bucket_info.name AS bucket_name
+ ,s3billing.placement.name AS placement
+ ,(CASE
+ WHEN ( s3billing.category.name LIKE 'get%'
+ OR s3billing.category.name LIKE 'head%'
+ OR s3billing.category.name LIKE 'options%'
+ ) THEN coalesce(sum(ops), 0)
+ END) AS get
+ ,(CASE
+ WHEN ( s3billing.category.name LIKE 'put%'
+ OR s3billing.category.name LIKE 'post%'
+ OR s3billing.category.name LIKE 'patch%'
+ OR s3billing.category.name LIKE 'list%'
+ ) THEN coalesce(sum(ops), 0)
+ END) AS put
+ ,coalesce(sum(usage_bucket_by_user.bytes_sent), 0) AS bytes_sent
+
+ FROM
+ s3billing.usage_bucket_by_user
+ INNER JOIN s3billing.bucket_info ON s3billing.usage_bucket_by_user.bucketid = s3billing.bucket_info.id
+ INNER JOIN s3billing.placement ON s3billing.bucket_info.placement_id = s3billing.placement.id
+ INNER JOIN s3billing.user_info ON s3billing.usage_bucket_by_user.user_id = s3billing.user_info.id
+ INNER JOIN s3billing.category ON s3billing.usage_bucket_by_user.category_id = s3billing.category.id
+
+ WHERE
+ s3billing.user_info.name=_user
+ AND s3billing.usage_bucket_by_user.time >=TO_TIMESTAMP(_ds, 'YYYY-MM-DD HH24:MI:SS')
+ AND s3billing.usage_bucket_by_user.time < TO_TIMESTAMP(_df, 'YYYY-MM-DD HH24:MI:SS')
+ GROUP BY
+ s3billing.bucket_info.name
+ ,s3billing.placement.name
+ ,s3billing.category.name
+ ,s3billing.bucket_info.id
+ ) AS s1
+
+ GROUP BY
+ s1.bucket_name
+ ,s1.bucket_id
+ ,s1.placement
+
+ ORDER BY
+ s1.placement
+ ,s1.bucket_name
+
+) AS s2 ON s2.bucket_id = s3billing.bucket_stat.bucket_id
+WHERE owner=_user
+ AND timestamp_addition >= TO_TIMESTAMP(_ds, 'YYYY-MM-DD HH24:MI:SS')
+ AND timestamp_addition < TO_TIMESTAMP(_df, 'YYYY-MM-DD HH24:MI:SS')
+GROUP BY
+ s3billing.bucket_info.name
+ ,s3billing.placement.name
+ ,s3billing.bucket_stat.bucket_id
+ ,s2.get
+ ,s2.put
+ ,s2.bytes_sent
+ORDER BY
+ s3billing.placement.name
+,s3billing.bucket_info.name
+;
+END;
+$$;
+
+
+ALTER FUNCTION s3billing.billing_varchar(_ds character varying, _df character varying, _user character varying) OWNER TO dsorokin;
+
+--
+-- TOC entry 258 (class 1255 OID 5083308)
+-- Name: buckets_current_stat(character varying); Type: FUNCTION; Schema: s3billing; Owner: dsorokin
+--
+
+CREATE FUNCTION s3billing.buckets_current_stat(_user character varying) RETURNS TABLE(name character varying, placement character varying, bucket_quota_enabled boolean, bucket_quota_max_size bigint, bucket_quota_max_objects bigint, usage_rgw_main_size_actual bigint, usage_rgw_main_num_objects bigint)
+ LANGUAGE plpgsql
+ AS $$
+BEGIN
+RETURN QUERY
+select
+ s3billing.bucket_info.name
+ ,(case
+ when ( s3billing.placement.name = 'default-placement') then 'HOT'
+ WHEN ( not s3billing.placement.name = 'default-placement' ) THEN s3billing.placement.name
+ end
+ ) as placement
+ ,s3billing.bucket_stat.bucket_quota_enabled
+ ,s3billing.bucket_stat.bucket_quota_max_size
+ ,s3billing.bucket_stat.bucket_quota_max_objects
+ ,s3billing.bucket_stat.usage_rgw_main_size_actual
+ ,s3billing.bucket_stat.usage_rgw_main_num_objects
+ from s3billing.bucket_stat
+ inner join s3billing.bucket_info on s3billing.bucket_stat.bucket_id= s3billing.bucket_info.id
+ inner join s3billing.placement on s3billing.bucket_info.placement_id = s3billing.placement.id
+ where owner=_user
+ and s3billing.bucket_stat.timestamp_addition=(
+ select max(s3billing.bucket_stat.timestamp_addition) from s3billing.bucket_stat
+ )
+ order by s3billing.bucket_info.name, s3billing.bucket_stat.timestamp_addition
+;
+END;
+$$;
+
+
+ALTER FUNCTION s3billing.buckets_current_stat(_user character varying) OWNER TO dsorokin;
+
+SET default_tablespace = '';
+
+SET default_table_access_method = heap;
+
+--
+-- TOC entry 222 (class 1259 OID 1893983)
+-- Name: capacity_resource; Type: TABLE; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+CREATE TABLE ngcloud_ru.capacity_resource (
+ vdc_id uuid NOT NULL,
+ "timestamp" timestamp with time zone NOT NULL,
+ cpu_allocated integer NOT NULL,
+ cpu_limit integer NOT NULL,
+ cpu_reserved integer NOT NULL,
+ cpu_used integer NOT NULL,
+ cpu_speed integer NOT NULL,
+ mem_allocated integer NOT NULL,
+ mem_limit integer NOT NULL,
+ mem_reserved integer NOT NULL,
+ mem_used integer NOT NULL
+);
+
+
+ALTER TABLE ngcloud_ru.capacity_resource OWNER TO vc_billing;
+
+--
+-- TOC entry 223 (class 1259 OID 1893993)
+-- Name: capacity_storage; Type: TABLE; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+CREATE TABLE ngcloud_ru.capacity_storage (
+ vdc_id uuid NOT NULL,
+ storage_profile_types_id integer NOT NULL,
+ "timestamp" timestamp with time zone NOT NULL,
+ id uuid NOT NULL,
+ "limit" integer NOT NULL,
+ used integer NOT NULL
+);
+
+
+ALTER TABLE ngcloud_ru.capacity_storage OWNER TO vc_billing;
+
+--
+-- TOC entry 220 (class 1259 OID 1893965)
+-- Name: storage_profile_types; Type: TABLE; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+CREATE TABLE ngcloud_ru.storage_profile_types (
+ id integer NOT NULL,
+ name character varying(255) NOT NULL
+);
+
+
+ALTER TABLE ngcloud_ru.storage_profile_types OWNER TO vc_billing;
+
+--
+-- TOC entry 219 (class 1259 OID 1893964)
+-- Name: storage_profile_types_id_seq; Type: SEQUENCE; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+CREATE SEQUENCE ngcloud_ru.storage_profile_types_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER SEQUENCE ngcloud_ru.storage_profile_types_id_seq OWNER TO vc_billing;
+
+--
+-- TOC entry 3486 (class 0 OID 0)
+-- Dependencies: 219
+-- Name: storage_profile_types_id_seq; Type: SEQUENCE OWNED BY; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER SEQUENCE ngcloud_ru.storage_profile_types_id_seq OWNED BY ngcloud_ru.storage_profile_types.id;
+
+
+--
+-- TOC entry 218 (class 1259 OID 1893959)
+-- Name: tenant; Type: TABLE; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+CREATE TABLE ngcloud_ru.tenant (
+ id uuid NOT NULL,
+ name character varying(255) NOT NULL,
+ wzcode bigint
+);
+
+
+ALTER TABLE ngcloud_ru.tenant OWNER TO vc_billing;
+
+--
+-- TOC entry 221 (class 1259 OID 1893973)
+-- Name: vdc; Type: TABLE; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+CREATE TABLE ngcloud_ru.vdc (
+ id uuid NOT NULL,
+ tenant_id uuid NOT NULL,
+ name character varying(255) NOT NULL
+);
+
+
+ALTER TABLE ngcloud_ru.vdc OWNER TO vc_billing;
+
+--
+-- TOC entry 230 (class 1259 OID 2160668)
+-- Name: bucket_info; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.bucket_info (
+ id integer NOT NULL,
+ bucket_id character varying(255) NOT NULL,
+ name character varying(255) NOT NULL,
+ marker character varying(255) NOT NULL,
+ placement_id bigint DEFAULT 0 NOT NULL
+);
+
+
+ALTER TABLE s3billing.bucket_info OWNER TO s3billing;
+
+--
+-- TOC entry 229 (class 1259 OID 2160667)
+-- Name: bucket_info_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE SEQUENCE s3billing.bucket_info_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER SEQUENCE s3billing.bucket_info_id_seq OWNER TO s3billing;
+
+--
+-- TOC entry 3490 (class 0 OID 0)
+-- Dependencies: 229
+-- Name: bucket_info_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
+--
+
+ALTER SEQUENCE s3billing.bucket_info_id_seq OWNED BY s3billing.bucket_info.id;
+
+
+--
+-- TOC entry 226 (class 1259 OID 2160642)
+-- Name: bucket_stat; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.bucket_stat (
+ bucket_id bigint,
+ num_shards bigint NOT NULL,
+ tenant character varying(255) DEFAULT NULL::character varying,
+ zone_group bigint NOT NULL,
+ placement_id bigint NOT NULL,
+ explicit_placement_data_pool character varying(255) DEFAULT NULL::character varying,
+ explicit_placement_data_extra_pool character varying(255) DEFAULT NULL::character varying,
+ explicit_placement_index_pool character varying(255) DEFAULT NULL::character varying,
+ index_type_id bigint NOT NULL,
+ versioned boolean DEFAULT false,
+ versioning_enabled boolean DEFAULT false,
+ object_lock_enabled boolean DEFAULT false,
+ mfa_enabled boolean DEFAULT false,
+ owner character varying(255) NOT NULL,
+ bucket_quota_enabled boolean DEFAULT false,
+ bucket_quota_check_on_raw boolean DEFAULT false,
+ bucket_quota_max_size bigint NOT NULL,
+ bucket_quota_max_size_kb bigint NOT NULL,
+ bucket_quota_max_objects bigint NOT NULL,
+ usage_rgw_main_size bigint NOT NULL,
+ usage_rgw_main_size_actual bigint NOT NULL,
+ usage_rgw_main_size_utilized bigint NOT NULL,
+ usage_rgw_main_size_kb bigint NOT NULL,
+ usage_rgw_main_size_kb_actual bigint NOT NULL,
+ usage_rgw_main_size_kb_utilized bigint NOT NULL,
+ usage_rgw_main_num_objects bigint NOT NULL,
+ usage_rgw_multimeta_size bigint,
+ usage_rgw_multimeta_size_actual bigint,
+ usage_rgw_multimeta_size_utilized bigint,
+ usage_rgw_multimeta_size_kb bigint,
+ usage_rgw_multimeta_size_kb_actual bigint,
+ usage_rgw_multimeta_size_kb_utilized bigint,
+ usage_rgw_multimeta_num_objects bigint,
+ creation_time timestamp without time zone NOT NULL,
+ mtime timestamp without time zone NOT NULL,
+ timestamp_addition timestamp without time zone DEFAULT date_trunc('hour'::text, CURRENT_TIMESTAMP)
+);
+
+
+ALTER TABLE s3billing.bucket_stat OWNER TO s3billing;
+
+--
+-- TOC entry 245 (class 1259 OID 2160763)
+-- Name: category; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.category (
+ id integer NOT NULL,
+ name character varying(255) NOT NULL
+);
+
+
+ALTER TABLE s3billing.category OWNER TO s3billing;
+
+--
+-- TOC entry 244 (class 1259 OID 2160762)
+-- Name: category_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE SEQUENCE s3billing.category_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER SEQUENCE s3billing.category_id_seq OWNER TO s3billing;
+
+--
+-- TOC entry 3493 (class 0 OID 0)
+-- Dependencies: 244
+-- Name: category_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
+--
+
+ALTER SEQUENCE s3billing.category_id_seq OWNED BY s3billing.category.id;
+
+
+--
+-- TOC entry 225 (class 1259 OID 2160635)
+-- Name: goose_db_version; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.goose_db_version (
+ id integer NOT NULL,
+ version_id bigint NOT NULL,
+ is_applied boolean NOT NULL,
+ tstamp timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+ALTER TABLE s3billing.goose_db_version OWNER TO s3billing;
+
+--
+-- TOC entry 224 (class 1259 OID 2160634)
+-- Name: goose_db_version_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE s3billing.goose_db_version ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY (
+ SEQUENCE NAME s3billing.goose_db_version_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1
+);
+
+
+--
+-- TOC entry 234 (class 1259 OID 2160684)
+-- Name: index_type; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.index_type (
+ id integer NOT NULL,
+ name character varying(255) NOT NULL
+);
+
+
+ALTER TABLE s3billing.index_type OWNER TO s3billing;
+
+--
+-- TOC entry 233 (class 1259 OID 2160683)
+-- Name: index_type_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE SEQUENCE s3billing.index_type_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER SEQUENCE s3billing.index_type_id_seq OWNER TO s3billing;
+
+--
+-- TOC entry 3496 (class 0 OID 0)
+-- Dependencies: 233
+-- Name: index_type_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
+--
+
+ALTER SEQUENCE s3billing.index_type_id_seq OWNED BY s3billing.index_type.id;
+
+
+--
+-- TOC entry 232 (class 1259 OID 2160677)
+-- Name: placement; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.placement (
+ id integer NOT NULL,
+ name character varying(255) NOT NULL
+);
+
+
+ALTER TABLE s3billing.placement OWNER TO s3billing;
+
+--
+-- TOC entry 231 (class 1259 OID 2160676)
+-- Name: placement_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE SEQUENCE s3billing.placement_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER SEQUENCE s3billing.placement_id_seq OWNER TO s3billing;
+
+--
+-- TOC entry 3498 (class 0 OID 0)
+-- Dependencies: 231
+-- Name: placement_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
+--
+
+ALTER SEQUENCE s3billing.placement_id_seq OWNED BY s3billing.placement.id;
+
+
+--
+-- TOC entry 239 (class 1259 OID 2160705)
+-- Name: usage_bucket_by_user; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.usage_bucket_by_user (
+ bucketid bigint,
+ "time" timestamp without time zone NOT NULL,
+ bytes_sent bigint NOT NULL,
+ bytes_received bigint NOT NULL,
+ ops bigint NOT NULL,
+ successful_ops bigint NOT NULL,
+ date_start timestamp without time zone NOT NULL,
+ date_end timestamp without time zone NOT NULL,
+ user_id bigint NOT NULL,
+ category_id bigint NOT NULL
+);
+
+
+ALTER TABLE s3billing.usage_bucket_by_user OWNER TO s3billing;
+
+--
+-- TOC entry 238 (class 1259 OID 2160698)
+-- Name: usage_stat_summary; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.usage_stat_summary (
+ id integer NOT NULL,
+ userid character varying(255) NOT NULL,
+ category character varying(255) NOT NULL,
+ bytes_sent bigint NOT NULL,
+ bytes_received bigint NOT NULL,
+ ops bigint NOT NULL,
+ successful_ops bigint NOT NULL,
+ date_start timestamp without time zone NOT NULL,
+ date_end timestamp without time zone NOT NULL
+);
+
+
+ALTER TABLE s3billing.usage_stat_summary OWNER TO s3billing;
+
+--
+-- TOC entry 237 (class 1259 OID 2160697)
+-- Name: usage_stat_summary_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE SEQUENCE s3billing.usage_stat_summary_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER SEQUENCE s3billing.usage_stat_summary_id_seq OWNER TO s3billing;
+
+--
+-- TOC entry 3501 (class 0 OID 0)
+-- Dependencies: 237
+-- Name: usage_stat_summary_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
+--
+
+ALTER SEQUENCE s3billing.usage_stat_summary_id_seq OWNED BY s3billing.usage_stat_summary.id;
+
+
+--
+-- TOC entry 236 (class 1259 OID 2160691)
+-- Name: usage_stat_total; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.usage_stat_total (
+ id integer NOT NULL,
+ userid character varying(255) NOT NULL,
+ bytes_sent bigint NOT NULL,
+ bytes_received bigint NOT NULL,
+ ops bigint NOT NULL,
+ successful_ops bigint NOT NULL,
+ date_start timestamp without time zone NOT NULL,
+ date_end timestamp without time zone NOT NULL
+);
+
+
+ALTER TABLE s3billing.usage_stat_total OWNER TO s3billing;
+
+--
+-- TOC entry 235 (class 1259 OID 2160690)
+-- Name: usage_stat_total_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE SEQUENCE s3billing.usage_stat_total_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER SEQUENCE s3billing.usage_stat_total_id_seq OWNER TO s3billing;
+
+--
+-- TOC entry 3503 (class 0 OID 0)
+-- Dependencies: 235
+-- Name: usage_stat_total_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
+--
+
+ALTER SEQUENCE s3billing.usage_stat_total_id_seq OWNED BY s3billing.usage_stat_total.id;
+
+
+--
+-- TOC entry 243 (class 1259 OID 2160751)
+-- Name: user_info; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.user_info (
+ id integer NOT NULL,
+ name character varying(255) NOT NULL,
+ owner character varying(255) NOT NULL
+);
+
+
+ALTER TABLE s3billing.user_info OWNER TO s3billing;
+
+--
+-- TOC entry 242 (class 1259 OID 2160750)
+-- Name: user_info_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE SEQUENCE s3billing.user_info_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER SEQUENCE s3billing.user_info_id_seq OWNER TO s3billing;
+
+--
+-- TOC entry 3505 (class 0 OID 0)
+-- Dependencies: 242
+-- Name: user_info_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
+--
+
+ALTER SEQUENCE s3billing.user_info_id_seq OWNED BY s3billing.user_info.id;
+
+
+--
+-- TOC entry 241 (class 1259 OID 2160712)
+-- Name: user_quota_bucket; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.user_quota_bucket (
+ id integer NOT NULL,
+ userid character varying(255) NOT NULL,
+ enabled boolean DEFAULT false,
+ check_on_raw boolean DEFAULT false,
+ max_size bigint NOT NULL,
+ max_size_kb bigint NOT NULL,
+ max_objects bigint NOT NULL
+);
+
+
+ALTER TABLE s3billing.user_quota_bucket OWNER TO s3billing;
+
+--
+-- TOC entry 240 (class 1259 OID 2160711)
+-- Name: user_quota_bucket_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE SEQUENCE s3billing.user_quota_bucket_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER SEQUENCE s3billing.user_quota_bucket_id_seq OWNER TO s3billing;
+
+--
+-- TOC entry 3507 (class 0 OID 0)
+-- Dependencies: 240
+-- Name: user_quota_bucket_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
+--
+
+ALTER SEQUENCE s3billing.user_quota_bucket_id_seq OWNED BY s3billing.user_quota_bucket.id;
+
+
+--
+-- TOC entry 228 (class 1259 OID 2160661)
+-- Name: zone_group; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.zone_group (
+ id integer NOT NULL,
+ name uuid NOT NULL
+);
+
+
+ALTER TABLE s3billing.zone_group OWNER TO s3billing;
+
+--
+-- TOC entry 227 (class 1259 OID 2160660)
+-- Name: zone_group_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE SEQUENCE s3billing.zone_group_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER SEQUENCE s3billing.zone_group_id_seq OWNER TO s3billing;
+
+--
+-- TOC entry 3509 (class 0 OID 0)
+-- Dependencies: 227
+-- Name: zone_group_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
+--
+
+ALTER SEQUENCE s3billing.zone_group_id_seq OWNED BY s3billing.zone_group.id;
+
+
+--
+-- TOC entry 3262 (class 2604 OID 1893968)
+-- Name: storage_profile_types id; Type: DEFAULT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.storage_profile_types ALTER COLUMN id SET DEFAULT nextval('ngcloud_ru.storage_profile_types_id_seq'::regclass);
+
+
+--
+-- TOC entry 3276 (class 2604 OID 2160671)
+-- Name: bucket_info id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.bucket_info ALTER COLUMN id SET DEFAULT nextval('s3billing.bucket_info_id_seq'::regclass);
+
+
+--
+-- TOC entry 3286 (class 2604 OID 2160766)
+-- Name: category id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.category ALTER COLUMN id SET DEFAULT nextval('s3billing.category_id_seq'::regclass);
+
+
+--
+-- TOC entry 3279 (class 2604 OID 2160687)
+-- Name: index_type id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.index_type ALTER COLUMN id SET DEFAULT nextval('s3billing.index_type_id_seq'::regclass);
+
+
+--
+-- TOC entry 3278 (class 2604 OID 2160680)
+-- Name: placement id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.placement ALTER COLUMN id SET DEFAULT nextval('s3billing.placement_id_seq'::regclass);
+
+
+--
+-- TOC entry 3281 (class 2604 OID 2160701)
+-- Name: usage_stat_summary id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.usage_stat_summary ALTER COLUMN id SET DEFAULT nextval('s3billing.usage_stat_summary_id_seq'::regclass);
+
+
+--
+-- TOC entry 3280 (class 2604 OID 2160694)
+-- Name: usage_stat_total id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.usage_stat_total ALTER COLUMN id SET DEFAULT nextval('s3billing.usage_stat_total_id_seq'::regclass);
+
+
+--
+-- TOC entry 3285 (class 2604 OID 2160754)
+-- Name: user_info id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.user_info ALTER COLUMN id SET DEFAULT nextval('s3billing.user_info_id_seq'::regclass);
+
+
+--
+-- TOC entry 3282 (class 2604 OID 2160715)
+-- Name: user_quota_bucket id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.user_quota_bucket ALTER COLUMN id SET DEFAULT nextval('s3billing.user_quota_bucket_id_seq'::regclass);
+
+
+--
+-- TOC entry 3275 (class 2604 OID 2160664)
+-- Name: zone_group id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.zone_group ALTER COLUMN id SET DEFAULT nextval('s3billing.zone_group_id_seq'::regclass);
+
+
+--
+-- TOC entry 3296 (class 2606 OID 1893987)
+-- Name: capacity_resource capacity_resource_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.capacity_resource
+ ADD CONSTRAINT capacity_resource_pkey PRIMARY KEY (vdc_id, "timestamp");
+
+
+--
+-- TOC entry 3298 (class 2606 OID 1893997)
+-- Name: capacity_storage capacity_storage_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.capacity_storage
+ ADD CONSTRAINT capacity_storage_pkey PRIMARY KEY (vdc_id, id, "timestamp");
+
+
+--
+-- TOC entry 3290 (class 2606 OID 1893972)
+-- Name: storage_profile_types storage_profile_types_name_key; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.storage_profile_types
+ ADD CONSTRAINT storage_profile_types_name_key UNIQUE (name);
+
+
+--
+-- TOC entry 3292 (class 2606 OID 1893970)
+-- Name: storage_profile_types storage_profile_types_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.storage_profile_types
+ ADD CONSTRAINT storage_profile_types_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3288 (class 2606 OID 1893963)
+-- Name: tenant tenant_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.tenant
+ ADD CONSTRAINT tenant_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3294 (class 2606 OID 1893977)
+-- Name: vdc vdc_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.vdc
+ ADD CONSTRAINT vdc_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3308 (class 2606 OID 2160675)
+-- Name: bucket_info bucket_info_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.bucket_info
+ ADD CONSTRAINT bucket_info_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3303 (class 2606 OID 2476484)
+-- Name: bucket_stat bucket_stat_unique; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.bucket_stat
+ ADD CONSTRAINT bucket_stat_unique UNIQUE (bucket_id, placement_id, timestamp_addition);
+
+
+--
+-- TOC entry 3328 (class 2606 OID 2160768)
+-- Name: category category_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.category
+ ADD CONSTRAINT category_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3300 (class 2606 OID 2160640)
+-- Name: goose_db_version goose_db_version_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.goose_db_version
+ ADD CONSTRAINT goose_db_version_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3314 (class 2606 OID 2160689)
+-- Name: index_type index_type_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.index_type
+ ADD CONSTRAINT index_type_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3312 (class 2606 OID 2160682)
+-- Name: placement placement_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.placement
+ ADD CONSTRAINT placement_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3320 (class 2606 OID 2476705)
+-- Name: usage_bucket_by_user usage_bucket_by_user_unique; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.usage_bucket_by_user
+ ADD CONSTRAINT usage_bucket_by_user_unique UNIQUE (bucketid, date_start, date_end, user_id, category_id);
+
+
+--
+-- TOC entry 3318 (class 2606 OID 2160703)
+-- Name: usage_stat_summary usage_stat_summary_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.usage_stat_summary
+ ADD CONSTRAINT usage_stat_summary_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3316 (class 2606 OID 2160696)
+-- Name: usage_stat_total usage_stat_total_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.usage_stat_total
+ ADD CONSTRAINT usage_stat_total_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3325 (class 2606 OID 2160758)
+-- Name: user_info user_info_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.user_info
+ ADD CONSTRAINT user_info_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3322 (class 2606 OID 2160719)
+-- Name: user_quota_bucket user_quota_bucket_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.user_quota_bucket
+ ADD CONSTRAINT user_quota_bucket_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3305 (class 2606 OID 2160666)
+-- Name: zone_group zone_group_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.zone_group
+ ADD CONSTRAINT zone_group_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3306 (class 1259 OID 2474077)
+-- Name: bucket_info_name_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
+--
+
+CREATE INDEX bucket_info_name_idx ON s3billing.bucket_info USING btree (name);
+
+
+--
+-- TOC entry 3309 (class 1259 OID 2474078)
+-- Name: bucket_info_placement_id_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
+--
+
+CREATE INDEX bucket_info_placement_id_idx ON s3billing.bucket_info USING btree (placement_id);
+
+
+--
+-- TOC entry 3301 (class 1259 OID 2474094)
+-- Name: bucket_stat_owner_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
+--
+
+CREATE INDEX bucket_stat_owner_idx ON s3billing.bucket_stat USING btree (owner);
+
+
+--
+-- TOC entry 3326 (class 1259 OID 2474445)
+-- Name: category_name_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
+--
+
+CREATE UNIQUE INDEX category_name_idx ON s3billing.category USING btree (name);
+
+
+--
+-- TOC entry 3310 (class 1259 OID 2474468)
+-- Name: placement_name_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
+--
+
+CREATE UNIQUE INDEX placement_name_idx ON s3billing.placement USING btree (name);
+
+
+--
+-- TOC entry 3323 (class 1259 OID 2474438)
+-- Name: user_info_name_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
+--
+
+CREATE INDEX user_info_name_idx ON s3billing.user_info USING btree (name);
+
+
+--
+-- TOC entry 3330 (class 2606 OID 1893988)
+-- Name: capacity_resource capacity_resource_vdc_id_fkey; Type: FK CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.capacity_resource
+ ADD CONSTRAINT capacity_resource_vdc_id_fkey FOREIGN KEY (vdc_id) REFERENCES ngcloud_ru.vdc(id) ON DELETE CASCADE;
+
+
+--
+-- TOC entry 3331 (class 2606 OID 1894003)
+-- Name: capacity_storage capacity_storage_storage_profile_types_id_fkey; Type: FK CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.capacity_storage
+ ADD CONSTRAINT capacity_storage_storage_profile_types_id_fkey FOREIGN KEY (storage_profile_types_id) REFERENCES ngcloud_ru.storage_profile_types(id);
+
+
+--
+-- TOC entry 3332 (class 2606 OID 1893998)
+-- Name: capacity_storage capacity_storage_vdc_id_fkey; Type: FK CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.capacity_storage
+ ADD CONSTRAINT capacity_storage_vdc_id_fkey FOREIGN KEY (vdc_id) REFERENCES ngcloud_ru.vdc(id) ON DELETE CASCADE;
+
+
+--
+-- TOC entry 3329 (class 2606 OID 1893978)
+-- Name: vdc vdc_tenant_id_fkey; Type: FK CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.vdc
+ ADD CONSTRAINT vdc_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES ngcloud_ru.tenant(id);
+
+
+--
+-- TOC entry 3481 (class 0 OID 0)
+-- Dependencies: 7
+-- Name: SCHEMA ngcloud_ru; Type: ACL; Schema: -; Owner: vc_billing
+--
+
+GRANT USAGE ON SCHEMA ngcloud_ru TO grafanabilling;
+
+
+--
+-- TOC entry 3482 (class 0 OID 0)
+-- Dependencies: 8
+-- Name: SCHEMA s3billing; Type: ACL; Schema: -; Owner: s3billing
+--
+
+GRANT USAGE ON SCHEMA s3billing TO grafanabilling;
+
+
+--
+-- TOC entry 3483 (class 0 OID 0)
+-- Dependencies: 222
+-- Name: TABLE capacity_resource; Type: ACL; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+GRANT SELECT ON TABLE ngcloud_ru.capacity_resource TO grafanabilling;
+
+
+--
+-- TOC entry 3484 (class 0 OID 0)
+-- Dependencies: 223
+-- Name: TABLE capacity_storage; Type: ACL; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+GRANT SELECT ON TABLE ngcloud_ru.capacity_storage TO grafanabilling;
+
+
+--
+-- TOC entry 3485 (class 0 OID 0)
+-- Dependencies: 220
+-- Name: TABLE storage_profile_types; Type: ACL; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+GRANT SELECT ON TABLE ngcloud_ru.storage_profile_types TO grafanabilling;
+
+
+--
+-- TOC entry 3487 (class 0 OID 0)
+-- Dependencies: 218
+-- Name: TABLE tenant; Type: ACL; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+GRANT SELECT ON TABLE ngcloud_ru.tenant TO grafanabilling;
+
+
+--
+-- TOC entry 3488 (class 0 OID 0)
+-- Dependencies: 221
+-- Name: TABLE vdc; Type: ACL; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+GRANT SELECT ON TABLE ngcloud_ru.vdc TO grafanabilling;
+
+
+--
+-- TOC entry 3489 (class 0 OID 0)
+-- Dependencies: 230
+-- Name: TABLE bucket_info; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.bucket_info TO grafanabilling;
+
+
+--
+-- TOC entry 3491 (class 0 OID 0)
+-- Dependencies: 226
+-- Name: TABLE bucket_stat; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.bucket_stat TO grafanabilling;
+
+
+--
+-- TOC entry 3492 (class 0 OID 0)
+-- Dependencies: 245
+-- Name: TABLE category; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.category TO grafanabilling;
+
+
+--
+-- TOC entry 3494 (class 0 OID 0)
+-- Dependencies: 225
+-- Name: TABLE goose_db_version; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.goose_db_version TO grafanabilling;
+
+
+--
+-- TOC entry 3495 (class 0 OID 0)
+-- Dependencies: 234
+-- Name: TABLE index_type; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.index_type TO grafanabilling;
+
+
+--
+-- TOC entry 3497 (class 0 OID 0)
+-- Dependencies: 232
+-- Name: TABLE placement; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.placement TO grafanabilling;
+
+
+--
+-- TOC entry 3499 (class 0 OID 0)
+-- Dependencies: 239
+-- Name: TABLE usage_bucket_by_user; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.usage_bucket_by_user TO grafanabilling;
+
+
+--
+-- TOC entry 3500 (class 0 OID 0)
+-- Dependencies: 238
+-- Name: TABLE usage_stat_summary; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.usage_stat_summary TO grafanabilling;
+
+
+--
+-- TOC entry 3502 (class 0 OID 0)
+-- Dependencies: 236
+-- Name: TABLE usage_stat_total; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.usage_stat_total TO grafanabilling;
+
+
+--
+-- TOC entry 3504 (class 0 OID 0)
+-- Dependencies: 243
+-- Name: TABLE user_info; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.user_info TO grafanabilling;
+
+
+--
+-- TOC entry 3506 (class 0 OID 0)
+-- Dependencies: 241
+-- Name: TABLE user_quota_bucket; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.user_quota_bucket TO grafanabilling;
+
+
+--
+-- TOC entry 3508 (class 0 OID 0)
+-- Dependencies: 228
+-- Name: TABLE zone_group; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.zone_group TO grafanabilling;
+
+
+-- Completed on 2025-10-24 14:30:47
+
+--
+-- PostgreSQL database dump complete
+--
+
+\unrestrict M18FnaokuZFKQZjWu9az6dzOO6o2cSlpJgAocs2PXfRbmzHVcXEXaiZZcaOPZko
+
diff --git a/etc/db/billing_schema_dev.sql b/etc/db/billing_schema_dev.sql
new file mode 100644
index 0000000..3ac43c9
--- /dev/null
+++ b/etc/db/billing_schema_dev.sql
@@ -0,0 +1,72 @@
+set role postgres;
+--
+CREATE SCHEMA IF NOT EXISTS gpu;
+--ALTER SCHEMA gpu OWNER TO dbo;
+GRANT USAGE ON SCHEMA gpu TO nifi;
+
+GRANT ALL ON ALL TABLES IN SCHEMA gpu TO nifi;
+GRANT ALL ON ALL SEQUENCES IN SCHEMA gpu TO nifi;
+
+--ALTER DEFAULT PRIVILEGES IN SCHEMA gpu GRANT ALL ON TABLES TO nifi;
+--ALTER DEFAULT PRIVILEGES IN SCHEMA gpu GRANT ALL ON SEQUENCES TO nifi;
+
+ALTER DEFAULT PRIVILEGES FOR ROLE dbo, postgres IN SCHEMA gpu GRANT ALL ON TABLES TO nifi;
+ALTER DEFAULT PRIVILEGES FOR ROLE dbo, postgres IN SCHEMA gpu GRANT ALL ON SEQUENCES TO nifi;
+
+--SET ROLE dbo;
+
+DROP TABLE IF EXISTS gpu.vm;
+CREATE TABLE gpu.vm (
+ objUUID uuid NOT NULL PRIMARY KEY
+ ,groupUUID uuid NULL
+ ,objId varchar(255) NULL
+ ,ClientID varchar(255) NULL -- WZ
+ ,VCD varchar(255) NULL
+ ,Org varchar(255) NULL
+ ,OrgVDC varchar(255) NULL
+ ,vCenter varchar(255) NULL
+ ,GPU varchar(255) NULL
+ ,dt_load timestamptz NOT NULL
+);
+ALTER TABLE gpu.vm OWNER TO dbo;
+/*
+{
+"type": "record",
+"name": "gpu.vm",
+"namespace": "org.apache.nifi",
+"fields": [
+ {"name":"objUUID", "type":{"type": "string", "logicalType": "uuid"}},
+ {"name":"groupUUID", "type":[{"type": "string", "logicalType": "uuid"} ,"null"]},
+ {"name":"objId", "type":["string" ,"null"]},
+ {"name":"ClientID", "type":["int" ,"null"]},
+ {"name":"VCD", "type":["string" ,"null"]},
+ {"name":"Org", "type":["string" ,"null"]},
+ {"name":"OrgVDC", "type":["string" ,"null"]},
+ {"name":"vCenter", "type":["string" ,"null"]},
+ {"name":"GPU", "type":["string" ,"null"]},
+ {"name":"VCD", "type":["string" ,"null"]},
+ {"name":"dt_load","type":{"type": "long", "logicalType": "local-timestamp-millis"}}
+]
+}
+*/
+
+DROP TABLE IF EXISTS gpu.vm_power_state;
+CREATE TABLE gpu.vm_power_state (
+ objId varchar(255) NULL
+ ,ts timestamptz NOT NULL -- без таймштампа загрузки
+ ,value int NULL
+ ,CONSTRAINT PK_vm_power_state PRIMARY KEY(objId, ts)
+);
+ALTER TABLE gpu.vm_power_state OWNER TO dbo;
+/*
+{
+"type": "record",
+"name": "gpu.vm_power_state,
+"namespace": "org.apache.nifi",
+"fields": [
+ {"name":"objId", "type":["string" ,"null"]},
+ {"name":"ts","type":{"type": "long", "logicalType": "local-timestamp-millis"}},
+ {"name":"value", "type":["int" ,"null"]}
+]
+}
+*/
\ No newline at end of file
diff --git a/etc/db/billing_schema_s3.sql b/etc/db/billing_schema_s3.sql
new file mode 100644
index 0000000..6382912
--- /dev/null
+++ b/etc/db/billing_schema_s3.sql
@@ -0,0 +1,828 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 16.0
+-- Dumped by pg_dump version 16.4
+
+-- Started on 2025-09-15 09:50:58
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+SET default_tablespace = '';
+
+SET default_table_access_method = heap;
+
+--
+-- TOC entry 230 (class 1259 OID 2160668)
+-- Name: bucket_info; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.bucket_info (
+ id integer NOT NULL,
+ bucket_id character varying(255) NOT NULL,
+ name character varying(255) NOT NULL,
+ marker character varying(255) NOT NULL,
+ placement_id bigint DEFAULT 0 NOT NULL
+);
+
+
+ALTER TABLE s3billing.bucket_info OWNER TO s3billing;
+
+--
+-- TOC entry 229 (class 1259 OID 2160667)
+-- Name: bucket_info_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE SEQUENCE s3billing.bucket_info_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER SEQUENCE s3billing.bucket_info_id_seq OWNER TO s3billing;
+
+--
+-- TOC entry 3448 (class 0 OID 0)
+-- Dependencies: 229
+-- Name: bucket_info_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
+--
+
+ALTER SEQUENCE s3billing.bucket_info_id_seq OWNED BY s3billing.bucket_info.id;
+
+
+--
+-- TOC entry 226 (class 1259 OID 2160642)
+-- Name: bucket_stat; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.bucket_stat (
+ bucket_id bigint,
+ num_shards bigint NOT NULL,
+ tenant character varying(255) DEFAULT NULL::character varying,
+ zone_group bigint NOT NULL,
+ placement_id bigint NOT NULL,
+ explicit_placement_data_pool character varying(255) DEFAULT NULL::character varying,
+ explicit_placement_data_extra_pool character varying(255) DEFAULT NULL::character varying,
+ explicit_placement_index_pool character varying(255) DEFAULT NULL::character varying,
+ index_type_id bigint NOT NULL,
+ versioned boolean DEFAULT false,
+ versioning_enabled boolean DEFAULT false,
+ object_lock_enabled boolean DEFAULT false,
+ mfa_enabled boolean DEFAULT false,
+ owner character varying(255) NOT NULL,
+ bucket_quota_enabled boolean DEFAULT false,
+ bucket_quota_check_on_raw boolean DEFAULT false,
+ bucket_quota_max_size bigint NOT NULL,
+ bucket_quota_max_size_kb bigint NOT NULL,
+ bucket_quota_max_objects bigint NOT NULL,
+ usage_rgw_main_size bigint NOT NULL,
+ usage_rgw_main_size_actual bigint NOT NULL,
+ usage_rgw_main_size_utilized bigint NOT NULL,
+ usage_rgw_main_size_kb bigint NOT NULL,
+ usage_rgw_main_size_kb_actual bigint NOT NULL,
+ usage_rgw_main_size_kb_utilized bigint NOT NULL,
+ usage_rgw_main_num_objects bigint NOT NULL,
+ usage_rgw_multimeta_size bigint,
+ usage_rgw_multimeta_size_actual bigint,
+ usage_rgw_multimeta_size_utilized bigint,
+ usage_rgw_multimeta_size_kb bigint,
+ usage_rgw_multimeta_size_kb_actual bigint,
+ usage_rgw_multimeta_size_kb_utilized bigint,
+ usage_rgw_multimeta_num_objects bigint,
+ creation_time timestamp without time zone NOT NULL,
+ mtime timestamp without time zone NOT NULL,
+ timestamp_addition timestamp without time zone DEFAULT date_trunc('hour'::text, CURRENT_TIMESTAMP)
+);
+
+
+ALTER TABLE s3billing.bucket_stat OWNER TO s3billing;
+
+--
+-- TOC entry 245 (class 1259 OID 2160763)
+-- Name: category; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.category (
+ id integer NOT NULL,
+ name character varying(255) NOT NULL
+);
+
+
+ALTER TABLE s3billing.category OWNER TO s3billing;
+
+--
+-- TOC entry 244 (class 1259 OID 2160762)
+-- Name: category_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE SEQUENCE s3billing.category_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER SEQUENCE s3billing.category_id_seq OWNER TO s3billing;
+
+--
+-- TOC entry 3451 (class 0 OID 0)
+-- Dependencies: 244
+-- Name: category_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
+--
+
+ALTER SEQUENCE s3billing.category_id_seq OWNED BY s3billing.category.id;
+
+
+--
+-- TOC entry 225 (class 1259 OID 2160635)
+-- Name: goose_db_version; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.goose_db_version (
+ id integer NOT NULL,
+ version_id bigint NOT NULL,
+ is_applied boolean NOT NULL,
+ tstamp timestamp without time zone DEFAULT now() NOT NULL
+);
+
+
+ALTER TABLE s3billing.goose_db_version OWNER TO s3billing;
+
+--
+-- TOC entry 224 (class 1259 OID 2160634)
+-- Name: goose_db_version_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE s3billing.goose_db_version ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY (
+ SEQUENCE NAME s3billing.goose_db_version_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1
+);
+
+
+--
+-- TOC entry 234 (class 1259 OID 2160684)
+-- Name: index_type; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.index_type (
+ id integer NOT NULL,
+ name character varying(255) NOT NULL
+);
+
+
+ALTER TABLE s3billing.index_type OWNER TO s3billing;
+
+--
+-- TOC entry 233 (class 1259 OID 2160683)
+-- Name: index_type_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE SEQUENCE s3billing.index_type_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER SEQUENCE s3billing.index_type_id_seq OWNER TO s3billing;
+
+--
+-- TOC entry 3454 (class 0 OID 0)
+-- Dependencies: 233
+-- Name: index_type_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
+--
+
+ALTER SEQUENCE s3billing.index_type_id_seq OWNED BY s3billing.index_type.id;
+
+
+--
+-- TOC entry 232 (class 1259 OID 2160677)
+-- Name: placement; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.placement (
+ id integer NOT NULL,
+ name character varying(255) NOT NULL
+);
+
+
+ALTER TABLE s3billing.placement OWNER TO s3billing;
+
+--
+-- TOC entry 231 (class 1259 OID 2160676)
+-- Name: placement_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE SEQUENCE s3billing.placement_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER SEQUENCE s3billing.placement_id_seq OWNER TO s3billing;
+
+--
+-- TOC entry 3456 (class 0 OID 0)
+-- Dependencies: 231
+-- Name: placement_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
+--
+
+ALTER SEQUENCE s3billing.placement_id_seq OWNED BY s3billing.placement.id;
+
+
+--
+-- TOC entry 239 (class 1259 OID 2160705)
+-- Name: usage_bucket_by_user; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.usage_bucket_by_user (
+ bucketid bigint,
+ "time" timestamp without time zone NOT NULL,
+ bytes_sent bigint NOT NULL,
+ bytes_received bigint NOT NULL,
+ ops bigint NOT NULL,
+ successful_ops bigint NOT NULL,
+ date_start timestamp without time zone NOT NULL,
+ date_end timestamp without time zone NOT NULL,
+ user_id bigint NOT NULL,
+ category_id bigint NOT NULL
+);
+
+
+ALTER TABLE s3billing.usage_bucket_by_user OWNER TO s3billing;
+
+--
+-- TOC entry 238 (class 1259 OID 2160698)
+-- Name: usage_stat_summary; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.usage_stat_summary (
+ id integer NOT NULL,
+ userid character varying(255) NOT NULL,
+ category character varying(255) NOT NULL,
+ bytes_sent bigint NOT NULL,
+ bytes_received bigint NOT NULL,
+ ops bigint NOT NULL,
+ successful_ops bigint NOT NULL,
+ date_start timestamp without time zone NOT NULL,
+ date_end timestamp without time zone NOT NULL
+);
+
+
+ALTER TABLE s3billing.usage_stat_summary OWNER TO s3billing;
+
+--
+-- TOC entry 237 (class 1259 OID 2160697)
+-- Name: usage_stat_summary_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE SEQUENCE s3billing.usage_stat_summary_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER SEQUENCE s3billing.usage_stat_summary_id_seq OWNER TO s3billing;
+
+--
+-- TOC entry 3459 (class 0 OID 0)
+-- Dependencies: 237
+-- Name: usage_stat_summary_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
+--
+
+ALTER SEQUENCE s3billing.usage_stat_summary_id_seq OWNED BY s3billing.usage_stat_summary.id;
+
+
+--
+-- TOC entry 236 (class 1259 OID 2160691)
+-- Name: usage_stat_total; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.usage_stat_total (
+ id integer NOT NULL,
+ userid character varying(255) NOT NULL,
+ bytes_sent bigint NOT NULL,
+ bytes_received bigint NOT NULL,
+ ops bigint NOT NULL,
+ successful_ops bigint NOT NULL,
+ date_start timestamp without time zone NOT NULL,
+ date_end timestamp without time zone NOT NULL
+);
+
+
+ALTER TABLE s3billing.usage_stat_total OWNER TO s3billing;
+
+--
+-- TOC entry 235 (class 1259 OID 2160690)
+-- Name: usage_stat_total_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE SEQUENCE s3billing.usage_stat_total_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER SEQUENCE s3billing.usage_stat_total_id_seq OWNER TO s3billing;
+
+--
+-- TOC entry 3461 (class 0 OID 0)
+-- Dependencies: 235
+-- Name: usage_stat_total_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
+--
+
+ALTER SEQUENCE s3billing.usage_stat_total_id_seq OWNED BY s3billing.usage_stat_total.id;
+
+
+--
+-- TOC entry 243 (class 1259 OID 2160751)
+-- Name: user_info; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.user_info (
+ id integer NOT NULL,
+ name character varying(255) NOT NULL,
+ owner character varying(255) NOT NULL
+);
+
+
+ALTER TABLE s3billing.user_info OWNER TO s3billing;
+
+--
+-- TOC entry 242 (class 1259 OID 2160750)
+-- Name: user_info_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE SEQUENCE s3billing.user_info_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER SEQUENCE s3billing.user_info_id_seq OWNER TO s3billing;
+
+--
+-- TOC entry 3463 (class 0 OID 0)
+-- Dependencies: 242
+-- Name: user_info_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
+--
+
+ALTER SEQUENCE s3billing.user_info_id_seq OWNED BY s3billing.user_info.id;
+
+
+--
+-- TOC entry 241 (class 1259 OID 2160712)
+-- Name: user_quota_bucket; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.user_quota_bucket (
+ id integer NOT NULL,
+ userid character varying(255) NOT NULL,
+ enabled boolean DEFAULT false,
+ check_on_raw boolean DEFAULT false,
+ max_size bigint NOT NULL,
+ max_size_kb bigint NOT NULL,
+ max_objects bigint NOT NULL
+);
+
+
+ALTER TABLE s3billing.user_quota_bucket OWNER TO s3billing;
+
+--
+-- TOC entry 240 (class 1259 OID 2160711)
+-- Name: user_quota_bucket_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE SEQUENCE s3billing.user_quota_bucket_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER SEQUENCE s3billing.user_quota_bucket_id_seq OWNER TO s3billing;
+
+--
+-- TOC entry 3465 (class 0 OID 0)
+-- Dependencies: 240
+-- Name: user_quota_bucket_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
+--
+
+ALTER SEQUENCE s3billing.user_quota_bucket_id_seq OWNED BY s3billing.user_quota_bucket.id;
+
+
+--
+-- TOC entry 228 (class 1259 OID 2160661)
+-- Name: zone_group; Type: TABLE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE TABLE s3billing.zone_group (
+ id integer NOT NULL,
+ name uuid NOT NULL
+);
+
+
+ALTER TABLE s3billing.zone_group OWNER TO s3billing;
+
+--
+-- TOC entry 227 (class 1259 OID 2160660)
+-- Name: zone_group_id_seq; Type: SEQUENCE; Schema: s3billing; Owner: s3billing
+--
+
+CREATE SEQUENCE s3billing.zone_group_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER SEQUENCE s3billing.zone_group_id_seq OWNER TO s3billing;
+
+--
+-- TOC entry 3467 (class 0 OID 0)
+-- Dependencies: 227
+-- Name: zone_group_id_seq; Type: SEQUENCE OWNED BY; Schema: s3billing; Owner: s3billing
+--
+
+ALTER SEQUENCE s3billing.zone_group_id_seq OWNED BY s3billing.zone_group.id;
+
+
+--
+-- TOC entry 3258 (class 2604 OID 2160671)
+-- Name: bucket_info id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.bucket_info ALTER COLUMN id SET DEFAULT nextval('s3billing.bucket_info_id_seq'::regclass);
+
+
+--
+-- TOC entry 3268 (class 2604 OID 2160766)
+-- Name: category id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.category ALTER COLUMN id SET DEFAULT nextval('s3billing.category_id_seq'::regclass);
+
+
+--
+-- TOC entry 3261 (class 2604 OID 2160687)
+-- Name: index_type id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.index_type ALTER COLUMN id SET DEFAULT nextval('s3billing.index_type_id_seq'::regclass);
+
+
+--
+-- TOC entry 3260 (class 2604 OID 2160680)
+-- Name: placement id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.placement ALTER COLUMN id SET DEFAULT nextval('s3billing.placement_id_seq'::regclass);
+
+
+--
+-- TOC entry 3263 (class 2604 OID 2160701)
+-- Name: usage_stat_summary id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.usage_stat_summary ALTER COLUMN id SET DEFAULT nextval('s3billing.usage_stat_summary_id_seq'::regclass);
+
+
+--
+-- TOC entry 3262 (class 2604 OID 2160694)
+-- Name: usage_stat_total id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.usage_stat_total ALTER COLUMN id SET DEFAULT nextval('s3billing.usage_stat_total_id_seq'::regclass);
+
+
+--
+-- TOC entry 3267 (class 2604 OID 2160754)
+-- Name: user_info id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.user_info ALTER COLUMN id SET DEFAULT nextval('s3billing.user_info_id_seq'::regclass);
+
+
+--
+-- TOC entry 3264 (class 2604 OID 2160715)
+-- Name: user_quota_bucket id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.user_quota_bucket ALTER COLUMN id SET DEFAULT nextval('s3billing.user_quota_bucket_id_seq'::regclass);
+
+
+--
+-- TOC entry 3257 (class 2604 OID 2160664)
+-- Name: zone_group id; Type: DEFAULT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.zone_group ALTER COLUMN id SET DEFAULT nextval('s3billing.zone_group_id_seq'::regclass);
+
+
+--
+-- TOC entry 3278 (class 2606 OID 2160675)
+-- Name: bucket_info bucket_info_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.bucket_info
+ ADD CONSTRAINT bucket_info_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3273 (class 2606 OID 2476484)
+-- Name: bucket_stat bucket_stat_unique; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.bucket_stat
+ ADD CONSTRAINT bucket_stat_unique UNIQUE (bucket_id, placement_id, timestamp_addition);
+
+
+--
+-- TOC entry 3298 (class 2606 OID 2160768)
+-- Name: category category_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.category
+ ADD CONSTRAINT category_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3270 (class 2606 OID 2160640)
+-- Name: goose_db_version goose_db_version_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.goose_db_version
+ ADD CONSTRAINT goose_db_version_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3284 (class 2606 OID 2160689)
+-- Name: index_type index_type_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.index_type
+ ADD CONSTRAINT index_type_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3282 (class 2606 OID 2160682)
+-- Name: placement placement_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.placement
+ ADD CONSTRAINT placement_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3290 (class 2606 OID 2476705)
+-- Name: usage_bucket_by_user usage_bucket_by_user_unique; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.usage_bucket_by_user
+ ADD CONSTRAINT usage_bucket_by_user_unique UNIQUE (bucketid, date_start, date_end, user_id, category_id);
+
+
+--
+-- TOC entry 3288 (class 2606 OID 2160703)
+-- Name: usage_stat_summary usage_stat_summary_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.usage_stat_summary
+ ADD CONSTRAINT usage_stat_summary_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3286 (class 2606 OID 2160696)
+-- Name: usage_stat_total usage_stat_total_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.usage_stat_total
+ ADD CONSTRAINT usage_stat_total_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3295 (class 2606 OID 2160758)
+-- Name: user_info user_info_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.user_info
+ ADD CONSTRAINT user_info_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3292 (class 2606 OID 2160719)
+-- Name: user_quota_bucket user_quota_bucket_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.user_quota_bucket
+ ADD CONSTRAINT user_quota_bucket_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3275 (class 2606 OID 2160666)
+-- Name: zone_group zone_group_pkey; Type: CONSTRAINT; Schema: s3billing; Owner: s3billing
+--
+
+ALTER TABLE ONLY s3billing.zone_group
+ ADD CONSTRAINT zone_group_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3276 (class 1259 OID 2474077)
+-- Name: bucket_info_name_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
+--
+
+CREATE INDEX bucket_info_name_idx ON s3billing.bucket_info USING btree (name);
+
+
+--
+-- TOC entry 3279 (class 1259 OID 2474078)
+-- Name: bucket_info_placement_id_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
+--
+
+CREATE INDEX bucket_info_placement_id_idx ON s3billing.bucket_info USING btree (placement_id);
+
+
+--
+-- TOC entry 3271 (class 1259 OID 2474094)
+-- Name: bucket_stat_owner_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
+--
+
+CREATE INDEX bucket_stat_owner_idx ON s3billing.bucket_stat USING btree (owner);
+
+
+--
+-- TOC entry 3296 (class 1259 OID 2474445)
+-- Name: category_name_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
+--
+
+CREATE UNIQUE INDEX category_name_idx ON s3billing.category USING btree (name);
+
+
+--
+-- TOC entry 3280 (class 1259 OID 2474468)
+-- Name: placement_name_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
+--
+
+CREATE UNIQUE INDEX placement_name_idx ON s3billing.placement USING btree (name);
+
+
+--
+-- TOC entry 3293 (class 1259 OID 2474438)
+-- Name: user_info_name_idx; Type: INDEX; Schema: s3billing; Owner: s3billing
+--
+
+CREATE INDEX user_info_name_idx ON s3billing.user_info USING btree (name);
+
+
+--
+-- TOC entry 3447 (class 0 OID 0)
+-- Dependencies: 230
+-- Name: TABLE bucket_info; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.bucket_info TO grafanabilling;
+
+
+--
+-- TOC entry 3449 (class 0 OID 0)
+-- Dependencies: 226
+-- Name: TABLE bucket_stat; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.bucket_stat TO grafanabilling;
+
+
+--
+-- TOC entry 3450 (class 0 OID 0)
+-- Dependencies: 245
+-- Name: TABLE category; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.category TO grafanabilling;
+
+
+--
+-- TOC entry 3452 (class 0 OID 0)
+-- Dependencies: 225
+-- Name: TABLE goose_db_version; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.goose_db_version TO grafanabilling;
+
+
+--
+-- TOC entry 3453 (class 0 OID 0)
+-- Dependencies: 234
+-- Name: TABLE index_type; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.index_type TO grafanabilling;
+
+
+--
+-- TOC entry 3455 (class 0 OID 0)
+-- Dependencies: 232
+-- Name: TABLE placement; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.placement TO grafanabilling;
+
+
+--
+-- TOC entry 3457 (class 0 OID 0)
+-- Dependencies: 239
+-- Name: TABLE usage_bucket_by_user; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.usage_bucket_by_user TO grafanabilling;
+
+
+--
+-- TOC entry 3458 (class 0 OID 0)
+-- Dependencies: 238
+-- Name: TABLE usage_stat_summary; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.usage_stat_summary TO grafanabilling;
+
+
+--
+-- TOC entry 3460 (class 0 OID 0)
+-- Dependencies: 236
+-- Name: TABLE usage_stat_total; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.usage_stat_total TO grafanabilling;
+
+
+--
+-- TOC entry 3462 (class 0 OID 0)
+-- Dependencies: 243
+-- Name: TABLE user_info; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.user_info TO grafanabilling;
+
+
+--
+-- TOC entry 3464 (class 0 OID 0)
+-- Dependencies: 241
+-- Name: TABLE user_quota_bucket; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.user_quota_bucket TO grafanabilling;
+
+
+--
+-- TOC entry 3466 (class 0 OID 0)
+-- Dependencies: 228
+-- Name: TABLE zone_group; Type: ACL; Schema: s3billing; Owner: s3billing
+--
+
+GRANT SELECT ON TABLE s3billing.zone_group TO grafanabilling;
+
+
+-- Completed on 2025-09-15 09:50:59
+
+--
+-- PostgreSQL database dump complete
+--
+
diff --git a/etc/db/billing_schema_vc.sql b/etc/db/billing_schema_vc.sql
new file mode 100644
index 0000000..2e66787
--- /dev/null
+++ b/etc/db/billing_schema_vc.sql
@@ -0,0 +1,278 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 16.0
+-- Dumped by pg_dump version 16.4
+
+-- Started on 2025-09-15 09:53:16
+
+SET statement_timeout = 0;
+SET lock_timeout = 0;
+SET idle_in_transaction_session_timeout = 0;
+SET client_encoding = 'UTF8';
+SET standard_conforming_strings = on;
+SELECT pg_catalog.set_config('search_path', '', false);
+SET check_function_bodies = false;
+SET xmloption = content;
+SET client_min_messages = warning;
+SET row_security = off;
+
+SET default_tablespace = '';
+
+SET default_table_access_method = heap;
+
+--
+-- TOC entry 222 (class 1259 OID 1893983)
+-- Name: capacity_resource; Type: TABLE; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+CREATE TABLE ngcloud_ru.capacity_resource (
+ vdc_id uuid NOT NULL,
+ "timestamp" timestamp with time zone NOT NULL,
+ cpu_allocated integer NOT NULL,
+ cpu_limit integer NOT NULL,
+ cpu_reserved integer NOT NULL,
+ cpu_used integer NOT NULL,
+ cpu_speed integer NOT NULL,
+ mem_allocated integer NOT NULL,
+ mem_limit integer NOT NULL,
+ mem_reserved integer NOT NULL,
+ mem_used integer NOT NULL
+);
+
+
+ALTER TABLE ngcloud_ru.capacity_resource OWNER TO vc_billing;
+
+--
+-- TOC entry 223 (class 1259 OID 1893993)
+-- Name: capacity_storage; Type: TABLE; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+CREATE TABLE ngcloud_ru.capacity_storage (
+ vdc_id uuid NOT NULL,
+ storage_profile_types_id integer NOT NULL,
+ "timestamp" timestamp with time zone NOT NULL,
+ id uuid NOT NULL,
+ "limit" integer NOT NULL,
+ used integer NOT NULL
+);
+
+
+ALTER TABLE ngcloud_ru.capacity_storage OWNER TO vc_billing;
+
+--
+-- TOC entry 220 (class 1259 OID 1893965)
+-- Name: storage_profile_types; Type: TABLE; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+CREATE TABLE ngcloud_ru.storage_profile_types (
+ id integer NOT NULL,
+ name character varying(255) NOT NULL
+);
+
+
+ALTER TABLE ngcloud_ru.storage_profile_types OWNER TO vc_billing;
+
+--
+-- TOC entry 219 (class 1259 OID 1893964)
+-- Name: storage_profile_types_id_seq; Type: SEQUENCE; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+CREATE SEQUENCE ngcloud_ru.storage_profile_types_id_seq
+ AS integer
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+ALTER SEQUENCE ngcloud_ru.storage_profile_types_id_seq OWNER TO vc_billing;
+
+--
+-- TOC entry 3413 (class 0 OID 0)
+-- Dependencies: 219
+-- Name: storage_profile_types_id_seq; Type: SEQUENCE OWNED BY; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER SEQUENCE ngcloud_ru.storage_profile_types_id_seq OWNED BY ngcloud_ru.storage_profile_types.id;
+
+
+--
+-- TOC entry 218 (class 1259 OID 1893959)
+-- Name: tenant; Type: TABLE; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+CREATE TABLE ngcloud_ru.tenant (
+ id uuid NOT NULL,
+ name character varying(255) NOT NULL,
+ wzcode bigint
+);
+
+
+ALTER TABLE ngcloud_ru.tenant OWNER TO vc_billing;
+
+--
+-- TOC entry 221 (class 1259 OID 1893973)
+-- Name: vdc; Type: TABLE; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+CREATE TABLE ngcloud_ru.vdc (
+ id uuid NOT NULL,
+ tenant_id uuid NOT NULL,
+ name character varying(255) NOT NULL
+);
+
+
+ALTER TABLE ngcloud_ru.vdc OWNER TO vc_billing;
+
+--
+-- TOC entry 3245 (class 2604 OID 1893968)
+-- Name: storage_profile_types id; Type: DEFAULT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.storage_profile_types ALTER COLUMN id SET DEFAULT nextval('ngcloud_ru.storage_profile_types_id_seq'::regclass);
+
+
+--
+-- TOC entry 3255 (class 2606 OID 1893987)
+-- Name: capacity_resource capacity_resource_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.capacity_resource
+ ADD CONSTRAINT capacity_resource_pkey PRIMARY KEY (vdc_id, "timestamp");
+
+
+--
+-- TOC entry 3257 (class 2606 OID 1893997)
+-- Name: capacity_storage capacity_storage_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.capacity_storage
+ ADD CONSTRAINT capacity_storage_pkey PRIMARY KEY (vdc_id, id, "timestamp");
+
+
+--
+-- TOC entry 3249 (class 2606 OID 1893972)
+-- Name: storage_profile_types storage_profile_types_name_key; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.storage_profile_types
+ ADD CONSTRAINT storage_profile_types_name_key UNIQUE (name);
+
+
+--
+-- TOC entry 3251 (class 2606 OID 1893970)
+-- Name: storage_profile_types storage_profile_types_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.storage_profile_types
+ ADD CONSTRAINT storage_profile_types_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3247 (class 2606 OID 1893963)
+-- Name: tenant tenant_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.tenant
+ ADD CONSTRAINT tenant_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3253 (class 2606 OID 1893977)
+-- Name: vdc vdc_pkey; Type: CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.vdc
+ ADD CONSTRAINT vdc_pkey PRIMARY KEY (id);
+
+
+--
+-- TOC entry 3259 (class 2606 OID 1893988)
+-- Name: capacity_resource capacity_resource_vdc_id_fkey; Type: FK CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.capacity_resource
+ ADD CONSTRAINT capacity_resource_vdc_id_fkey FOREIGN KEY (vdc_id) REFERENCES ngcloud_ru.vdc(id) ON DELETE CASCADE;
+
+
+--
+-- TOC entry 3260 (class 2606 OID 1894003)
+-- Name: capacity_storage capacity_storage_storage_profile_types_id_fkey; Type: FK CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.capacity_storage
+ ADD CONSTRAINT capacity_storage_storage_profile_types_id_fkey FOREIGN KEY (storage_profile_types_id) REFERENCES ngcloud_ru.storage_profile_types(id);
+
+
+--
+-- TOC entry 3261 (class 2606 OID 1893998)
+-- Name: capacity_storage capacity_storage_vdc_id_fkey; Type: FK CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.capacity_storage
+ ADD CONSTRAINT capacity_storage_vdc_id_fkey FOREIGN KEY (vdc_id) REFERENCES ngcloud_ru.vdc(id) ON DELETE CASCADE;
+
+
+--
+-- TOC entry 3258 (class 2606 OID 1893978)
+-- Name: vdc vdc_tenant_id_fkey; Type: FK CONSTRAINT; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+ALTER TABLE ONLY ngcloud_ru.vdc
+ ADD CONSTRAINT vdc_tenant_id_fkey FOREIGN KEY (tenant_id) REFERENCES ngcloud_ru.tenant(id);
+
+
+--
+-- TOC entry 3410 (class 0 OID 0)
+-- Dependencies: 222
+-- Name: TABLE capacity_resource; Type: ACL; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+GRANT SELECT ON TABLE ngcloud_ru.capacity_resource TO grafanabilling;
+
+
+--
+-- TOC entry 3411 (class 0 OID 0)
+-- Dependencies: 223
+-- Name: TABLE capacity_storage; Type: ACL; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+GRANT SELECT ON TABLE ngcloud_ru.capacity_storage TO grafanabilling;
+
+
+--
+-- TOC entry 3412 (class 0 OID 0)
+-- Dependencies: 220
+-- Name: TABLE storage_profile_types; Type: ACL; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+GRANT SELECT ON TABLE ngcloud_ru.storage_profile_types TO grafanabilling;
+
+
+--
+-- TOC entry 3414 (class 0 OID 0)
+-- Dependencies: 218
+-- Name: TABLE tenant; Type: ACL; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+GRANT SELECT ON TABLE ngcloud_ru.tenant TO grafanabilling;
+
+
+--
+-- TOC entry 3415 (class 0 OID 0)
+-- Dependencies: 221
+-- Name: TABLE vdc; Type: ACL; Schema: ngcloud_ru; Owner: vc_billing
+--
+
+GRANT SELECT ON TABLE ngcloud_ru.vdc TO grafanabilling;
+
+
+-- Completed on 2025-09-15 09:53:18
+
+--
+-- PostgreSQL database dump complete
+--
+
diff --git a/etc/db/indexes.sql b/etc/db/indexes.sql
new file mode 100644
index 0000000..9c589d1
--- /dev/null
+++ b/etc/db/indexes.sql
@@ -0,0 +1,9 @@
+CREATE INDEX ON ngcloud_ru.capacity_resource (timestamp);
+CREATE INDEX ON ngcloud_ru.capacity_storage (timestamp);
+
+CREATE INDEX ON s3billing.bucket_stat (timestamp_addition);
+CREATE INDEX ON s3billing.usage_bucket_by_user (time);
+
+CREATE INDEX ON gpu.vm (dt_load);
+CREATE INDEX ON gpu.vm_power_state (ts);
+
diff --git a/mod/payg.cfm.bak b/etc/trash/payg.cfm.bak
similarity index 100%
rename from mod/payg.cfm.bak
rename to etc/trash/payg.cfm.bak
diff --git a/payg2.cfm.bak b/etc/trash/payg2.cfm.bak
similarity index 100%
rename from payg2.cfm.bak
rename to etc/trash/payg2.cfm.bak
diff --git a/mod/crm_contract.cfm b/mod/crm_contract.cfm
new file mode 100644
index 0000000..0b2fbf1
--- /dev/null
+++ b/mod/crm_contract.cfm
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/mod/payg.cfm b/mod/payg.cfm
index 208cbaa..54910fe 100644
--- a/mod/payg.cfm
+++ b/mod/payg.cfm
@@ -7,277 +7,352 @@
-
+
+
+
+
+
+
+
-
-
-
-
-
- select * from (
- values
- ('Объектное хранилище S3 CEPH','Дисковое пространство: Объем хранения (HOT)','paas.s3.ceph.vol-m','ГБайт',1.80,0)
- ,('Объектное хранилище S3 CEPH','Исходящий трафик (HOT)','paas.s3.ceph.trf-m','ГБайт',1.50,0)
- ,('Объектное хранилище S3 CEPH','Запросы GET, HEAD, OPTIONS (HOT)','paas.s3.ceph.get-m','10тыс.шт.',0.35,0)
- ,('Объектное хранилище S3 CEPH','Запросы PUT, POST, PATCH (HOT)','paas.s3.ceph.put-m','10тыс.шт.',4.50,0)
-
- ,('Объектное хранилище S3 CEPH','Дисковое пространство: Объем хранения (COLD)','paas.s3.cphc.vol-m','ГБайт',0.84*1.2,0)
- ,('Объектное хранилище S3 CEPH','Исходящий трафик (COLD)','paas.s3.cphc.trf-m','ГБайт',1.25*1.2,0)
- ,('Объектное хранилище S3 CEPH','Запросы GET, HEAD, OPTIONS (COLD)','paas.s3.cphc.get-m','10тыс.шт.',0.8*1.2,0)
- ,('Объектное хранилище S3 CEPH','Запросы PUT, POST, PATCH (COLD)','paas.s3.cphc.put-m','10тыс.шт.',9.7*1.2,0)
- ) as
- s (svc, component, code, unit, price, discount)
- order by code
-
-
-
-
-
- select 'WZ'||to_char(tenant.wzcode,'FM00000') as wz, vdc.name as vdc_name,
- case
- when vdc.name like '%-v1cl1%' then 'iaas.ngc.i29'
- when vdc.name like '%-v1cl2%' then 'iaas.ngc.i31'
- when vdc.name like '%-v1cl4%' then 'iaas.ngc.a28'
- when vdc.name like '%-v1cl6%' then 'iaas.ngc.i28'
- else '['||vdc.name||']' end as code,
- sum(cpu_used/cpu_speed)/4. as core_h,
- sum(mem_used)/1024/4. as gb_h
- from ngcloud_ru.capacity_resource
- join ngcloud_ru.vdc on capacity_resource.vdc_id=vdc.id
- join ngcloud_ru.tenant on tenant.id=vdc.tenant_id
- where tenant.wzcode =
- AND capacity_resource.timestamp >=
- AND capacity_resource.timestamp <
- group by tenant.wzcode, vdc.name
- order by tenant.wzcode, vdc.name;
-
-
+
-
+ #getTickCount() - request.startTickCount#
+
select max(capacity_resource.timestamp) as dt_load from ngcloud_ru.capacity_resource
+
+ #getTickCount() - request.startTickCount#
+
+
+
-
-
-
- select 'WZ'||to_char(tenant.wzcode,'FM00000') as wz, vdc.name as vdc_name,
- case
- WHEN vdc.name LIKE '%-v1cl1%' THEN 'iaas.ngc.i29'
- WHEN vdc.name LIKE '%-v1cl2%' THEN 'iaas.ngc.i31'
- WHEN vdc.name LIKE '%-v1cl4%' THEN 'iaas.ngc.a28'
- WHEN vdc.name LIKE '%-v1cl6%' THEN 'iaas.ngc.i28'
- ELSE '['||vdc.name||']' END
- || CASE
- WHEN storage_profile_types.name ILIKE '%-SSD%' THEN '.ssd-m'
- WHEN storage_profile_types.name ILIKE '%-SAS' THEN '.sas-m'
- WHEN storage_profile_types.name ILIKE '%-SATA' THEN '.sata-m'
- ELSE '.['|| storage_profile_types.name ||']' END
- as code,
- storage_profile_types.name, -- *** это не тип, а профайл
- sum("limit")/1024./4 as gb_h_limit, -- 4 потому, что сбор раз в 15 минут
- sum(used)/1024./4 as gb_h_used
- from ngcloud_ru.capacity_storage
- join ngcloud_ru.vdc on capacity_storage.vdc_id=vdc.id
- join ngcloud_ru.tenant on tenant.id=vdc.tenant_id
- join ngcloud_ru.storage_profile_types on capacity_storage.storage_profile_types_id=storage_profile_types.id
- where tenant.wzcode =
- AND capacity_storage.timestamp >=
- AND capacity_storage.timestamp <
- group by tenant.wzcode, vdc.name, storage_profile_types.name
- order by tenant.wzcode, vdc.name, storage_profile_types.name;
-
select max(capacity_storage.timestamp) as dt_load from ngcloud_ru.capacity_storage
+ #getTickCount() - request.startTickCount#
-
-
-
- select /* *** ниже дублирование кода агрегации - round ceil etc, обратить внимание при правке */
- (sum(bucket_stat.usage_rgw_main_size_actual)/) as vol_B
- ,ceil(sum(bucket_stat.usage_rgw_main_size_actual)//1024/1024/1024) as vol_GB
- ,greatest(ceil(sum(bucket_stat.usage_rgw_main_size_actual)/
- /1024/1024/1024)-
- case when bucket_stat.placement_id = 1 then 1 else 0 end, 0) as vol_GB_free_tier_subtracted /*считается не в точности так, как в функции*/
- ,case
- when bucket_stat.placement_id = 1 then 'paas.s3.ceph'
- when bucket_stat.placement_id = 2 then 'paas.s3.cphc'
- else '['|| TO_CHAR(bucket_stat.placement_id,'FM9') ||']' end as code
- --,bucket_stat.placement_id
- ,'WZ'||lpad(bucket_stat.owner, 5, '0') as wz -- *** здесь не число, а строка, поэтому другая формула обратной сборки WZ
-
- from s3billing.bucket_stat
- join s3billing.placement ON s3billing.placement.id=bucket_stat.placement_id
- join s3billing.bucket_info ON bucket_info.id=bucket_stat.bucket_id
- where bucket_stat.placement_id in (1,2)
- AND bucket_stat.owner =
- AND bucket_stat.timestamp_addition >=
- AND bucket_stat.timestamp_addition <
- group by bucket_stat.owner, bucket_stat.placement_id
- order by bucket_stat.owner, bucket_stat.placement_id;
-
-
-
-
-
-
-
select max(timestamp_addition) as dt_load from s3billing.bucket_stat
-
-
-select
- sum(
- CASE WHEN
- (category.name LIKE 'get%'
- OR category.name LIKE 'head%'
- OR category.name LIKE 'options%'
- ) THEN ops ELSE 0 END
- ) as get
- ,ceil(sum(
- CASE WHEN
- (category.name LIKE 'get%'
- OR category.name LIKE 'head%'
- OR category.name LIKE 'options%'
- ) THEN ops ELSE 0 END
- )/10000) as get_10k
- ,greatest(ceil(sum(
- CASE WHEN
- (category.name LIKE 'get%'
- OR category.name LIKE 'head%'
- OR category.name LIKE 'options%'
- ) THEN ops ELSE 0 END
- )/10000) - CASE WHEN bucket_info.placement_id = 1 THEN 10 ELSE 0 END, 0
- ) as get_10k_free_tier_subtracted
-
- ,sum(
- CASE WHEN
- (category.name LIKE 'put%'
- OR category.name LIKE 'post%'
- OR category.name LIKE 'patch%'
- OR category.name LIKE 'list%'
- ) THEN ops ELSE 0 END
- ) as put
- ,ceil(sum(
- CASE WHEN
- (category.name LIKE 'put%'
- OR category.name LIKE 'post%'
- OR category.name LIKE 'patch%'
- OR category.name LIKE 'list%'
- ) THEN ops ELSE 0 END
- )/10000) as put_10k
- ,greatest(ceil(sum(
- CASE WHEN
- (category.name LIKE 'put%'
- OR category.name LIKE 'post%'
- OR category.name LIKE 'patch%'
- OR category.name LIKE 'list%'
- ) THEN ops ELSE 0 END
- )/10000) - CASE WHEN bucket_info.placement_id = 1 THEN 1 ELSE 0 END, 0
- ) as put_10k_free_tier_subtracted
-
- ,(sum(bytes_sent)) as bytes_sent
- ,ceil(sum(bytes_sent)/1024/1024/1024) as bytes_sent_GB
- ,greatest(ceil(sum(bytes_sent)/1024/1024/1024) - CASE WHEN bucket_info.placement_id = 1 THEN 100 ELSE 0 END, 0
- ) as bytes_sent_GB_free_tier_subtracted
-
- ,case
- when bucket_info.placement_id = 1 then 'paas.s3.ceph'
- when bucket_info.placement_id = 2 then 'paas.s3.cphc'
- else '['|| TO_CHAR(bucket_info.placement_id,'FM9') ||']' end as code --*** зачем делать там ключ bigint
- ,bucket_info.placement_id
- --category.name, bucket_info.name
- ,'WZ'||lpad(user_info.name, 5, '0') as wz
- from s3billing.usage_bucket_by_user
- join s3billing.user_info on usage_bucket_by_user.user_id=user_info.id
- join s3billing.category on usage_bucket_by_user.category_id=category.id
- join s3billing.bucket_info on usage_bucket_by_user.bucketid=bucket_info.id
- join s3billing.placement on bucket_info.placement_id=placement.id
- where 1=1
- AND user_info.name =
- AND usage_bucket_by_user.time >=
- AND usage_bucket_by_user.time <
- group by user_info.name, bucket_info.placement_id
- order by user_info.name, bucket_info.placement_id;
-
-
-
+ #getTickCount() - request.startTickCount#
+
select max(time) as dt_load from s3billing.usage_bucket_by_user
+
+ #getTickCount() - request.startTickCount#
+
+
+
-
-select wz, code || '.vcpu-m' as code, core_h as raw_metric, core_h as metric, core_h as chargeable_metric from qComputing
-union all
-select wz, code || '.ram-m' as code, gb_h as raw_metric, gb_h as metric, gb_h as chargeable_metric from qComputing
-union all
-select wz, code, gb_h_used as raw_metric, gb_h_used as metric, gb_h_used as chargeable_metric from qStorage
-union all
-select wz, code || '.vol-m', vol_b as raw_metric, vol_gb as metric, vol_GB_free_tier_subtracted as chargeable_metric from qS3Vol
-union all
-select wz, code || '.get-m', get as raw_metric, get_10k as metric, get_10k_free_tier_subtracted as chargeable_metric from qS3OpsTrf
-union all
-select wz, code || '.put-m', put as raw_metric, put_10k as metric, put_10k_free_tier_subtracted as chargeable_metric from qS3OpsTrf
-union all
-select wz, code || '.trf-m', bytes_sent as raw_metric, bytes_sent_gb as metric, bytes_sent_gb_free_tier_subtracted as chargeable_metric from qS3OpsTrf
+
+
+
+
+
+select catalogName as svc, component, fullCode as code, measureShort as unit
+, priceWVat as price, (discount + serviceDiscount - discount*serviceDiscount/100) as discount
+,serviceStart, serviceEnd, serviceHash
+from qSpecification
-
+
+
+
+
+
+
+
+
+ select 'WZ'||to_char(tenant.wzcode,'FM00000') as wz, vdc.name as vdc_name,
+ case
+ when vdc.name like '%-v1cl1%' then 'iaas.ngc.i29'
+ when vdc.name like '%-v1cl2%' then 'iaas.ngc.i31'
+ when vdc.name like '%-v1cl4%' then 'iaas.ngc.a28'
+ when vdc.name like '%-v1cl6%' then 'iaas.ngc.i28'
+ else '['||vdc.name||']' end as code,
+ sum(cpu_used/cpu_speed)/4. as core_h,
+ sum(mem_used)/1024/4. as gb_h
+ from ngcloud_ru.capacity_resource
+ join ngcloud_ru.vdc on capacity_resource.vdc_id=vdc.id
+ join ngcloud_ru.tenant on tenant.id=vdc.tenant_id
+ where tenant.wzcode =
+ AND capacity_resource.timestamp::date =
+
+ group by tenant.wzcode, vdc.name
+ order by tenant.wzcode, vdc.name;
+
+
+
+ #getTickCount() - request.startTickCount#
+
+
+
+
+
+
+ select 'WZ'||to_char(tenant.wzcode,'FM00000') as wz, vdc.name as vdc_name,
+ case
+ WHEN vdc.name LIKE '%-v1cl1%' THEN 'iaas.ngc.i29'
+ WHEN vdc.name LIKE '%-v1cl2%' THEN 'iaas.ngc.i31'
+ WHEN vdc.name LIKE '%-v1cl4%' THEN 'iaas.ngc.a28'
+ WHEN vdc.name LIKE '%-v1cl6%' THEN 'iaas.ngc.i28'
+ ELSE '['||vdc.name||']' END
+ || CASE
+ WHEN storage_profile_types.name ILIKE '%-SSD%' THEN '.ssd-m'
+ WHEN storage_profile_types.name ILIKE '%-SAS' THEN '.sas-m'
+ WHEN storage_profile_types.name ILIKE '%-SATA' THEN '.sata-m'
+ ELSE '.['|| storage_profile_types.name ||']' END
+ as code,
+ storage_profile_types.name, -- *** это не тип, а профайл
+ sum("limit")/1024./4 as gb_h_limit, -- 4 потому, что сбор раз в 15 минут
+ sum(used)/1024./4 as gb_h_used
+ from ngcloud_ru.capacity_storage
+ join ngcloud_ru.vdc on capacity_storage.vdc_id=vdc.id
+ join ngcloud_ru.tenant on tenant.id=vdc.tenant_id
+ join ngcloud_ru.storage_profile_types on capacity_storage.storage_profile_types_id=storage_profile_types.id
+ where tenant.wzcode =
+ AND capacity_storage.timestamp ::date =
+ group by tenant.wzcode, vdc.name, storage_profile_types.name
+ order by tenant.wzcode, vdc.name, storage_profile_types.name;
+
+
+
+
+
+
+ select /* *** ниже дублирование кода агрегации - round ceil etc, обратить внимание при правке */
+ (sum(bucket_stat.usage_rgw_main_size_actual)/) as vol_B
+ ,ceil(sum(bucket_stat.usage_rgw_main_size_actual)//1024/1024/1024) as vol_GB
+ ,greatest(ceil(sum(bucket_stat.usage_rgw_main_size_actual)/
+ /1024/1024/1024)-
+ case when bucket_stat.placement_id = 1 then 1 else 0 end, 0) as vol_GB_free_tier_subtracted /*считается не в точности так, как в функции*/
+ ,case
+ when bucket_stat.placement_id = 1 then 'paas.s3.ceph'
+ when bucket_stat.placement_id = 2 then 'paas.s3.cphc'
+ else '['|| TO_CHAR(bucket_stat.placement_id,'FM9') ||']' end as code
+ --,bucket_stat.placement_id
+ ,'WZ'||lpad(bucket_stat.owner, 5, '0') as wz -- *** здесь не число, а строка, поэтому другая формула обратной сборки WZ
+
+ from s3billing.bucket_stat
+ join s3billing.placement ON s3billing.placement.id=bucket_stat.placement_id
+ join s3billing.bucket_info ON bucket_info.id=bucket_stat.bucket_id
+ where bucket_stat.placement_id in (1,2)
+ AND bucket_stat.owner =
+ AND bucket_stat.timestamp_addition::date =
+
+ group by bucket_stat.owner, bucket_stat.placement_id
+ order by bucket_stat.owner, bucket_stat.placement_id;
+
+
+
+ #getTickCount() - request.startTickCount#
+
+
+
+
+
+
+ select
+ sum(
+ CASE WHEN
+ (category.name LIKE 'get%'
+ OR category.name LIKE 'head%'
+ OR category.name LIKE 'options%'
+ ) THEN ops ELSE 0 END
+ ) as get
+ ,ceil(sum(
+ CASE WHEN
+ (category.name LIKE 'get%'
+ OR category.name LIKE 'head%'
+ OR category.name LIKE 'options%'
+ ) THEN ops ELSE 0 END
+ )/10000) as get_10k
+ ,greatest(ceil(sum(
+ CASE WHEN
+ (category.name LIKE 'get%'
+ OR category.name LIKE 'head%'
+ OR category.name LIKE 'options%'
+ ) THEN ops ELSE 0 END
+ )/10000) - CASE WHEN bucket_info.placement_id = 1 THEN 10 ELSE 0 END, 0
+ ) as get_10k_free_tier_subtracted
+
+ ,sum(
+ CASE WHEN
+ (category.name LIKE 'put%'
+ OR category.name LIKE 'post%'
+ OR category.name LIKE 'patch%'
+ OR category.name LIKE 'list%'
+ ) THEN ops ELSE 0 END
+ ) as put
+ ,ceil(sum(
+ CASE WHEN
+ (category.name LIKE 'put%'
+ OR category.name LIKE 'post%'
+ OR category.name LIKE 'patch%'
+ OR category.name LIKE 'list%'
+ ) THEN ops ELSE 0 END
+ )/10000) as put_10k
+ ,greatest(ceil(sum(
+ CASE WHEN
+ (category.name LIKE 'put%'
+ OR category.name LIKE 'post%'
+ OR category.name LIKE 'patch%'
+ OR category.name LIKE 'list%'
+ ) THEN ops ELSE 0 END
+ )/10000) - CASE WHEN bucket_info.placement_id = 1 THEN 1 ELSE 0 END, 0
+ ) as put_10k_free_tier_subtracted
+
+ ,(sum(bytes_sent)) as bytes_sent
+ ,ceil(sum(bytes_sent)/1024/1024/1024) as bytes_sent_GB
+ ,greatest(ceil(sum(bytes_sent)/1024/1024/1024) - CASE WHEN bucket_info.placement_id = 1 THEN 100 ELSE 0 END, 0
+ ) as bytes_sent_GB_free_tier_subtracted
+ ,case
+ when bucket_info.placement_id = 1 then 'paas.s3.ceph'
+ when bucket_info.placement_id = 2 then 'paas.s3.cphc'
+ else '['|| TO_CHAR(bucket_info.placement_id,'FM9') ||']' end as code --*** зачем делать там ключ bigint
+ ,bucket_info.placement_id
+ --category.name, bucket_info.name
+ ,'WZ'||lpad(user_info.name, 5, '0') as wz
+ from s3billing.usage_bucket_by_user
+ join s3billing.user_info on usage_bucket_by_user.user_id=user_info.id
+ join s3billing.category on usage_bucket_by_user.category_id=category.id
+ join s3billing.bucket_info on usage_bucket_by_user.bucketid=bucket_info.id
+ join s3billing.placement on bucket_info.placement_id=placement.id
+ where 1=1
+ AND user_info.name =
+ AND usage_bucket_by_user.time::date =
+ group by user_info.name, bucket_info.placement_id
+ order by user_info.name, bucket_info.placement_id;
+
+
+
+ #getTickCount() - request.startTickCount#
+
+
+
+
+
+
+ select wz, code || '.vcpu-m' as code, core_h as raw_metric, core_h as metric, core_h as chargeable_metric from qComputing
+ union all
+ select wz, code || '.ram-m' as code, gb_h as raw_metric, gb_h as metric, gb_h as chargeable_metric from qComputing
+ union all
+ select wz, code, gb_h_used as raw_metric, gb_h_used as metric, gb_h_used as chargeable_metric from qStorage
+ union all
+ select wz, code || '.vol-m', vol_b as raw_metric, vol_gb as metric, vol_GB_free_tier_subtracted as chargeable_metric from qS3Vol
+ union all
+ select wz, code || '.get-m', get as raw_metric, get_10k as metric, get_10k_free_tier_subtracted as chargeable_metric from qS3OpsTrf
+ union all
+ select wz, code || '.put-m', put as raw_metric, put_10k as metric, put_10k_free_tier_subtracted as chargeable_metric from qS3OpsTrf
+ union all
+ select wz, code || '.trf-m', bytes_sent as raw_metric, bytes_sent_gb as metric, bytes_sent_gb_free_tier_subtracted as chargeable_metric from qS3OpsTrf
+
+
+
+ #getTickCount() - request.startTickCount#
+
+
+
+
+
+
+
+
+
+ SELECT
+
+ s.code
+ m.code as m_code
+ s.svc
+ s.component
+ m.chargeable_metric
+ s.unit
+ s.price*(100-s.discount)/100 as discounted_price
+ s.price*(100-s.discount)/100*m.chargeable_metric as charge
+
+
+ s.price
+ s.discount
+ m.raw_metric
+ m.metric
+ s.serviceStart
+ s.serviceEnd
+ s.serviceHash
+ as dt
+
+
+ FROM qSpec as s, qUnifiedMetric as m
+ WHERE m.wz= AND s.code=m.code
+ AND s.serviceStart <=
+ AND ( <= s.serviceEnd OR s.serviceEnd IS NULL)
+ order by s.code
+
+
+
+
+
+ select * from qTotal
+ union all
+ select * from qCharge
+
+
+
+
+
+
+
+
+ #getTickCount() - request.startTickCount#
+
+
+
+
+ #getTickCount() - request.startTickCount#
-
-
-
-SELECT
-
- s.code
- m.code as m_code
- s.svc
- s.component
- m.chargeable_metric
- s.unit
- s.price*(100-s.discount)/100 as discounted_price
- s.price*(100-s.discount)/100*m.chargeable_metric as charge
-
-
- s.price
- s.discount
- m.raw_metric
- m.metric
-
-
-
-FROM qSpec as s, qUnifiedMetric as m
-WHERE m.wz= AND s.code=m.code
-order by s.code
-
-
-
-
-
-
+
+
+
+
diff --git a/mod/payg.cfm.1.bak b/mod/payg.cfm.1.bak
new file mode 100644
index 0000000..57c4604
--- /dev/null
+++ b/mod/payg.cfm.1.bak
@@ -0,0 +1,346 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #getTickCount() - request.startTickCount#
+
+
+
+
+
+
+
+
+select catalogName as svc, component, fullCode as code, measureShort as unit
+, priceWVat as price, (discount + serviceDiscount - discount*serviceDiscount/100) as discount
+,serviceStart, serviceEnd
+from qSpecification
+
+
+
+
+
+ select 'WZ'||to_char(tenant.wzcode,'FM00000') as wz, vdc.name as vdc_name,
+ case
+ when vdc.name like '%-v1cl1%' then 'iaas.ngc.i29'
+ when vdc.name like '%-v1cl2%' then 'iaas.ngc.i31'
+ when vdc.name like '%-v1cl4%' then 'iaas.ngc.a28'
+ when vdc.name like '%-v1cl6%' then 'iaas.ngc.i28'
+ else '['||vdc.name||']' end as code,
+ sum(cpu_used/cpu_speed)/4. as core_h,
+ sum(mem_used)/1024/4. as gb_h
+ from ngcloud_ru.capacity_resource
+ join ngcloud_ru.vdc on capacity_resource.vdc_id=vdc.id
+ join ngcloud_ru.tenant on tenant.id=vdc.tenant_id
+ where tenant.wzcode =
+ AND capacity_resource.timestamp >=
+ AND capacity_resource.timestamp <
+ group by tenant.wzcode, vdc.name
+ order by tenant.wzcode, vdc.name;
+
+
+
+ #getTickCount() - request.startTickCount#
+
+
+
+
+
+ select max(capacity_resource.timestamp) as dt_load from ngcloud_ru.capacity_resource
+
+
+
+ #getTickCount() - request.startTickCount#
+
+
+
+
+
+
+
+ select 'WZ'||to_char(tenant.wzcode,'FM00000') as wz, vdc.name as vdc_name,
+ case
+ WHEN vdc.name LIKE '%-v1cl1%' THEN 'iaas.ngc.i29'
+ WHEN vdc.name LIKE '%-v1cl2%' THEN 'iaas.ngc.i31'
+ WHEN vdc.name LIKE '%-v1cl4%' THEN 'iaas.ngc.a28'
+ WHEN vdc.name LIKE '%-v1cl6%' THEN 'iaas.ngc.i28'
+ ELSE '['||vdc.name||']' END
+ || CASE
+ WHEN storage_profile_types.name ILIKE '%-SSD%' THEN '.ssd-m'
+ WHEN storage_profile_types.name ILIKE '%-SAS' THEN '.sas-m'
+ WHEN storage_profile_types.name ILIKE '%-SATA' THEN '.sata-m'
+ ELSE '.['|| storage_profile_types.name ||']' END
+ as code,
+ storage_profile_types.name, -- *** это не тип, а профайл
+ sum("limit")/1024./4 as gb_h_limit, -- 4 потому, что сбор раз в 15 минут
+ sum(used)/1024./4 as gb_h_used
+ from ngcloud_ru.capacity_storage
+ join ngcloud_ru.vdc on capacity_storage.vdc_id=vdc.id
+ join ngcloud_ru.tenant on tenant.id=vdc.tenant_id
+ join ngcloud_ru.storage_profile_types on capacity_storage.storage_profile_types_id=storage_profile_types.id
+ where tenant.wzcode =
+ AND capacity_storage.timestamp >=
+ AND capacity_storage.timestamp <
+ group by tenant.wzcode, vdc.name, storage_profile_types.name
+ order by tenant.wzcode, vdc.name, storage_profile_types.name;
+
+
+ select max(capacity_storage.timestamp) as dt_load from ngcloud_ru.capacity_storage
+
+
+
+ #getTickCount() - request.startTickCount#
+
+
+
+
+
+
+
+ select /* *** ниже дублирование кода агрегации - round ceil etc, обратить внимание при правке */
+ (sum(bucket_stat.usage_rgw_main_size_actual)/) as vol_B
+ ,ceil(sum(bucket_stat.usage_rgw_main_size_actual)//1024/1024/1024) as vol_GB
+ ,greatest(ceil(sum(bucket_stat.usage_rgw_main_size_actual)/
+ /1024/1024/1024)-
+ case when bucket_stat.placement_id = 1 then 1 else 0 end, 0) as vol_GB_free_tier_subtracted /*считается не в точности так, как в функции*/
+ ,case
+ when bucket_stat.placement_id = 1 then 'paas.s3.ceph'
+ when bucket_stat.placement_id = 2 then 'paas.s3.cphc'
+ else '['|| TO_CHAR(bucket_stat.placement_id,'FM9') ||']' end as code
+ --,bucket_stat.placement_id
+ ,'WZ'||lpad(bucket_stat.owner, 5, '0') as wz -- *** здесь не число, а строка, поэтому другая формула обратной сборки WZ
+
+ from s3billing.bucket_stat
+ join s3billing.placement ON s3billing.placement.id=bucket_stat.placement_id
+ join s3billing.bucket_info ON bucket_info.id=bucket_stat.bucket_id
+ where bucket_stat.placement_id in (1,2)
+ AND bucket_stat.owner =
+ AND bucket_stat.timestamp_addition >=
+ AND bucket_stat.timestamp_addition <
+ group by bucket_stat.owner, bucket_stat.placement_id
+ order by bucket_stat.owner, bucket_stat.placement_id;
+
+
+
+ #getTickCount() - request.startTickCount#
+
+
+
+
+
+ select max(timestamp_addition) as dt_load from s3billing.bucket_stat
+
+
+
+ #getTickCount() - request.startTickCount#
+
+
+
+
+
+select
+ sum(
+ CASE WHEN
+ (category.name LIKE 'get%'
+ OR category.name LIKE 'head%'
+ OR category.name LIKE 'options%'
+ ) THEN ops ELSE 0 END
+ ) as get
+ ,ceil(sum(
+ CASE WHEN
+ (category.name LIKE 'get%'
+ OR category.name LIKE 'head%'
+ OR category.name LIKE 'options%'
+ ) THEN ops ELSE 0 END
+ )/10000) as get_10k
+ ,greatest(ceil(sum(
+ CASE WHEN
+ (category.name LIKE 'get%'
+ OR category.name LIKE 'head%'
+ OR category.name LIKE 'options%'
+ ) THEN ops ELSE 0 END
+ )/10000) - CASE WHEN bucket_info.placement_id = 1 THEN 10 ELSE 0 END, 0
+ ) as get_10k_free_tier_subtracted
+
+ ,sum(
+ CASE WHEN
+ (category.name LIKE 'put%'
+ OR category.name LIKE 'post%'
+ OR category.name LIKE 'patch%'
+ OR category.name LIKE 'list%'
+ ) THEN ops ELSE 0 END
+ ) as put
+ ,ceil(sum(
+ CASE WHEN
+ (category.name LIKE 'put%'
+ OR category.name LIKE 'post%'
+ OR category.name LIKE 'patch%'
+ OR category.name LIKE 'list%'
+ ) THEN ops ELSE 0 END
+ )/10000) as put_10k
+ ,greatest(ceil(sum(
+ CASE WHEN
+ (category.name LIKE 'put%'
+ OR category.name LIKE 'post%'
+ OR category.name LIKE 'patch%'
+ OR category.name LIKE 'list%'
+ ) THEN ops ELSE 0 END
+ )/10000) - CASE WHEN bucket_info.placement_id = 1 THEN 1 ELSE 0 END, 0
+ ) as put_10k_free_tier_subtracted
+
+ ,(sum(bytes_sent)) as bytes_sent
+ ,ceil(sum(bytes_sent)/1024/1024/1024) as bytes_sent_GB
+ ,greatest(ceil(sum(bytes_sent)/1024/1024/1024) - CASE WHEN bucket_info.placement_id = 1 THEN 100 ELSE 0 END, 0
+ ) as bytes_sent_GB_free_tier_subtracted
+
+ ,case
+ when bucket_info.placement_id = 1 then 'paas.s3.ceph'
+ when bucket_info.placement_id = 2 then 'paas.s3.cphc'
+ else '['|| TO_CHAR(bucket_info.placement_id,'FM9') ||']' end as code --*** зачем делать там ключ bigint
+ ,bucket_info.placement_id
+ --category.name, bucket_info.name
+ ,'WZ'||lpad(user_info.name, 5, '0') as wz
+ from s3billing.usage_bucket_by_user
+ join s3billing.user_info on usage_bucket_by_user.user_id=user_info.id
+ join s3billing.category on usage_bucket_by_user.category_id=category.id
+ join s3billing.bucket_info on usage_bucket_by_user.bucketid=bucket_info.id
+ join s3billing.placement on bucket_info.placement_id=placement.id
+ where 1=1
+ AND user_info.name =
+ AND usage_bucket_by_user.time >=
+ AND usage_bucket_by_user.time <
+ group by user_info.name, bucket_info.placement_id
+ order by user_info.name, bucket_info.placement_id;
+
+
+
+ #getTickCount() - request.startTickCount#
+
+
+
+
+
+ select max(time) as dt_load from s3billing.usage_bucket_by_user
+
+
+
+ #getTickCount() - request.startTickCount#
+
+
+
+
+
+
+select wz, code || '.vcpu-m' as code, core_h as raw_metric, core_h as metric, core_h as chargeable_metric from qComputing
+union all
+select wz, code || '.ram-m' as code, gb_h as raw_metric, gb_h as metric, gb_h as chargeable_metric from qComputing
+union all
+select wz, code, gb_h_used as raw_metric, gb_h_used as metric, gb_h_used as chargeable_metric from qStorage
+union all
+select wz, code || '.vol-m', vol_b as raw_metric, vol_gb as metric, vol_GB_free_tier_subtracted as chargeable_metric from qS3Vol
+union all
+select wz, code || '.get-m', get as raw_metric, get_10k as metric, get_10k_free_tier_subtracted as chargeable_metric from qS3OpsTrf
+union all
+select wz, code || '.put-m', put as raw_metric, put_10k as metric, put_10k_free_tier_subtracted as chargeable_metric from qS3OpsTrf
+union all
+select wz, code || '.trf-m', bytes_sent as raw_metric, bytes_sent_gb as metric, bytes_sent_gb_free_tier_subtracted as chargeable_metric from qS3OpsTrf
+
+
+
+ #getTickCount() - request.startTickCount#
+
+
+
+
+
+
+
+
+
+
+
+
+SELECT
+
+ s.code
+ m.code as m_code
+ s.svc
+ s.component
+ m.chargeable_metric
+ s.unit
+ s.price*(100-s.discount)/100 as discounted_price
+ s.price*(100-s.discount)/100*m.chargeable_metric as charge
+
+
+ s.price
+ s.discount
+ m.raw_metric
+ m.metric
+
+
+
+FROM qSpec as s, qUnifiedMetric as m
+WHERE m.wz= AND s.code=m.code
+order by s.code
+
+
+
+ #getTickCount() - request.startTickCount#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/payg.cfm b/payg.cfm
index 39178ff..49e11e5 100644
--- a/payg.cfm
+++ b/payg.cfm
@@ -10,6 +10,7 @@
+
@@ -49,12 +50,12 @@
Период с
по
-
+
-
+
#dateFormat(report.qS3OpsTrfAge.dt_load,
|
- Артикул |
- Кол-во (метрика) |
+ Артикул |
+ Кол-во (метрика)
+ | Оплачиваемый объем |
Ед.изм. |
- Цена ₽ GPL, с НДС |
+ Цена ₽ с НДС |
Стоимость ₽ с НДС |
|
@@ -101,7 +103,7 @@ S3 операции и трафик: #dateFormat(report.qS3OpsTrfAge.dt_load,
Ключ строки | --->
- Оплачиваемый объем |
+
- #metric# |
+