diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 206a7734c8..a3cdb5cde6 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -3,6 +3,15 @@ Change Log All notable changes to this project will be documented in this file. The format is based on `Keep a Changelog `_. +==================== +2.14.3 - 2020-05-19 +==================== + +Added +----- +* Support for returning the private IP of a private endpoint database in the Database service +* Support for native JWT validation in the API Gateway service + ==================== 2.14.2 - 2020-05-12 ==================== diff --git a/docs/api/apigateway.rst b/docs/api/apigateway.rst index 070c40b535..e697400c14 100644 --- a/docs/api/apigateway.rst +++ b/docs/api/apigateway.rst @@ -48,9 +48,17 @@ Apigateway oci.apigateway.models.GatewaySummary oci.apigateway.models.HTTPBackend oci.apigateway.models.HeaderFieldSpecification + oci.apigateway.models.JsonWebKey + oci.apigateway.models.JsonWebTokenClaim + oci.apigateway.models.JwtAuthenticationPolicy oci.apigateway.models.OracleFunctionBackend + oci.apigateway.models.PemEncodedPublicKey + oci.apigateway.models.PublicKeySet oci.apigateway.models.RateLimitingPolicy + oci.apigateway.models.RemoteJsonWebKeySet oci.apigateway.models.RouteAuthorizationPolicy + oci.apigateway.models.StaticPublicKey + oci.apigateway.models.StaticPublicKeySet oci.apigateway.models.StockResponseBackend oci.apigateway.models.UpdateDeploymentDetails oci.apigateway.models.UpdateGatewayDetails diff --git a/docs/api/apigateway/models/oci.apigateway.models.JsonWebKey.rst b/docs/api/apigateway/models/oci.apigateway.models.JsonWebKey.rst new file mode 100644 index 0000000000..861dcadb5f --- /dev/null +++ b/docs/api/apigateway/models/oci.apigateway.models.JsonWebKey.rst @@ -0,0 +1,11 @@ +JsonWebKey +========== + +.. currentmodule:: oci.apigateway.models + +.. autoclass:: JsonWebKey + :show-inheritance: + :special-members: __init__ + :members: + :undoc-members: + :inherited-members: \ No newline at end of file diff --git a/docs/api/apigateway/models/oci.apigateway.models.JsonWebTokenClaim.rst b/docs/api/apigateway/models/oci.apigateway.models.JsonWebTokenClaim.rst new file mode 100644 index 0000000000..f8b955f54d --- /dev/null +++ b/docs/api/apigateway/models/oci.apigateway.models.JsonWebTokenClaim.rst @@ -0,0 +1,11 @@ +JsonWebTokenClaim +================= + +.. currentmodule:: oci.apigateway.models + +.. autoclass:: JsonWebTokenClaim + :show-inheritance: + :special-members: __init__ + :members: + :undoc-members: + :inherited-members: \ No newline at end of file diff --git a/docs/api/apigateway/models/oci.apigateway.models.JwtAuthenticationPolicy.rst b/docs/api/apigateway/models/oci.apigateway.models.JwtAuthenticationPolicy.rst new file mode 100644 index 0000000000..0e0dc9d40d --- /dev/null +++ b/docs/api/apigateway/models/oci.apigateway.models.JwtAuthenticationPolicy.rst @@ -0,0 +1,11 @@ +JwtAuthenticationPolicy +======================= + +.. currentmodule:: oci.apigateway.models + +.. autoclass:: JwtAuthenticationPolicy + :show-inheritance: + :special-members: __init__ + :members: + :undoc-members: + :inherited-members: \ No newline at end of file diff --git a/docs/api/apigateway/models/oci.apigateway.models.PemEncodedPublicKey.rst b/docs/api/apigateway/models/oci.apigateway.models.PemEncodedPublicKey.rst new file mode 100644 index 0000000000..b955d6a301 --- /dev/null +++ b/docs/api/apigateway/models/oci.apigateway.models.PemEncodedPublicKey.rst @@ -0,0 +1,11 @@ +PemEncodedPublicKey +=================== + +.. currentmodule:: oci.apigateway.models + +.. autoclass:: PemEncodedPublicKey + :show-inheritance: + :special-members: __init__ + :members: + :undoc-members: + :inherited-members: \ No newline at end of file diff --git a/docs/api/apigateway/models/oci.apigateway.models.PublicKeySet.rst b/docs/api/apigateway/models/oci.apigateway.models.PublicKeySet.rst new file mode 100644 index 0000000000..184f2a7cdf --- /dev/null +++ b/docs/api/apigateway/models/oci.apigateway.models.PublicKeySet.rst @@ -0,0 +1,11 @@ +PublicKeySet +============ + +.. currentmodule:: oci.apigateway.models + +.. autoclass:: PublicKeySet + :show-inheritance: + :special-members: __init__ + :members: + :undoc-members: + :inherited-members: \ No newline at end of file diff --git a/docs/api/apigateway/models/oci.apigateway.models.RemoteJsonWebKeySet.rst b/docs/api/apigateway/models/oci.apigateway.models.RemoteJsonWebKeySet.rst new file mode 100644 index 0000000000..5b8b609170 --- /dev/null +++ b/docs/api/apigateway/models/oci.apigateway.models.RemoteJsonWebKeySet.rst @@ -0,0 +1,11 @@ +RemoteJsonWebKeySet +=================== + +.. currentmodule:: oci.apigateway.models + +.. autoclass:: RemoteJsonWebKeySet + :show-inheritance: + :special-members: __init__ + :members: + :undoc-members: + :inherited-members: \ No newline at end of file diff --git a/docs/api/apigateway/models/oci.apigateway.models.StaticPublicKey.rst b/docs/api/apigateway/models/oci.apigateway.models.StaticPublicKey.rst new file mode 100644 index 0000000000..2febb41d26 --- /dev/null +++ b/docs/api/apigateway/models/oci.apigateway.models.StaticPublicKey.rst @@ -0,0 +1,11 @@ +StaticPublicKey +=============== + +.. currentmodule:: oci.apigateway.models + +.. autoclass:: StaticPublicKey + :show-inheritance: + :special-members: __init__ + :members: + :undoc-members: + :inherited-members: \ No newline at end of file diff --git a/docs/api/apigateway/models/oci.apigateway.models.StaticPublicKeySet.rst b/docs/api/apigateway/models/oci.apigateway.models.StaticPublicKeySet.rst new file mode 100644 index 0000000000..33d0d46441 --- /dev/null +++ b/docs/api/apigateway/models/oci.apigateway.models.StaticPublicKeySet.rst @@ -0,0 +1,11 @@ +StaticPublicKeySet +================== + +.. currentmodule:: oci.apigateway.models + +.. autoclass:: StaticPublicKeySet + :show-inheritance: + :special-members: __init__ + :members: + :undoc-members: + :inherited-members: \ No newline at end of file diff --git a/examples/showoci/CHANGELOG.rst b/examples/showoci/CHANGELOG.rst index 6509b966c5..9459f9c004 100755 --- a/examples/showoci/CHANGELOG.rst +++ b/examples/showoci/CHANGELOG.rst @@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file. The format is based on `Keep a Changelog `_. +===================== +20.05.18 - 2020-05-18 +===================== +* Bug Fixed + ===================== 20.05.04 - 2020-05-04 ===================== diff --git a/examples/showoci/showoci.py b/examples/showoci/showoci.py index 8c1957d856..c10457073b 100755 --- a/examples/showoci/showoci.py +++ b/examples/showoci/showoci.py @@ -80,7 +80,7 @@ import argparse import datetime -version = "20.05.04" +version = "20.05.18" ########################################################################## # check OCI version diff --git a/examples/showoci/showoci_output.py b/examples/showoci/showoci_output.py index c66b4a635b..7261591c7e 100755 --- a/examples/showoci/showoci_output.py +++ b/examples/showoci/showoci_output.py @@ -2444,16 +2444,13 @@ def __csv_identity_users(self, users): # Check if credential exist if 'api_keys' in user: - data['api_keys'] = str(', '.join(x['id'] + " - " + x['lifecycle_state'] for x in user['api_keys'])) - + data['api_keys'] = str(', '.join(x['id'] + " - " + x['lifecycle_state'] + " - " + x['time_created'] for x in user['api_keys'])) if 'auth_token' in user: - data['auth_token'] = str(', '.join(x['id'] + " - " + x['description'] for x in user['auth_token'])) - + data['auth_token'] = str(', '.join(x['id'] + " - " + x['description'] + " - " + x['time_created'] for x in user['auth_token'])) if 'secret_key' in user: - data['secret_key'] = str(', '.join(x['id'] + " - " + x['display_name'] for x in user['secret_key'])) - + data['secret_key'] = str(', '.join(x['id'] + " - " + x['display_name'] + " - " + x['time_created'] for x in user['secret_key'])) if 'smtp_cred' in user: - data['smtp_cred'] = str(', '.join(x['id'] + " - " + x['description'] for x in user['smtp_cred'])) + data['smtp_cred'] = str(', '.join(x['id'] + " - " + x['description'] + " - " + x['time_created'] for x in user['smtp_cred'])) self.csv_identity_users.append(data) diff --git a/examples/showoci/showoci_service.py b/examples/showoci/showoci_service.py index 6d2b80d728..ffc44fe6a7 100755 --- a/examples/showoci/showoci_service.py +++ b/examples/showoci/showoci_service.py @@ -4963,9 +4963,9 @@ def __load_object_storage_buckets(self, object_storage, compartments): raise if lp: - for l in lp.items: - val['object_lifecycle'] += " , LifeCycle: " + str(l.name) + ", " + str( - l.action) + ", " + str(l.time_amount) + " " + str(l.time_unit) + for lc in lp.items: + val['object_lifecycle'] += " , LifeCycle: " + str(lc.name) + ", " + str( + lc.action) + ", " + str(lc.time_amount) + " " + str(lc.time_unit) data.append(val) cnt += 1 @@ -5885,7 +5885,10 @@ def __load_database_dbsystems_home_patches(self, database_client, dbhome_id): data = [] try: - dbps = oci.pagination.list_call_get_all_results(database_client.list_db_home_patches, dbhome_id).data + dbps = oci.pagination.list_call_get_all_results( + database_client.list_db_home_patches, + dbhome_id + ).data for dbp in dbps: data.append({'id': dbp.id, 'description': str(dbp.description), 'version': str(dbp.version), 'time_released': str(dbp.time_released), @@ -5896,6 +5899,10 @@ def __load_database_dbsystems_home_patches(self, database_client, dbhome_id): if self.__check_service_error(e.code): return data else: + # Added in order to avoid internal error which happen often here + if 'InternalError' in str(e.code): + print('p', end="") + return data raise except oci.exceptions.RequestException as e: if self.__check_request_error(e): diff --git a/examples/stop_untagged_instances.py b/examples/stop_untagged_instances.py index 52fd21048d..810cdd2dbc 100644 --- a/examples/stop_untagged_instances.py +++ b/examples/stop_untagged_instances.py @@ -45,12 +45,12 @@ def stop_resource(instance_id, region): try: if base_compute.get_instance(instance_id).data.lifecycle_state in 'RUNNING': try: - print('\t\tStopping instance. Stop response code: {1}' + print('\t\tStopping instance {0}. Stop response code: {1}' .format(instance_id, str(base_compute.instance_action(instance_id, 'STOP').status))) except oci.exceptions.ServiceError as e: print('\t\tStopping instance failed. {0}' .format(e)) else: - print('\t\tThe instance was in the incorrect state to stop' .format(instance_id)) + print('\t\tThe instance {} was in the incorrect state to stop' .format(instance_id)) except oci.exceptions.ServiceError as e: print('\t\tStopping instance failed. {0}'.format(e)) @@ -158,7 +158,7 @@ def find_resources_wo_tags(instances_to_stop_list, search_string, tenancy_id): stop_resource(result.identifier, region) except oci.exceptions.ServiceError as e: - print('\t\tThe instance ({0}) could not be retrieved. It may be a ghost Search entry.' + print('\t\tThe instance ({0}) could not be retrieved. It may be a ghost Search entry. {1}' .format(result.display_name, e)) # Only find audit events for those compartments with a stopped instance diff --git a/examples/usage_reports_to_adw/CHANGELOG.rst b/examples/usage_reports_to_adw/CHANGELOG.rst index c923c4c4ab..bc1027a330 100644 --- a/examples/usage_reports_to_adw/CHANGELOG.rst +++ b/examples/usage_reports_to_adw/CHANGELOG.rst @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on `Keep a Changelog `_. +===================== +20.05.18 - 2020-05-18 +===================== +* Added Rate Card with OCI_PRICE_LIST and using API to obtain info, Thanks to Fabio for the Idea and the API +* Added discount and public rate to the cost report + ===================== 20.05.11 - 2020-05-11 ===================== diff --git a/examples/usage_reports_to_adw/apex_demo_app/usage.demo.apex.sql b/examples/usage_reports_to_adw/apex_demo_app/usage.demo.apex.sql index b3e3a96b69..17939566a2 100644 --- a/examples/usage_reports_to_adw/apex_demo_app/usage.demo.apex.sql +++ b/examples/usage_reports_to_adw/apex_demo_app/usage.demo.apex.sql @@ -28,17 +28,17 @@ prompt APPLICATION 100 - OCI Usage and Cost Report -- Application Export: -- Application: 100 -- Name: OCI Usage and Cost Report --- Date and Time: 14:56 Thursday May 7, 2020 +-- Date and Time: 15:06 Thursday May 14, 2020 -- Exported By: ADIZOHAR -- Flashback: 0 -- Export Type: Application Export --- Pages: 8 --- Items: 69 --- Computations: 13 +-- Pages: 9 +-- Items: 70 +-- Computations: 14 -- Processes: 4 --- Regions: 52 +-- Regions: 55 -- Buttons: 5 --- Dynamic Actions: 27 +-- Dynamic Actions: 28 -- Shared Components: -- Logic: -- App Settings: 1 @@ -105,7 +105,7 @@ wwv_flow_api.create_flow( ,p_public_user=>'APEX_PUBLIC_USER' ,p_proxy_server=>nvl(wwv_flow_application_install.get_proxy,'') ,p_no_proxy_domains=>nvl(wwv_flow_application_install.get_no_proxy_domains,'') -,p_flow_version=>'Release 20.05.11' +,p_flow_version=>'Release 20.05.18' ,p_flow_status=>'AVAILABLE_W_EDIT_LINK' ,p_flow_unavailable_text=>'This application is currently unavailable at this time.' ,p_exact_substitutions_only=>'Y' @@ -119,7 +119,7 @@ wwv_flow_api.create_flow( ,p_substitution_string_01=>'APP_NAME' ,p_substitution_value_01=>'OCI Usage and Cost Report' ,p_last_updated_by=>'ADIZOHAR' -,p_last_upd_yyyymmddhh24miss=>'20200507123855' +,p_last_upd_yyyymmddhh24miss=>'20200514145916' ,p_file_prefix => nvl(wwv_flow_application_install.get_static_app_file_prefix,'') ,p_files_version=>3 ,p_ui_type_name => null @@ -173,11 +173,19 @@ wwv_flow_api.create_list_item( ,p_list_item_current_type=>'COLON_DELIMITED_PAGE_LIST' ,p_list_item_current_for_pages=>'5' ); +wwv_flow_api.create_list_item( + p_id=>wwv_flow_api.id(16371791258522236) +,p_list_item_display_sequence=>80 +,p_list_item_link_text=>'Rate Card' +,p_list_item_link_target=>'f?p=&APP_ID.:7:&SESSION.::&DEBUG.' +,p_list_item_current_type=>'COLON_DELIMITED_PAGE_LIST' +,p_list_item_current_for_pages=>'7' +); wwv_flow_api.create_list_item( p_id=>wwv_flow_api.id(12630315850041592) -,p_list_item_display_sequence=>70 +,p_list_item_display_sequence=>90 ,p_list_item_link_text=>'Data Statistics' -,p_list_item_link_target=>'f?p=&APP_ID.:6:&SESSION.::&DEBUG.' +,p_list_item_link_target=>'f?p=&APP_ID.:6:&SESSION.::&DEBUG.::::' ,p_list_item_current_type=>'COLON_DELIMITED_PAGE_LIST' ,p_list_item_current_for_pages=>'6' ); @@ -318,6 +326,13 @@ wwv_flow_api.create_plugin_setting( ,p_plugin=>'NATIVE_COLOR_PICKER' ,p_attribute_01=>'modern' ); +wwv_flow_api.create_plugin_setting( + p_id=>wwv_flow_api.id(16424473540395392) +,p_plugin_type=>'ITEM TYPE' +,p_plugin=>'NATIVE_STAR_RATING' +,p_attribute_01=>'fa-star' +,p_attribute_04=>'#VALUE#' +); end; / prompt --application/shared_components/security/authorizations/administration_rights @@ -10290,6 +10305,7 @@ unistr(' ''
DISCLAIMER \2013 This is not an official Oracle applicatio ' );', '', 'END;')) +,p_attribute_04=>'N' ); end; / @@ -10579,6 +10595,8 @@ wwv_flow_api.create_jet_chart( ,p_hover_behavior=>'none' ,p_stack=>'on' ,p_stack_label=>'on' +,p_connect_nulls=>'Y' +,p_value_position=>'auto' ,p_sorting=>'value-desc' ,p_fill_multi_series_gaps=>true ,p_zoom_and_scroll=>'off' @@ -10586,8 +10604,20 @@ wwv_flow_api.create_jet_chart( ,p_show_series_name=>true ,p_show_group_name=>true ,p_show_value=>true +,p_show_label=>true +,p_show_row=>true +,p_show_start=>true +,p_show_end=>true +,p_show_progress=>true +,p_show_baseline=>true ,p_legend_rendered=>'on' ,p_legend_position=>'bottom' +,p_overview_rendered=>'off' +,p_horizontal_grid=>'auto' +,p_vertical_grid=>'auto' +,p_gauge_orientation=>'circular' +,p_gauge_plot_area=>'on' +,p_show_gauge_value=>true ); wwv_flow_api.create_jet_chart_series( p_id=>wwv_flow_api.id(9906502232740516) @@ -10633,35 +10663,53 @@ wwv_flow_api.create_jet_chart_series( ,p_assigned_to_y2=>'off' ,p_items_label_rendered=>true ,p_items_label_position=>'insideBarEdge' +,p_items_label_display_as=>'PERCENT' ,p_items_label_font_style=>'normal' ,p_items_label_font_size=>'8' +,p_threshold_display=>'onIndicator' ); wwv_flow_api.create_jet_chart_axis( - p_id=>wwv_flow_api.id(9906780581740518) + p_id=>wwv_flow_api.id(9906673387740517) ,p_chart_id=>wwv_flow_api.id(9906423826740515) -,p_axis=>'y' +,p_axis=>'x' ,p_is_rendered=>'on' -,p_format_scaling=>'none' +,p_format_scaling=>'auto' ,p_scaling=>'linear' ,p_baseline_scaling=>'zero' -,p_position=>'auto' ,p_major_tick_rendered=>'on' ,p_minor_tick_rendered=>'off' ,p_tick_label_rendered=>'on' +,p_tick_label_rotation=>'auto' +,p_tick_label_position=>'outside' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_jet_chart_axis( - p_id=>wwv_flow_api.id(9906673387740517) + p_id=>wwv_flow_api.id(9906780581740518) ,p_chart_id=>wwv_flow_api.id(9906423826740515) -,p_axis=>'x' +,p_axis=>'y' ,p_is_rendered=>'on' -,p_format_scaling=>'auto' +,p_format_scaling=>'none' ,p_scaling=>'linear' ,p_baseline_scaling=>'zero' +,p_position=>'auto' ,p_major_tick_rendered=>'on' ,p_minor_tick_rendered=>'off' ,p_tick_label_rendered=>'on' -,p_tick_label_rotation=>'auto' -,p_tick_label_position=>'outside' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_page_plug( p_id=>wwv_flow_api.id(9906821641740519) @@ -10691,6 +10739,8 @@ wwv_flow_api.create_jet_chart( ,p_hover_behavior=>'none' ,p_stack=>'on' ,p_stack_label=>'on' +,p_connect_nulls=>'Y' +,p_value_position=>'auto' ,p_sorting=>'value-desc' ,p_fill_multi_series_gaps=>true ,p_zoom_and_scroll=>'off' @@ -10698,8 +10748,20 @@ wwv_flow_api.create_jet_chart( ,p_show_series_name=>true ,p_show_group_name=>true ,p_show_value=>true +,p_show_label=>true +,p_show_row=>true +,p_show_start=>true +,p_show_end=>true +,p_show_progress=>true +,p_show_baseline=>true ,p_legend_rendered=>'on' ,p_legend_position=>'bottom' +,p_overview_rendered=>'off' +,p_horizontal_grid=>'auto' +,p_vertical_grid=>'auto' +,p_gauge_orientation=>'circular' +,p_gauge_plot_area=>'on' +,p_show_gauge_value=>true ); wwv_flow_api.create_jet_chart_series( p_id=>wwv_flow_api.id(9907045247740521) @@ -10764,9 +10826,11 @@ wwv_flow_api.create_jet_chart_series( ,p_assigned_to_y2=>'off' ,p_items_label_rendered=>true ,p_items_label_position=>'insideBarEdge' +,p_items_label_display_as=>'PERCENT' ,p_items_label_font_family=>'Arial' ,p_items_label_font_style=>'normal' ,p_items_label_font_size=>'8' +,p_threshold_display=>'onIndicator' ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(9907197005740522) @@ -10781,6 +10845,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_tick_label_rendered=>'on' ,p_tick_label_rotation=>'auto' ,p_tick_label_position=>'outside' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(9907262849740523) @@ -10794,6 +10866,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_major_tick_rendered=>'on' ,p_minor_tick_rendered=>'off' ,p_tick_label_rendered=>'on' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_page_plug( p_id=>wwv_flow_api.id(9909405153740545) @@ -10821,7 +10901,9 @@ wwv_flow_api.create_jet_chart( ,p_hide_and_show_behavior=>'none' ,p_hover_behavior=>'none' ,p_stack=>'off' +,p_stack_label=>'off' ,p_connect_nulls=>'Y' +,p_value_position=>'auto' ,p_sorting=>'label-asc' ,p_fill_multi_series_gaps=>true ,p_zoom_and_scroll=>'off' @@ -10829,8 +10911,20 @@ wwv_flow_api.create_jet_chart( ,p_show_series_name=>true ,p_show_group_name=>true ,p_show_value=>true +,p_show_label=>true +,p_show_row=>true +,p_show_start=>true +,p_show_end=>true +,p_show_progress=>true +,p_show_baseline=>true ,p_legend_rendered=>'on' ,p_legend_position=>'bottom' +,p_overview_rendered=>'off' +,p_horizontal_grid=>'auto' +,p_vertical_grid=>'auto' +,p_gauge_orientation=>'circular' +,p_gauge_plot_area=>'on' +,p_show_gauge_value=>true ); wwv_flow_api.create_jet_chart_series( p_id=>wwv_flow_api.id(9909674684740547) @@ -10875,7 +10969,9 @@ wwv_flow_api.create_jet_chart_series( ,p_assigned_to_y2=>'off' ,p_items_label_rendered=>true ,p_items_label_position=>'auto' +,p_items_label_display_as=>'PERCENT' ,p_items_label_font_size=>'10' +,p_threshold_display=>'onIndicator' ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(9909783516740548) @@ -10890,6 +10986,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_tick_label_rendered=>'on' ,p_tick_label_rotation=>'auto' ,p_tick_label_position=>'outside' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(9909811381740549) @@ -10903,6 +11007,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_major_tick_rendered=>'on' ,p_minor_tick_rendered=>'off' ,p_tick_label_rendered=>'on' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_page_plug( p_id=>wwv_flow_api.id(9923029639716102) @@ -10929,6 +11041,9 @@ wwv_flow_api.create_jet_chart( ,p_hide_and_show_behavior=>'none' ,p_hover_behavior=>'none' ,p_stack=>'off' +,p_stack_label=>'off' +,p_connect_nulls=>'Y' +,p_value_position=>'auto' ,p_sorting=>'label-asc' ,p_fill_multi_series_gaps=>true ,p_zoom_and_scroll=>'off' @@ -10936,8 +11051,20 @@ wwv_flow_api.create_jet_chart( ,p_show_series_name=>true ,p_show_group_name=>true ,p_show_value=>true +,p_show_label=>true +,p_show_row=>true +,p_show_start=>true +,p_show_end=>true +,p_show_progress=>true +,p_show_baseline=>true ,p_legend_rendered=>'on' ,p_legend_position=>'bottom' +,p_overview_rendered=>'off' +,p_horizontal_grid=>'auto' +,p_vertical_grid=>'auto' +,p_gauge_orientation=>'circular' +,p_gauge_plot_area=>'on' +,p_show_gauge_value=>true ); wwv_flow_api.create_jet_chart_series( p_id=>wwv_flow_api.id(9923297286716104) @@ -10982,6 +11109,8 @@ wwv_flow_api.create_jet_chart_series( ,p_assigned_to_y2=>'off' ,p_items_label_rendered=>true ,p_items_label_position=>'auto' +,p_items_label_display_as=>'PERCENT' +,p_threshold_display=>'onIndicator' ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(9923304855716105) @@ -10996,6 +11125,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_tick_label_rendered=>'on' ,p_tick_label_rotation=>'auto' ,p_tick_label_position=>'outside' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(9923476916716106) @@ -11009,6 +11146,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_major_tick_rendered=>'on' ,p_minor_tick_rendered=>'off' ,p_tick_label_rendered=>'on' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_page_plug( p_id=>wwv_flow_api.id(9923541167716107) @@ -11036,6 +11181,9 @@ wwv_flow_api.create_jet_chart( ,p_hide_and_show_behavior=>'none' ,p_hover_behavior=>'none' ,p_stack=>'off' +,p_stack_label=>'off' +,p_connect_nulls=>'Y' +,p_value_position=>'auto' ,p_sorting=>'label-asc' ,p_fill_multi_series_gaps=>true ,p_zoom_and_scroll=>'off' @@ -11043,8 +11191,20 @@ wwv_flow_api.create_jet_chart( ,p_show_series_name=>true ,p_show_group_name=>true ,p_show_value=>true +,p_show_label=>true +,p_show_row=>true +,p_show_start=>true +,p_show_end=>true +,p_show_progress=>true +,p_show_baseline=>true ,p_legend_rendered=>'on' ,p_legend_position=>'bottom' +,p_overview_rendered=>'off' +,p_horizontal_grid=>'auto' +,p_vertical_grid=>'auto' +,p_gauge_orientation=>'circular' +,p_gauge_plot_area=>'on' +,p_show_gauge_value=>true ); wwv_flow_api.create_jet_chart_series( p_id=>wwv_flow_api.id(9923743722716109) @@ -11106,7 +11266,12 @@ wwv_flow_api.create_jet_chart_series( ,p_assigned_to_y2=>'off' ,p_items_label_rendered=>true ,p_items_label_position=>'auto' +,p_items_label_display_as=>'PERCENT' +,p_threshold_display=>'onIndicator' ); +end; +/ +begin wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(9923836203716110) ,p_chart_id=>wwv_flow_api.id(9923640328716108) @@ -11120,6 +11285,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_tick_label_rendered=>'on' ,p_tick_label_rotation=>'auto' ,p_tick_label_position=>'outside' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(9923915405716111) @@ -11133,6 +11306,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_major_tick_rendered=>'on' ,p_minor_tick_rendered=>'off' ,p_tick_label_rendered=>'on' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_page_plug( p_id=>wwv_flow_api.id(10813323429165705) @@ -11161,7 +11342,9 @@ wwv_flow_api.create_jet_chart( ,p_hide_and_show_behavior=>'none' ,p_hover_behavior=>'none' ,p_stack=>'off' +,p_stack_label=>'off' ,p_connect_nulls=>'Y' +,p_value_position=>'auto' ,p_sorting=>'label-asc' ,p_fill_multi_series_gaps=>true ,p_zoom_and_scroll=>'off' @@ -11169,8 +11352,20 @@ wwv_flow_api.create_jet_chart( ,p_show_series_name=>true ,p_show_group_name=>true ,p_show_value=>true +,p_show_label=>true +,p_show_row=>true +,p_show_start=>true +,p_show_end=>true +,p_show_progress=>true +,p_show_baseline=>true ,p_legend_rendered=>'on' ,p_legend_position=>'bottom' +,p_overview_rendered=>'off' +,p_horizontal_grid=>'auto' +,p_vertical_grid=>'auto' +,p_gauge_orientation=>'circular' +,p_gauge_plot_area=>'on' +,p_show_gauge_value=>true ); wwv_flow_api.create_jet_chart_series( p_id=>wwv_flow_api.id(10813589982165707) @@ -11232,11 +11427,10 @@ wwv_flow_api.create_jet_chart_series( ,p_assigned_to_y2=>'off' ,p_items_label_rendered=>true ,p_items_label_position=>'auto' +,p_items_label_display_as=>'PERCENT' ,p_items_label_font_size=>'10' +,p_threshold_display=>'onIndicator' ); -end; -/ -begin wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(10813694012165708) ,p_chart_id=>wwv_flow_api.id(10813427444165706) @@ -11250,6 +11444,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_tick_label_rendered=>'on' ,p_tick_label_rotation=>'auto' ,p_tick_label_position=>'outside' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(10813796398165709) @@ -11263,6 +11465,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_major_tick_rendered=>'on' ,p_minor_tick_rendered=>'off' ,p_tick_label_rendered=>'on' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_page_plug( p_id=>wwv_flow_api.id(9907890048740529) @@ -11772,6 +11982,7 @@ wwv_flow_api.create_jet_chart( ,p_stack=>'on' ,p_stack_label=>'on' ,p_connect_nulls=>'Y' +,p_value_position=>'auto' ,p_sorting=>'label-asc' ,p_fill_multi_series_gaps=>true ,p_zoom_and_scroll=>'off' @@ -11779,8 +11990,20 @@ wwv_flow_api.create_jet_chart( ,p_show_series_name=>true ,p_show_group_name=>true ,p_show_value=>true +,p_show_label=>true +,p_show_row=>true +,p_show_start=>true +,p_show_end=>true +,p_show_progress=>true +,p_show_baseline=>true ,p_legend_rendered=>'on' ,p_legend_position=>'bottom' +,p_overview_rendered=>'off' +,p_horizontal_grid=>'auto' +,p_vertical_grid=>'auto' +,p_gauge_orientation=>'circular' +,p_gauge_plot_area=>'on' +,p_show_gauge_value=>true ); wwv_flow_api.create_jet_chart_series( p_id=>wwv_flow_api.id(9988037120919551) @@ -11848,6 +12071,8 @@ wwv_flow_api.create_jet_chart_series( ,p_assigned_to_y2=>'off' ,p_items_label_rendered=>true ,p_items_label_position=>'auto' +,p_items_label_display_as=>'PERCENT' +,p_threshold_display=>'onIndicator' ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(9987437023919551) @@ -11920,6 +12145,7 @@ wwv_flow_api.create_jet_chart( ,p_stack=>'on' ,p_stack_label=>'on' ,p_connect_nulls=>'Y' +,p_value_position=>'auto' ,p_sorting=>'label-asc' ,p_fill_multi_series_gaps=>true ,p_zoom_and_scroll=>'off' @@ -11927,8 +12153,20 @@ wwv_flow_api.create_jet_chart( ,p_show_series_name=>true ,p_show_group_name=>true ,p_show_value=>true +,p_show_label=>true +,p_show_row=>true +,p_show_start=>true +,p_show_end=>true +,p_show_progress=>true +,p_show_baseline=>true ,p_legend_rendered=>'on' ,p_legend_position=>'bottom' +,p_overview_rendered=>'off' +,p_horizontal_grid=>'auto' +,p_vertical_grid=>'auto' +,p_gauge_orientation=>'circular' +,p_gauge_plot_area=>'on' +,p_show_gauge_value=>true ); wwv_flow_api.create_jet_chart_series( p_id=>wwv_flow_api.id(9990659651919553) @@ -12014,6 +12252,8 @@ wwv_flow_api.create_jet_chart_series( ,p_assigned_to_y2=>'off' ,p_items_label_rendered=>true ,p_items_label_position=>'auto' +,p_items_label_display_as=>'PERCENT' +,p_threshold_display=>'onIndicator' ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(9989436754919552) @@ -12124,7 +12364,7 @@ wwv_flow_api.create_page_item( ' (:P3_TIMEFRAME = 180 and mod(to_number(to_char(USAGE_INTERVAL_START,''DD'')),6) = 0) and USAGE_INTERVAL_START = trunc(USAGE_INTERVAL_START)', ' or', ' (:P3_TIMEFRAME >= 360 and mod(to_number(to_char(USAGE_INTERVAL_START,''DD'')),12) = 0) and USAGE_INTERVAL_START = trunc(USAGE_INTERVAL_START)', -' ) ')) +' )')) ,p_source_type=>'QUERY' ,p_display_as=>'NATIVE_DISPLAY_ONLY' ,p_begin_on_new_line=>'N' @@ -12499,6 +12739,9 @@ wwv_flow_api.create_page_computation( ,p_compute_when=>'P3_TENANT_NAME' ,p_compute_when_type=>'ITEM_IS_NULL' ); +end; +/ +begin wwv_flow_api.create_page_computation( p_id=>wwv_flow_api.id(13350423906239101) ,p_computation_sequence=>10 @@ -12531,9 +12774,6 @@ wwv_flow_api.create_page_da_action( ,p_affected_elements_type=>'REGION' ,p_affected_region_id=>wwv_flow_api.id(9908767434740538) ); -end; -/ -begin wwv_flow_api.create_page_da_action( p_id=>wwv_flow_api.id(9909224638740543) ,p_event_id=>wwv_flow_api.id(9908888877740539) @@ -12581,6 +12821,11 @@ wwv_flow_api.create_page( ' background-color: #efffff;', '}', '', +'.a-IRR-table tr td[headers*="rep_col_pink"]', +'{', +' background-color: #ffefff;', +'}', +'', '#P4_COST_DISPLAY {', ' background-color: #F5FBB4; font-weight: bold; font-size: 14px;', '}', @@ -12593,7 +12838,7 @@ wwv_flow_api.create_page( '#P4_REPORT_SELECTOR { background-color: #F5FBB4; font-weight: bold; font-size: 13px;}')) ,p_page_template_options=>'#DEFAULT#' ,p_last_updated_by=>'ADIZOHAR' -,p_last_upd_yyyymmddhh24miss=>'20200507123102' +,p_last_upd_yyyymmddhh24miss=>'20200514125539' ); wwv_flow_api.create_page_plug( p_id=>wwv_flow_api.id(10816553122165737) @@ -12659,15 +12904,35 @@ wwv_flow_api.create_jet_chart( ,p_data_cursor=>'auto' ,p_data_cursor_behavior=>'auto' ,p_hover_behavior=>'none' +,p_stack=>'off' +,p_stack_label=>'off' +,p_connect_nulls=>'Y' +,p_value_position=>'auto' ,p_value_format_type=>'decimal' ,p_value_decimal_places=>1 ,p_value_format_scaling=>'auto' +,p_sorting=>'label-asc' +,p_fill_multi_series_gaps=>true ,p_tooltip_rendered=>'Y' ,p_show_series_name=>true +,p_show_group_name=>true ,p_show_value=>true +,p_show_label=>true +,p_show_row=>true +,p_show_start=>true +,p_show_end=>true +,p_show_progress=>true +,p_show_baseline=>true ,p_legend_rendered=>'off' +,p_legend_position=>'auto' +,p_overview_rendered=>'off' ,p_pie_other_threshold=>0 ,p_pie_selection_effect=>'highlight' +,p_horizontal_grid=>'auto' +,p_vertical_grid=>'auto' +,p_gauge_orientation=>'circular' +,p_gauge_plot_area=>'on' +,p_show_gauge_value=>true ); wwv_flow_api.create_jet_chart_series( p_id=>wwv_flow_api.id(10815028626165722) @@ -12707,6 +12972,7 @@ wwv_flow_api.create_jet_chart_series( ,p_items_label_position=>'insideBarEdge' ,p_items_label_display_as=>'ALL' ,p_items_label_font_size=>'10' +,p_threshold_display=>'onIndicator' ); wwv_flow_api.create_page_plug( p_id=>wwv_flow_api.id(10815862618165730) @@ -12735,6 +13001,7 @@ wwv_flow_api.create_jet_chart( ,p_stack=>'on' ,p_stack_label=>'on' ,p_connect_nulls=>'Y' +,p_value_position=>'auto' ,p_sorting=>'value-desc' ,p_fill_multi_series_gaps=>true ,p_zoom_and_scroll=>'off' @@ -12742,7 +13009,20 @@ wwv_flow_api.create_jet_chart( ,p_show_series_name=>true ,p_show_group_name=>true ,p_show_value=>true +,p_show_label=>true +,p_show_row=>true +,p_show_start=>true +,p_show_end=>true +,p_show_progress=>true +,p_show_baseline=>true ,p_legend_rendered=>'off' +,p_legend_position=>'auto' +,p_overview_rendered=>'off' +,p_horizontal_grid=>'auto' +,p_vertical_grid=>'auto' +,p_gauge_orientation=>'circular' +,p_gauge_plot_area=>'on' +,p_show_gauge_value=>true ); wwv_flow_api.create_jet_chart_series( p_id=>wwv_flow_api.id(10816022718165732) @@ -12787,8 +13067,10 @@ wwv_flow_api.create_jet_chart_series( ,p_assigned_to_y2=>'off' ,p_items_label_rendered=>true ,p_items_label_position=>'insideBarEdge' +,p_items_label_display_as=>'PERCENT' ,p_items_label_font_style=>'normal' ,p_items_label_font_size=>'8' +,p_threshold_display=>'onIndicator' ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(10816181831165733) @@ -12803,6 +13085,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_tick_label_rendered=>'on' ,p_tick_label_rotation=>'auto' ,p_tick_label_position=>'outside' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(10816213077165734) @@ -12818,6 +13108,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_major_tick_rendered=>'on' ,p_minor_tick_rendered=>'off' ,p_tick_label_rendered=>'on' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_page_plug( p_id=>wwv_flow_api.id(11931816111191611) @@ -12843,7 +13141,9 @@ wwv_flow_api.create_jet_chart( ,p_data_cursor_behavior=>'auto' ,p_hover_behavior=>'none' ,p_stack=>'off' +,p_stack_label=>'off' ,p_connect_nulls=>'Y' +,p_value_position=>'auto' ,p_sorting=>'label-asc' ,p_fill_multi_series_gaps=>true ,p_zoom_and_scroll=>'off' @@ -12851,7 +13151,20 @@ wwv_flow_api.create_jet_chart( ,p_show_series_name=>true ,p_show_group_name=>true ,p_show_value=>true +,p_show_label=>true +,p_show_row=>true +,p_show_start=>true +,p_show_end=>true +,p_show_progress=>true +,p_show_baseline=>true ,p_legend_rendered=>'off' +,p_legend_position=>'auto' +,p_overview_rendered=>'off' +,p_horizontal_grid=>'auto' +,p_vertical_grid=>'auto' +,p_gauge_orientation=>'circular' +,p_gauge_plot_area=>'on' +,p_show_gauge_value=>true ); wwv_flow_api.create_jet_chart_series( p_id=>wwv_flow_api.id(11932020693191613) @@ -12903,7 +13216,9 @@ wwv_flow_api.create_jet_chart_series( ,p_assigned_to_y2=>'off' ,p_items_label_rendered=>true ,p_items_label_position=>'auto' +,p_items_label_display_as=>'PERCENT' ,p_items_label_font_size=>'10' +,p_threshold_display=>'onIndicator' ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(11932199654191614) @@ -12921,6 +13236,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_tick_label_rotation=>'auto' ,p_tick_label_position=>'outside' ,p_tick_label_font_size=>'10' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(11932208487191615) @@ -12936,6 +13259,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_major_tick_rendered=>'on' ,p_minor_tick_rendered=>'off' ,p_tick_label_rendered=>'on' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_page_plug( p_id=>wwv_flow_api.id(11932315365191616) @@ -12960,15 +13291,35 @@ wwv_flow_api.create_jet_chart( ,p_data_cursor=>'auto' ,p_data_cursor_behavior=>'auto' ,p_hover_behavior=>'none' +,p_stack=>'off' +,p_stack_label=>'off' +,p_connect_nulls=>'Y' +,p_value_position=>'auto' ,p_value_format_type=>'decimal' ,p_value_decimal_places=>1 ,p_value_format_scaling=>'auto' +,p_sorting=>'label-asc' +,p_fill_multi_series_gaps=>true ,p_tooltip_rendered=>'Y' ,p_show_series_name=>true +,p_show_group_name=>true ,p_show_value=>true +,p_show_label=>true +,p_show_row=>true +,p_show_start=>true +,p_show_end=>true +,p_show_progress=>true +,p_show_baseline=>true ,p_legend_rendered=>'off' +,p_legend_position=>'auto' +,p_overview_rendered=>'off' ,p_pie_other_threshold=>0 ,p_pie_selection_effect=>'highlight' +,p_horizontal_grid=>'auto' +,p_vertical_grid=>'auto' +,p_gauge_orientation=>'circular' +,p_gauge_plot_area=>'on' +,p_show_gauge_value=>true ); wwv_flow_api.create_jet_chart_series( p_id=>wwv_flow_api.id(11932548617191618) @@ -13007,6 +13358,7 @@ wwv_flow_api.create_jet_chart_series( ,p_items_label_position=>'insideBarEdge' ,p_items_label_display_as=>'LBL_VAL' ,p_items_label_font_size=>'10' +,p_threshold_display=>'onIndicator' ); wwv_flow_api.create_page_plug( p_id=>wwv_flow_api.id(12317143055646735) @@ -13374,7 +13726,9 @@ wwv_flow_api.create_jet_chart( ,p_data_cursor_behavior=>'snap' ,p_hover_behavior=>'none' ,p_stack=>'off' +,p_stack_label=>'off' ,p_connect_nulls=>'Y' +,p_value_position=>'auto' ,p_sorting=>'label-asc' ,p_fill_multi_series_gaps=>true ,p_zoom_and_scroll=>'off' @@ -13382,8 +13736,24 @@ wwv_flow_api.create_jet_chart( ,p_show_series_name=>true ,p_show_group_name=>true ,p_show_value=>true +,p_show_label=>true +,p_show_row=>true +,p_show_start=>true +,p_show_end=>true +,p_show_progress=>true +,p_show_baseline=>true ,p_legend_rendered=>'off' +,p_legend_position=>'auto' +,p_overview_rendered=>'off' +,p_horizontal_grid=>'auto' +,p_vertical_grid=>'auto' +,p_gauge_orientation=>'circular' +,p_gauge_plot_area=>'on' +,p_show_gauge_value=>true ); +end; +/ +begin wwv_flow_api.create_jet_chart_series( p_id=>wwv_flow_api.id(13974239454041419) ,p_chart_id=>wwv_flow_api.id(13974102550041418) @@ -13445,11 +13815,10 @@ wwv_flow_api.create_jet_chart_series( ,p_assigned_to_y2=>'off' ,p_items_label_rendered=>true ,p_items_label_position=>'aboveMarker' +,p_items_label_display_as=>'PERCENT' ,p_items_label_font_size=>'10' +,p_threshold_display=>'onIndicator' ); -end; -/ -begin wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(13974384360041420) ,p_chart_id=>wwv_flow_api.id(13974102550041418) @@ -13466,6 +13835,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_tick_label_rotation=>'auto' ,p_tick_label_position=>'outside' ,p_tick_label_font_size=>'10' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(13974468820041421) @@ -13482,6 +13859,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_major_tick_rendered=>'on' ,p_minor_tick_rendered=>'on' ,p_tick_label_rendered=>'on' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_page_plug( p_id=>wwv_flow_api.id(21606421457513668) @@ -13493,44 +13878,72 @@ wwv_flow_api.create_page_plug( ,p_plug_display_point=>'BODY' ,p_query_type=>'SQL' ,p_plug_source=>wwv_flow_string.join(wwv_flow_t_varchar2( +'with data as', +'(', +' select ', +' a.tenant_name,', +' a.COST_PRODUCT_SKU || '' '' || replace(PRD_DESCRIPTION,COST_PRODUCT_SKU||'' - '','''') as PRODUCT,', +' a.COST_PRODUCT_SKU,', +' min(COST_BILLING_UNIT) COST_BILLING_UNIT,', +' max(COST_UNIT_PRICE) RATE,', +' min(COST_CURRENCY_CODE) CURRENCY,', +' case when count(distinct USAGE_INTERVAL_START) > 0 then', +' case ', +' when min(COST_BILLING_UNIT) like ''%HOURS%'' or min(PRD_DESCRIPTION) like ''%Per Hour%'' then sum(USG_BILLED_QUANTITY)/count(distinct USAGE_INTERVAL_START)', +' when min(COST_BILLING_UNIT) like ''%GiB%'' then sum(USG_BILLED_QUANTITY)/count(distinct USAGE_INTERVAL_START)*744', +' when min(COST_BILLING_UNIT) like ''%TiB%'' then sum(USG_BILLED_QUANTITY)/count(distinct USAGE_INTERVAL_START)*744', +' else null', +' end', +' end SINGLE_QUANTITY,', +' count(distinct USAGE_INTERVAL_START) HOURS_QUANTITY,', +' sum(USG_BILLED_QUANTITY) TOTAL_QUANTITY,', +' sum(COST_MY_COST_OVERAGE) OVERAGE_COST,', +' sum(COST_MY_COST) USAGE_COST,', +' sum(COST_MY_COST)*(24 * 31 / count(distinct USAGE_INTERVAL_START)) ESTIMATE_MONTH_31,', +' sum(COST_MY_COST)*(24 * 365 / count(distinct USAGE_INTERVAL_START)) ESTIMATE_YEAR', +' from oci_cost a', +' where ', +' tenant_name=:P4_TENANT_NAME and', +' (:P4_COMPARTMENT_NAME is null or prd_compartment_name = :P4_COMPARTMENT_NAME) and', +' (:P4_PRODUCT_SERVICE is null or prd_service = :P4_PRODUCT_SERVICE) and', +' (:P4_PRODUCT_REGION is null or prd_region = :P4_PRODUCT_REGION) and', +' (:P4_COMPARTMENT_TOP is null or prd_compartment_path like :P4_COMPARTMENT_TOP ||''%'') and', +' (:P4_TAG_KEY is null or tags_data like ''%#'' || :P4_TAG_KEY || ''=%'') and', +' (:P4_TAG_DATA is null or tags_data like ''%#'' || nvl(:P4_TAG_KEY,''%'') || ''=%'' || :P4_TAG_DATA || ''#'') and', +' (:P4_COST_PRODUCT_SKU is null or a.COST_PRODUCT_SKU = :P4_COST_PRODUCT_SKU) and', +' USAGE_INTERVAL_START >= to_date(:P4_DATE_FROM,''DD-MON-YYYY HH24:MI'') and USAGE_INTERVAL_START < to_date(:P4_DATE_TO,''DD-MON-YYYY HH24:MI'')', +' and COST_MY_COST<>0', +' and :P4_REPORT_SELECTOR = ''Cost Report''', +' group by ', +' a.tenant_name,a.COST_PRODUCT_SKU , replace(PRD_DESCRIPTION,COST_PRODUCT_SKU||'' - '','''')', +')', 'select ', -' COST_PRODUCT_SKU || '' '' || PRD_DESCRIPTION as PRODUCT,', -' min(COST_BILLING_UNIT) COST_BILLING_UNIT,', -' max(COST_UNIT_PRICE) RATE,', -' min(COST_CURRENCY_CODE) CURRENCY,', -' case when count(distinct USAGE_INTERVAL_START) > 0 then', -' case ', -' when min(COST_BILLING_UNIT) like ''%HOURS%'' or min(PRD_DESCRIPTION) like ''%Per Hour%'' then sum(USG_BILLED_QUANTITY)/count(distinct USAGE_INTERVAL_START)', -' when min(COST_BILLING_UNIT) like ''%GiB%'' then sum(USG_BILLED_QUANTITY)/count(distinct USAGE_INTERVAL_START)*744', -' when min(COST_BILLING_UNIT) like ''%TiB%'' then sum(USG_BILLED_QUANTITY)/count(distinct USAGE_INTERVAL_START)*744', -' else null', -' end', -' end SINGLE_QUANTITY,', -' count(distinct USAGE_INTERVAL_START) HOURS_QUANTITY,', -' sum(USG_BILLED_QUANTITY) TOTAL_QUANTITY,', -' sum(COST_MY_COST_OVERAGE) OVERAGE_COST,', -' sum(COST_MY_COST) USAGE_COST,', -' sum(COST_MY_COST)*(24 * 31 / count(distinct USAGE_INTERVAL_START)) ESTIMATE_MONTH_31,', -' sum(COST_MY_COST)*(24 * 365 / count(distinct USAGE_INTERVAL_START)) ESTIMATE_YEAR', -'from oci_cost', -'where ', -' tenant_name=:P4_TENANT_NAME and', -' (:P4_COMPARTMENT_NAME is null or prd_compartment_name = :P4_COMPARTMENT_NAME) and', -' (:P4_PRODUCT_SERVICE is null or prd_service = :P4_PRODUCT_SERVICE) and', -' (:P4_PRODUCT_REGION is null or prd_region = :P4_PRODUCT_REGION) and', -' (:P4_COMPARTMENT_TOP is null or prd_compartment_path like :P4_COMPARTMENT_TOP ||''%'') and', -' (:P4_TAG_KEY is null or tags_data like ''%#'' || :P4_TAG_KEY || ''=%'') and', -' (:P4_TAG_DATA is null or tags_data like ''%#'' || nvl(:P4_TAG_KEY,''%'') || ''=%'' || :P4_TAG_DATA || ''#'') and', -' (:P4_COST_PRODUCT_SKU is null or COST_PRODUCT_SKU = :P4_COST_PRODUCT_SKU) and', -' USAGE_INTERVAL_START >= to_date(:P4_DATE_FROM,''DD-MON-YYYY HH24:MI'') and USAGE_INTERVAL_START < to_date(:P4_DATE_TO,''DD-MON-YYYY HH24:MI'')', -' and COST_MY_COST<>0', -' and :P4_REPORT_SELECTOR = ''Cost Report''', -'group by ', -' COST_PRODUCT_SKU , PRD_DESCRIPTION', -' order by USAGE_COST', -'', -'', -'', +' PRODUCT,', +' COST_BILLING_UNIT,', +' case when RATE_MONTHLY_FLEX_PRICE = 0 then null else RATE_MONTHLY_FLEX_PRICE end PUBLIC_RATE,', +' CASE WHEN RATE_MONTHLY_FLEX_PRICE > 0 AND RATE_MONTHLY_FLEX_PRICE IS NOT NULL and RATE>0 THEN', +' ROUND((RATE_MONTHLY_FLEX_PRICE - RATE )/RATE_MONTHLY_FLEX_PRICE * 100,1)', +' ELSE NULL END PCT_MONTH,', +' case when RATE_PAYGO_PRICE = 0 then null else RATE_PAYGO_PRICE end PUBLIC_PAYGO_RATE,', +' CASE WHEN RATE_PAYGO_PRICE > 0 AND RATE_PAYGO_PRICE IS NOT NULL and RATE>0 THEN', +' ROUND((RATE_PAYGO_PRICE - RATE )/RATE_PAYGO_PRICE * 100,1)', +' ELSE NULL END PCT_PAYGO,', +' RATE,', +' CURRENCY,', +' SINGLE_QUANTITY,', +' HOURS_QUANTITY,', +' TOTAL_QUANTITY,', +' OVERAGE_COST,', +' USAGE_COST,', +' ESTIMATE_MONTH_31,', +' ESTIMATE_YEAR', +'from', +' data a,', +' oci_price_list b', +'where ', +' a.tenant_name = b.tenant_name (+) and', +' a.COST_PRODUCT_SKU = b.COST_PRODUCT_SKU (+)', +'order by USAGE_COST', '', '')) ,p_plug_source_type=>'NATIVE_IR' @@ -13596,28 +14009,49 @@ wwv_flow_api.create_worksheet_column( ,p_column_type=>'STRING' ); wwv_flow_api.create_worksheet_column( - p_id=>wwv_flow_api.id(11934736538191640) -,p_db_column_name=>'RATE' + p_id=>wwv_flow_api.id(14188271974270023) +,p_db_column_name=>'PUBLIC_RATE' ,p_display_order=>30 -,p_column_identifier=>'C' -,p_column_label=>'Rate' +,p_column_identifier=>'L' +,p_column_label=>'Public Rate' ,p_column_type=>'NUMBER' ,p_column_alignment=>'RIGHT' ,p_format_mask=>'999G999G999G999G990D000' ); wwv_flow_api.create_worksheet_column( - p_id=>wwv_flow_api.id(12552301614313321) -,p_db_column_name=>'CURRENCY' + p_id=>wwv_flow_api.id(14188353163270024) +,p_db_column_name=>'PCT_MONTH' ,p_display_order=>40 -,p_column_identifier=>'K' -,p_column_label=>'Cur' -,p_column_type=>'STRING' -,p_column_alignment=>'CENTER' -); -wwv_flow_api.create_worksheet_column( - p_id=>wwv_flow_api.id(11934801837191641) -,p_db_column_name=>'SINGLE_QUANTITY' +,p_column_identifier=>'M' +,p_column_label=>'% Discount MonFlex' +,p_column_type=>'NUMBER' +,p_column_alignment=>'RIGHT' +,p_format_mask=>'999G999G999G999G990D0' +,p_static_id=>'rep_col_pink' +); +wwv_flow_api.create_worksheet_column( + p_id=>wwv_flow_api.id(11934736538191640) +,p_db_column_name=>'RATE' ,p_display_order=>50 +,p_column_identifier=>'C' +,p_column_label=>'Customer Rate' +,p_column_type=>'NUMBER' +,p_column_alignment=>'RIGHT' +,p_format_mask=>'999G999G999G999G990D000' +); +wwv_flow_api.create_worksheet_column( + p_id=>wwv_flow_api.id(12552301614313321) +,p_db_column_name=>'CURRENCY' +,p_display_order=>60 +,p_column_identifier=>'K' +,p_column_label=>'Cur' +,p_column_type=>'STRING' +,p_column_alignment=>'CENTER' +); +wwv_flow_api.create_worksheet_column( + p_id=>wwv_flow_api.id(11934801837191641) +,p_db_column_name=>'SINGLE_QUANTITY' +,p_display_order=>70 ,p_column_identifier=>'D' ,p_column_label=>'Single Quantity' ,p_column_type=>'NUMBER' @@ -13627,7 +14061,7 @@ wwv_flow_api.create_worksheet_column( wwv_flow_api.create_worksheet_column( p_id=>wwv_flow_api.id(11934932235191642) ,p_db_column_name=>'HOURS_QUANTITY' -,p_display_order=>60 +,p_display_order=>80 ,p_column_identifier=>'E' ,p_column_label=>'Hours Quantity' ,p_column_type=>'NUMBER' @@ -13637,7 +14071,7 @@ wwv_flow_api.create_worksheet_column( wwv_flow_api.create_worksheet_column( p_id=>wwv_flow_api.id(11935047811191643) ,p_db_column_name=>'TOTAL_QUANTITY' -,p_display_order=>70 +,p_display_order=>90 ,p_column_identifier=>'F' ,p_column_label=>'Total Quantity' ,p_column_type=>'NUMBER' @@ -13647,7 +14081,7 @@ wwv_flow_api.create_worksheet_column( wwv_flow_api.create_worksheet_column( p_id=>wwv_flow_api.id(11935139954191644) ,p_db_column_name=>'OVERAGE_COST' -,p_display_order=>80 +,p_display_order=>100 ,p_column_identifier=>'G' ,p_column_label=>'Overage Cost' ,p_column_type=>'NUMBER' @@ -13657,7 +14091,7 @@ wwv_flow_api.create_worksheet_column( wwv_flow_api.create_worksheet_column( p_id=>wwv_flow_api.id(11935274061191645) ,p_db_column_name=>'USAGE_COST' -,p_display_order=>90 +,p_display_order=>110 ,p_column_identifier=>'H' ,p_column_label=>'Usage Cost' ,p_column_type=>'NUMBER' @@ -13668,7 +14102,7 @@ wwv_flow_api.create_worksheet_column( wwv_flow_api.create_worksheet_column( p_id=>wwv_flow_api.id(11935309095191646) ,p_db_column_name=>'ESTIMATE_MONTH_31' -,p_display_order=>100 +,p_display_order=>120 ,p_column_identifier=>'I' ,p_column_label=>'Estimate Month 31' ,p_column_type=>'NUMBER' @@ -13678,13 +14112,33 @@ wwv_flow_api.create_worksheet_column( wwv_flow_api.create_worksheet_column( p_id=>wwv_flow_api.id(11935491613191647) ,p_db_column_name=>'ESTIMATE_YEAR' -,p_display_order=>110 +,p_display_order=>130 ,p_column_identifier=>'J' ,p_column_label=>'Estimate Year' ,p_column_type=>'NUMBER' ,p_column_alignment=>'RIGHT' ,p_format_mask=>'999G999G999G999G990D00' ); +wwv_flow_api.create_worksheet_column( + p_id=>wwv_flow_api.id(14188462327270025) +,p_db_column_name=>'PUBLIC_PAYGO_RATE' +,p_display_order=>140 +,p_column_identifier=>'N' +,p_column_label=>'Public PayGo Rate' +,p_column_type=>'NUMBER' +,p_column_alignment=>'RIGHT' +,p_format_mask=>'999G999G999G999G990D0000' +); +wwv_flow_api.create_worksheet_column( + p_id=>wwv_flow_api.id(14188587079270026) +,p_db_column_name=>'PCT_PAYGO' +,p_display_order=>150 +,p_column_identifier=>'O' +,p_column_label=>'% DIscount Vs Paygo' +,p_column_type=>'NUMBER' +,p_column_alignment=>'RIGHT' +,p_format_mask=>'999G999G999G999G990D0' +); wwv_flow_api.create_worksheet_rpt( p_id=>wwv_flow_api.id(12264955888332662) ,p_application_user=>'APXWS_DEFAULT' @@ -13692,7 +14146,18 @@ wwv_flow_api.create_worksheet_rpt( ,p_report_alias=>'122650' ,p_status=>'PUBLIC' ,p_is_default=>'Y' -,p_report_columns=>'PRODUCT:CURRENCY:COST_BILLING_UNIT:RATE:SINGLE_QUANTITY:HOURS_QUANTITY:TOTAL_QUANTITY:OVERAGE_COST:USAGE_COST:ESTIMATE_MONTH_31:ESTIMATE_YEAR:' +,p_report_columns=>'PRODUCT:COST_BILLING_UNIT:CURRENCY:PUBLIC_RATE:PCT_MONTH:RATE:SINGLE_QUANTITY:OVERAGE_COST:USAGE_COST:ESTIMATE_MONTH_31:ESTIMATE_YEAR:' +,p_sum_columns_on_break=>'OVERAGE_COST:USAGE_COST:ESTIMATE_MONTH_31:ESTIMATE_YEAR' +); +wwv_flow_api.create_worksheet_rpt( + p_id=>wwv_flow_api.id(16442242263079381) +,p_application_user=>'APXWS_ALTERNATIVE' +,p_name=>'Compact' +,p_report_seq=>10 +,p_report_alias=>'164423' +,p_status=>'PUBLIC' +,p_is_default=>'Y' +,p_report_columns=>'PRODUCT:CURRENCY:PCT_MONTH:RATE:SINGLE_QUANTITY:OVERAGE_COST:USAGE_COST:ESTIMATE_MONTH_31:ESTIMATE_YEAR:' ,p_sum_columns_on_break=>'OVERAGE_COST:USAGE_COST:ESTIMATE_MONTH_31:ESTIMATE_YEAR' ); wwv_flow_api.create_page_plug( @@ -13722,6 +14187,7 @@ wwv_flow_api.create_jet_chart( ,p_stack=>'on' ,p_stack_label=>'on' ,p_connect_nulls=>'Y' +,p_value_position=>'auto' ,p_sorting=>'value-desc' ,p_fill_multi_series_gaps=>true ,p_zoom_and_scroll=>'off' @@ -13729,7 +14195,20 @@ wwv_flow_api.create_jet_chart( ,p_show_series_name=>true ,p_show_group_name=>true ,p_show_value=>true +,p_show_label=>true +,p_show_row=>true +,p_show_start=>true +,p_show_end=>true +,p_show_progress=>true +,p_show_baseline=>true ,p_legend_rendered=>'off' +,p_legend_position=>'auto' +,p_overview_rendered=>'off' +,p_horizontal_grid=>'auto' +,p_vertical_grid=>'auto' +,p_gauge_orientation=>'circular' +,p_gauge_plot_area=>'on' +,p_show_gauge_value=>true ); wwv_flow_api.create_jet_chart_series( p_id=>wwv_flow_api.id(11711871269773205) @@ -13766,8 +14245,10 @@ wwv_flow_api.create_jet_chart_series( ,p_assigned_to_y2=>'off' ,p_items_label_rendered=>true ,p_items_label_position=>'insideBarEdge' +,p_items_label_display_as=>'PERCENT' ,p_items_label_font_style=>'normal' ,p_items_label_font_size=>'8' +,p_threshold_display=>'onIndicator' ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(11711229189773204) @@ -13805,6 +14286,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_major_tick_rendered=>'on' ,p_minor_tick_rendered=>'off' ,p_tick_label_rendered=>'on' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_page_plug( p_id=>wwv_flow_api.id(21624153346489267) @@ -13830,15 +14319,35 @@ wwv_flow_api.create_jet_chart( ,p_data_cursor=>'auto' ,p_data_cursor_behavior=>'auto' ,p_hover_behavior=>'dim' +,p_stack=>'off' +,p_stack_label=>'off' +,p_connect_nulls=>'Y' +,p_value_position=>'auto' ,p_value_format_type=>'decimal' ,p_value_decimal_places=>1 ,p_value_format_scaling=>'auto' +,p_sorting=>'label-asc' +,p_fill_multi_series_gaps=>true ,p_tooltip_rendered=>'Y' ,p_show_series_name=>true +,p_show_group_name=>true ,p_show_value=>true +,p_show_label=>true +,p_show_row=>true +,p_show_start=>true +,p_show_end=>true +,p_show_progress=>true +,p_show_baseline=>true ,p_legend_rendered=>'off' +,p_legend_position=>'auto' +,p_overview_rendered=>'off' ,p_pie_other_threshold=>0 ,p_pie_selection_effect=>'highlight' +,p_horizontal_grid=>'auto' +,p_vertical_grid=>'auto' +,p_gauge_orientation=>'circular' +,p_gauge_plot_area=>'on' +,p_show_gauge_value=>true ); wwv_flow_api.create_jet_chart_series( p_id=>wwv_flow_api.id(11717080104773209) @@ -13876,6 +14385,7 @@ wwv_flow_api.create_jet_chart_series( ,p_items_label_rendered=>true ,p_items_label_position=>'aboveMarker' ,p_items_label_display_as=>'ALL' +,p_threshold_display=>'onIndicator' ); wwv_flow_api.create_page_plug( p_id=>wwv_flow_api.id(21609013755513694) @@ -14172,6 +14682,9 @@ wwv_flow_api.create_page_item( ,p_attribute_01=>'NONE' ,p_attribute_02=>'N' ); +end; +/ +begin wwv_flow_api.create_page_item( p_id=>wwv_flow_api.id(11706169664773195) ,p_name=>'P4_TAG_DATA' @@ -14356,9 +14869,6 @@ wwv_flow_api.create_page_item( ,p_attribute_01=>'NONE' ,p_attribute_02=>'N' ); -end; -/ -begin wwv_flow_api.create_page_item( p_id=>wwv_flow_api.id(12552627388313324) ,p_name=>'P4_INFO' @@ -14832,7 +15342,7 @@ wwv_flow_api.create_page( '#P5_REPORT_SELECTOR { background-color: #F5FBB4; font-weight: bold; font-size: 13px;}')) ,p_page_template_options=>'#DEFAULT#' ,p_last_updated_by=>'ADIZOHAR' -,p_last_upd_yyyymmddhh24miss=>'20200507123855' +,p_last_upd_yyyymmddhh24miss=>'20200514145916' ); wwv_flow_api.create_page_plug( p_id=>wwv_flow_api.id(22846551592241693) @@ -14887,7 +15397,7 @@ wwv_flow_api.create_report_region( ,p_source=>wwv_flow_string.join(wwv_flow_t_varchar2( 'SELECT ', ' case ', -' when :P5_REPORT_GROUP = ''Product'' or :P5_REPORT_GROUP is null then COST_PRODUCT_SKU || '' '' || replace(prd_description,''Oracle Cloud Infrastructure'',''OCI'')', +' when :P5_REPORT_GROUP = ''Product'' or :P5_REPORT_GROUP is null then COST_PRODUCT_SKU || '' '' || replace(replace(PRD_DESCRIPTION,COST_PRODUCT_SKU||'' - '',''''),''Oracle Cloud Infrastructure'',''OCI'')', ' when :P5_REPORT_GROUP = ''Region'' then prd_region', ' when :P5_REPORT_GROUP = ''Top Compartment'' then ', ' case ', @@ -14926,7 +15436,7 @@ wwv_flow_api.create_report_region( ' :P5_REPORT_SELECTOR = ''Monthly Cost Report''', 'GROUP BY ', ' case ', -' when :P5_REPORT_GROUP = ''Product'' or :P5_REPORT_GROUP is null then COST_PRODUCT_SKU || '' '' || replace(prd_description,''Oracle Cloud Infrastructure'',''OCI'')', +' when :P5_REPORT_GROUP = ''Product'' or :P5_REPORT_GROUP is null then COST_PRODUCT_SKU || '' '' || replace(replace(PRD_DESCRIPTION,COST_PRODUCT_SKU||'' - '',''''),''Oracle Cloud Infrastructure'',''OCI'')', ' when :P5_REPORT_GROUP = ''Region'' then prd_region', ' when :P5_REPORT_GROUP = ''Top Compartment'' then ', ' case ', @@ -15204,7 +15714,7 @@ wwv_flow_api.create_report_region( ,p_source=>wwv_flow_string.join(wwv_flow_t_varchar2( 'SELECT ', ' case ', -' when :P5_REPORT_GROUP = ''Product'' or :P5_REPORT_GROUP is null then COST_PRODUCT_SKU || '' '' || replace(prd_description,''Oracle Cloud Infrastructure'',''OCI'')', +' when :P5_REPORT_GROUP = ''Product'' or :P5_REPORT_GROUP is null then COST_PRODUCT_SKU || '' '' || replace(replace(PRD_DESCRIPTION,COST_PRODUCT_SKU||'' - '',''''),''Oracle Cloud Infrastructure'',''OCI'')', ' when :P5_REPORT_GROUP = ''Region'' then prd_region', ' when :P5_REPORT_GROUP = ''Top Compartment'' then ', ' case ', @@ -15263,7 +15773,7 @@ wwv_flow_api.create_report_region( '', 'GROUP BY ', ' case ', -' when :P5_REPORT_GROUP = ''Product'' or :P5_REPORT_GROUP is null then COST_PRODUCT_SKU || '' '' || replace(prd_description,''Oracle Cloud Infrastructure'',''OCI'')', +' when :P5_REPORT_GROUP = ''Product'' or :P5_REPORT_GROUP is null then COST_PRODUCT_SKU || '' '' || replace(replace(PRD_DESCRIPTION,COST_PRODUCT_SKU||'' - '',''''),''Oracle Cloud Infrastructure'',''OCI'')', ' when :P5_REPORT_GROUP = ''Region'' then prd_region', ' when :P5_REPORT_GROUP = ''Top Compartment'' then ', ' case ', @@ -15828,7 +16338,7 @@ wwv_flow_api.create_report_region( ,p_source=>wwv_flow_string.join(wwv_flow_t_varchar2( ' SELECT ', ' case ', -' when :P5_REPORT_GROUP = ''Product'' or :P5_REPORT_GROUP is null then COST_PRODUCT_SKU || '' '' || replace(prd_description,''Oracle Cloud Infrastructure'',''OCI'')', +' when :P5_REPORT_GROUP = ''Product'' or :P5_REPORT_GROUP is null then COST_PRODUCT_SKU || '' '' || replace(replace(PRD_DESCRIPTION,COST_PRODUCT_SKU||'' - '',''''),''Oracle Cloud Infrastructure'',''OCI'')', ' when :P5_REPORT_GROUP = ''Region'' then prd_region', ' when :P5_REPORT_GROUP = ''Top Compartment'' then ', ' case ', @@ -15907,7 +16417,7 @@ wwv_flow_api.create_report_region( ' :P5_REPORT_SELECTOR = ''Weekly Cost Report''', 'GROUP BY ', ' case ', -' when :P5_REPORT_GROUP = ''Product'' or :P5_REPORT_GROUP is null then COST_PRODUCT_SKU || '' '' || replace(prd_description,''Oracle Cloud Infrastructure'',''OCI'')', +' when :P5_REPORT_GROUP = ''Product'' or :P5_REPORT_GROUP is null then COST_PRODUCT_SKU || '' '' || replace(replace(PRD_DESCRIPTION,COST_PRODUCT_SKU||'' - '',''''),''Oracle Cloud Infrastructure'',''OCI'')', ' when :P5_REPORT_GROUP = ''Region'' then prd_region', ' when :P5_REPORT_GROUP = ''Top Compartment'' then ', ' case ', @@ -16717,7 +17227,7 @@ wwv_flow_api.create_report_region( 'FROM ', '(', ' SELECT ', -' COST_PRODUCT_SKU || '' '' || replace(prd_description,''Oracle Cloud Infrastructure'',''OCI'') PRODUCT_NAME,', +' COST_PRODUCT_SKU || '' '' || replace(replace(PRD_DESCRIPTION,COST_PRODUCT_SKU||'' - '',''''),''Oracle Cloud Infrastructure'',''OCI'') PRODUCT_NAME,', ' USAGE_INTERVAL_START,', ' case ', ' when COST_BILLING_UNIT like ''%HOURS%'' or PRD_DESCRIPTION like ''%Per Hour%'' then USG_BILLED_QUANTITY/24', @@ -17260,6 +17770,7 @@ wwv_flow_api.create_jet_chart( ,p_stack=>'on' ,p_stack_label=>'off' ,p_connect_nulls=>'Y' +,p_value_position=>'auto' ,p_sorting=>'label-asc' ,p_fill_multi_series_gaps=>true ,p_zoom_and_scroll=>'off' @@ -17267,8 +17778,20 @@ wwv_flow_api.create_jet_chart( ,p_show_series_name=>true ,p_show_group_name=>true ,p_show_value=>true +,p_show_label=>true +,p_show_row=>true +,p_show_start=>true +,p_show_end=>true +,p_show_progress=>true +,p_show_baseline=>true ,p_legend_rendered=>'on' ,p_legend_position=>'bottom' +,p_overview_rendered=>'off' +,p_horizontal_grid=>'auto' +,p_vertical_grid=>'auto' +,p_gauge_orientation=>'circular' +,p_gauge_plot_area=>'on' +,p_show_gauge_value=>true ); wwv_flow_api.create_jet_chart_series( p_id=>wwv_flow_api.id(13976866910041445) @@ -17334,7 +17857,9 @@ wwv_flow_api.create_jet_chart_series( ,p_assigned_to_y2=>'off' ,p_items_label_rendered=>true ,p_items_label_position=>'center' +,p_items_label_display_as=>'PERCENT' ,p_items_label_font_size=>'10' +,p_threshold_display=>'onIndicator' ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(13977108905041448) @@ -17350,6 +17875,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_major_tick_rendered=>'on' ,p_minor_tick_rendered=>'off' ,p_tick_label_rendered=>'on' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(13977078966041447) @@ -17366,6 +17899,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_tick_label_rendered=>'on' ,p_tick_label_rotation=>'auto' ,p_tick_label_position=>'outside' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_page_plug( p_id=>wwv_flow_api.id(14186462781270005) @@ -17395,6 +17936,7 @@ wwv_flow_api.create_jet_chart( ,p_stack=>'on' ,p_stack_label=>'on' ,p_connect_nulls=>'Y' +,p_value_position=>'auto' ,p_sorting=>'label-asc' ,p_fill_multi_series_gaps=>true ,p_zoom_and_scroll=>'off' @@ -17402,8 +17944,20 @@ wwv_flow_api.create_jet_chart( ,p_show_series_name=>true ,p_show_group_name=>true ,p_show_value=>true +,p_show_label=>true +,p_show_row=>true +,p_show_start=>true +,p_show_end=>true +,p_show_progress=>true +,p_show_baseline=>true ,p_legend_rendered=>'on' ,p_legend_position=>'end' +,p_overview_rendered=>'off' +,p_horizontal_grid=>'auto' +,p_vertical_grid=>'auto' +,p_gauge_orientation=>'circular' +,p_gauge_plot_area=>'on' +,p_show_gauge_value=>true ); wwv_flow_api.create_jet_chart_series( p_id=>wwv_flow_api.id(14186672156270007) @@ -17446,7 +18000,9 @@ wwv_flow_api.create_jet_chart_series( ,p_assigned_to_y2=>'off' ,p_items_label_rendered=>true ,p_items_label_position=>'center' +,p_items_label_display_as=>'PERCENT' ,p_items_label_font_size=>'10' +,p_threshold_display=>'onIndicator' ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(14186775683270008) @@ -17462,6 +18018,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_major_tick_rendered=>'on' ,p_minor_tick_rendered=>'off' ,p_tick_label_rendered=>'on' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(14186828501270009) @@ -17478,6 +18042,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_tick_label_rendered=>'on' ,p_tick_label_rotation=>'auto' ,p_tick_label_position=>'outside' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_page_plug( p_id=>wwv_flow_api.id(15050972044989901) @@ -17505,7 +18077,9 @@ wwv_flow_api.create_jet_chart( ,p_hide_and_show_behavior=>'none' ,p_hover_behavior=>'none' ,p_stack=>'on' +,p_stack_label=>'off' ,p_connect_nulls=>'Y' +,p_value_position=>'auto' ,p_sorting=>'label-asc' ,p_fill_multi_series_gaps=>true ,p_zoom_and_scroll=>'off' @@ -17513,9 +18087,24 @@ wwv_flow_api.create_jet_chart( ,p_show_series_name=>true ,p_show_group_name=>true ,p_show_value=>true +,p_show_label=>true +,p_show_row=>true +,p_show_start=>true +,p_show_end=>true +,p_show_progress=>true +,p_show_baseline=>true ,p_legend_rendered=>'on' ,p_legend_position=>'end' +,p_overview_rendered=>'off' +,p_horizontal_grid=>'auto' +,p_vertical_grid=>'auto' +,p_gauge_orientation=>'circular' +,p_gauge_plot_area=>'on' +,p_show_gauge_value=>true ); +end; +/ +begin wwv_flow_api.create_jet_chart_series( p_id=>wwv_flow_api.id(15051132224989903) ,p_chart_id=>wwv_flow_api.id(15051010405989902) @@ -17561,11 +18150,10 @@ wwv_flow_api.create_jet_chart_series( ,p_assigned_to_y2=>'off' ,p_items_label_rendered=>true ,p_items_label_position=>'center' +,p_items_label_display_as=>'PERCENT' ,p_items_label_font_size=>'10' +,p_threshold_display=>'onIndicator' ); -end; -/ -begin wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(15051263494989904) ,p_chart_id=>wwv_flow_api.id(15051010405989902) @@ -17580,6 +18168,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_major_tick_rendered=>'on' ,p_minor_tick_rendered=>'off' ,p_tick_label_rendered=>'on' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(15051343629989905) @@ -17596,6 +18192,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_tick_label_rendered=>'on' ,p_tick_label_rotation=>'auto' ,p_tick_label_position=>'outside' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_page_plug( p_id=>wwv_flow_api.id(15051727286989909) @@ -17614,7 +18218,7 @@ wwv_flow_api.create_jet_chart( p_id=>wwv_flow_api.id(15051899660989910) ,p_region_id=>wwv_flow_api.id(15051727286989909) ,p_chart_type=>'bar' -,p_height=>'450' +,p_height=>'600' ,p_animation_on_display=>'auto' ,p_animation_on_data_change=>'auto' ,p_orientation=>'vertical' @@ -17676,7 +18280,9 @@ wwv_flow_api.create_jet_chart_series( ,p_assigned_to_y2=>'off' ,p_items_label_rendered=>true ,p_items_label_position=>'center' +,p_items_label_display_as=>'PERCENT' ,p_items_label_font_size=>'10' +,p_threshold_display=>'onIndicator' ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(15052096900989912) @@ -17692,6 +18298,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_major_tick_rendered=>'on' ,p_minor_tick_rendered=>'off' ,p_tick_label_rendered=>'on' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(15052126213989913) @@ -17708,6 +18322,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_tick_label_rendered=>'on' ,p_tick_label_rotation=>'auto' ,p_tick_label_position=>'outside' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_page_plug( p_id=>wwv_flow_api.id(15052505519989917) @@ -17737,6 +18359,7 @@ wwv_flow_api.create_jet_chart( ,p_stack=>'on' ,p_stack_label=>'on' ,p_connect_nulls=>'Y' +,p_value_position=>'auto' ,p_sorting=>'label-asc' ,p_fill_multi_series_gaps=>true ,p_zoom_and_scroll=>'off' @@ -17744,8 +18367,20 @@ wwv_flow_api.create_jet_chart( ,p_show_series_name=>true ,p_show_group_name=>true ,p_show_value=>true +,p_show_label=>true +,p_show_row=>true +,p_show_start=>true +,p_show_end=>true +,p_show_progress=>true +,p_show_baseline=>true ,p_legend_rendered=>'on' ,p_legend_position=>'end' +,p_overview_rendered=>'off' +,p_horizontal_grid=>'auto' +,p_vertical_grid=>'auto' +,p_gauge_orientation=>'circular' +,p_gauge_plot_area=>'on' +,p_show_gauge_value=>true ); wwv_flow_api.create_jet_chart_series( p_id=>wwv_flow_api.id(15052776181989919) @@ -17788,7 +18423,9 @@ wwv_flow_api.create_jet_chart_series( ,p_assigned_to_y2=>'off' ,p_items_label_rendered=>true ,p_items_label_position=>'center' +,p_items_label_display_as=>'PERCENT' ,p_items_label_font_size=>'10' +,p_threshold_display=>'onIndicator' ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(15052897038989920) @@ -17804,6 +18441,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_major_tick_rendered=>'on' ,p_minor_tick_rendered=>'off' ,p_tick_label_rendered=>'on' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(15052900863989921) @@ -17820,6 +18465,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_tick_label_rendered=>'on' ,p_tick_label_rotation=>'auto' ,p_tick_label_position=>'outside' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_report_region( p_id=>wwv_flow_api.id(15053388277989925) @@ -17869,7 +18522,7 @@ wwv_flow_api.create_report_region( 'FROM ', '(', ' SELECT ', -' COST_PRODUCT_SKU || '' '' || replace(prd_description,''Oracle Cloud Infrastructure'',''OCI'') PRODUCT_NAME,', +' COST_PRODUCT_SKU || '' '' || replace(replace(PRD_DESCRIPTION,COST_PRODUCT_SKU||'' - '',''''),''Oracle Cloud Infrastructure'',''OCI'') PRODUCT_NAME,', ' USAGE_INTERVAL_START,', ' USG_BILLED_QUANTITY', ' FROM', @@ -18352,6 +19005,9 @@ wwv_flow_api.create_report_columns( ,p_derived_column=>'N' ,p_include_in_export=>'Y' ); +end; +/ +begin wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15083179032497506) ,p_query_column_id=>31 @@ -18393,7 +19049,7 @@ wwv_flow_api.create_report_region( ,p_query_type=>'SQL' ,p_source=>wwv_flow_string.join(wwv_flow_t_varchar2( ' SELECT ', -' COST_PRODUCT_SKU || '' '' || replace(prd_description,''Oracle Cloud Infrastructure'',''OCI'') as product_name,', +' COST_PRODUCT_SKU || '' '' || replace(replace(PRD_DESCRIPTION,COST_PRODUCT_SKU||'' - '',''''),''Oracle Cloud Infrastructure'',''OCI'') as product_name,', ' sum(case when to_char(USAGE_INTERVAL_START,''WW'') = ''01'' then USG_BILLED_QUANTITY else null end) W01,', ' sum(case when to_char(USAGE_INTERVAL_START,''WW'') = ''02'' then USG_BILLED_QUANTITY else null end) W02,', ' sum(case when to_char(USAGE_INTERVAL_START,''WW'') = ''03'' then USG_BILLED_QUANTITY else null end) W03,', @@ -18461,7 +19117,7 @@ wwv_flow_api.create_report_region( ' (:P5_TAG_DATA is null or tags_data like ''%#'' || nvl(:P5_TAG_KEY,''%'') || ''=%'' || :P5_TAG_DATA || ''#'') and', ' :P5_REPORT_SELECTOR = ''Weekly Product Unit Report''', 'GROUP BY ', -' COST_PRODUCT_SKU || '' '' || replace(prd_description,''Oracle Cloud Infrastructure'',''OCI'')', +' COST_PRODUCT_SKU || '' '' || replace(replace(PRD_DESCRIPTION,COST_PRODUCT_SKU||'' - '',''''),''Oracle Cloud Infrastructure'',''OCI'')', 'having sum(USG_BILLED_QUANTITY)>0;')) ,p_ajax_enabled=>'Y' ,p_query_row_template=>wwv_flow_api.id(9790776953688052) @@ -18507,14 +19163,11 @@ wwv_flow_api.create_report_region( ,p_sort_null=>'L' ,p_plug_query_strip_html=>'N' ); -end; -/ -begin wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15083882458497513) ,p_query_column_id=>1 ,p_column_alias=>'PRODUCT_NAME' -,p_column_display_sequence=>2 +,p_column_display_sequence=>1 ,p_column_heading=>'&P5_REPORT_GROUP.' ,p_use_as_row_header=>'N' ,p_column_html_expression=>'#PRODUCT_NAME#' @@ -18526,7 +19179,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15084020372497515) ,p_query_column_id=>2 ,p_column_alias=>'W01' -,p_column_display_sequence=>3 +,p_column_display_sequence=>2 ,p_column_heading=>'W01' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18540,7 +19193,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15084196664497516) ,p_query_column_id=>3 ,p_column_alias=>'W02' -,p_column_display_sequence=>4 +,p_column_display_sequence=>3 ,p_column_heading=>'W02' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18554,7 +19207,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15084234533497517) ,p_query_column_id=>4 ,p_column_alias=>'W03' -,p_column_display_sequence=>5 +,p_column_display_sequence=>4 ,p_column_heading=>'W03' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18568,7 +19221,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15084309261497518) ,p_query_column_id=>5 ,p_column_alias=>'W04' -,p_column_display_sequence=>6 +,p_column_display_sequence=>5 ,p_column_heading=>'W04' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18582,7 +19235,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15084429391497519) ,p_query_column_id=>6 ,p_column_alias=>'W05' -,p_column_display_sequence=>7 +,p_column_display_sequence=>6 ,p_column_heading=>'W05' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18596,7 +19249,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15084526180497520) ,p_query_column_id=>7 ,p_column_alias=>'W06' -,p_column_display_sequence=>8 +,p_column_display_sequence=>7 ,p_column_heading=>'W06' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18610,7 +19263,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15084637150497521) ,p_query_column_id=>8 ,p_column_alias=>'W07' -,p_column_display_sequence=>9 +,p_column_display_sequence=>8 ,p_column_heading=>'W07' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18624,7 +19277,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15084797622497522) ,p_query_column_id=>9 ,p_column_alias=>'W08' -,p_column_display_sequence=>10 +,p_column_display_sequence=>9 ,p_column_heading=>'W08' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18638,7 +19291,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15084836140497523) ,p_query_column_id=>10 ,p_column_alias=>'W09' -,p_column_display_sequence=>11 +,p_column_display_sequence=>10 ,p_column_heading=>'W09' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18652,7 +19305,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15084995246497524) ,p_query_column_id=>11 ,p_column_alias=>'W10' -,p_column_display_sequence=>12 +,p_column_display_sequence=>11 ,p_column_heading=>'W10' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18666,7 +19319,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15085033317497525) ,p_query_column_id=>12 ,p_column_alias=>'W11' -,p_column_display_sequence=>13 +,p_column_display_sequence=>12 ,p_column_heading=>'W11' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18680,7 +19333,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15085177774497526) ,p_query_column_id=>13 ,p_column_alias=>'W12' -,p_column_display_sequence=>14 +,p_column_display_sequence=>13 ,p_column_heading=>'W12' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18694,7 +19347,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15085250160497527) ,p_query_column_id=>14 ,p_column_alias=>'W13' -,p_column_display_sequence=>15 +,p_column_display_sequence=>14 ,p_column_heading=>'W13' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18708,7 +19361,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15085385329497528) ,p_query_column_id=>15 ,p_column_alias=>'W14' -,p_column_display_sequence=>16 +,p_column_display_sequence=>15 ,p_column_heading=>'W14' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18722,7 +19375,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15085480365497529) ,p_query_column_id=>16 ,p_column_alias=>'W15' -,p_column_display_sequence=>17 +,p_column_display_sequence=>16 ,p_column_heading=>'W15' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18736,7 +19389,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15085576532497530) ,p_query_column_id=>17 ,p_column_alias=>'W16' -,p_column_display_sequence=>18 +,p_column_display_sequence=>17 ,p_column_heading=>'W16' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18750,7 +19403,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15085669628497531) ,p_query_column_id=>18 ,p_column_alias=>'W17' -,p_column_display_sequence=>19 +,p_column_display_sequence=>18 ,p_column_heading=>'W17' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18764,7 +19417,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15085797503497532) ,p_query_column_id=>19 ,p_column_alias=>'W18' -,p_column_display_sequence=>20 +,p_column_display_sequence=>19 ,p_column_heading=>'W18' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18778,7 +19431,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15085831898497533) ,p_query_column_id=>20 ,p_column_alias=>'W19' -,p_column_display_sequence=>21 +,p_column_display_sequence=>20 ,p_column_heading=>'W19' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18792,7 +19445,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15085995417497534) ,p_query_column_id=>21 ,p_column_alias=>'W20' -,p_column_display_sequence=>22 +,p_column_display_sequence=>21 ,p_column_heading=>'W20' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18806,7 +19459,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15086033795497535) ,p_query_column_id=>22 ,p_column_alias=>'W21' -,p_column_display_sequence=>23 +,p_column_display_sequence=>22 ,p_column_heading=>'W21' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18820,7 +19473,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15086169388497536) ,p_query_column_id=>23 ,p_column_alias=>'W22' -,p_column_display_sequence=>24 +,p_column_display_sequence=>23 ,p_column_heading=>'W22' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18834,7 +19487,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15086256237497537) ,p_query_column_id=>24 ,p_column_alias=>'W23' -,p_column_display_sequence=>25 +,p_column_display_sequence=>24 ,p_column_heading=>'W23' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18848,7 +19501,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15086305029497538) ,p_query_column_id=>25 ,p_column_alias=>'W24' -,p_column_display_sequence=>26 +,p_column_display_sequence=>25 ,p_column_heading=>'W24' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18862,7 +19515,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15086424118497539) ,p_query_column_id=>26 ,p_column_alias=>'W25' -,p_column_display_sequence=>27 +,p_column_display_sequence=>26 ,p_column_heading=>'W25' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18876,7 +19529,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15086575044497540) ,p_query_column_id=>27 ,p_column_alias=>'W26' -,p_column_display_sequence=>28 +,p_column_display_sequence=>27 ,p_column_heading=>'W26' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18890,7 +19543,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15086644472497541) ,p_query_column_id=>28 ,p_column_alias=>'W27' -,p_column_display_sequence=>29 +,p_column_display_sequence=>28 ,p_column_heading=>'W27' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18904,7 +19557,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15086736459497542) ,p_query_column_id=>29 ,p_column_alias=>'W28' -,p_column_display_sequence=>30 +,p_column_display_sequence=>29 ,p_column_heading=>'W28' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18918,7 +19571,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15086866979497543) ,p_query_column_id=>30 ,p_column_alias=>'W29' -,p_column_display_sequence=>31 +,p_column_display_sequence=>30 ,p_column_heading=>'W29' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18932,7 +19585,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15083737349497512) ,p_query_column_id=>31 ,p_column_alias=>'W30' -,p_column_display_sequence=>32 +,p_column_display_sequence=>31 ,p_column_heading=>'W30' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18946,7 +19599,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15086972484497544) ,p_query_column_id=>32 ,p_column_alias=>'W31' -,p_column_display_sequence=>33 +,p_column_display_sequence=>32 ,p_column_heading=>'W31' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18960,7 +19613,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15087043653497545) ,p_query_column_id=>33 ,p_column_alias=>'W32' -,p_column_display_sequence=>34 +,p_column_display_sequence=>33 ,p_column_heading=>'W32' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18974,7 +19627,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15087140332497546) ,p_query_column_id=>34 ,p_column_alias=>'W33' -,p_column_display_sequence=>35 +,p_column_display_sequence=>34 ,p_column_heading=>'W33' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -18988,7 +19641,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15087212537497547) ,p_query_column_id=>35 ,p_column_alias=>'W34' -,p_column_display_sequence=>36 +,p_column_display_sequence=>35 ,p_column_heading=>'W34' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -19002,7 +19655,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15087301471497548) ,p_query_column_id=>36 ,p_column_alias=>'W35' -,p_column_display_sequence=>37 +,p_column_display_sequence=>36 ,p_column_heading=>'W35' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -19016,7 +19669,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15087435183497549) ,p_query_column_id=>37 ,p_column_alias=>'W36' -,p_column_display_sequence=>38 +,p_column_display_sequence=>37 ,p_column_heading=>'W36' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -19030,7 +19683,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15087578148497550) ,p_query_column_id=>38 ,p_column_alias=>'W37' -,p_column_display_sequence=>39 +,p_column_display_sequence=>38 ,p_column_heading=>'W37' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -19044,7 +19697,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15101314487532001) ,p_query_column_id=>39 ,p_column_alias=>'W38' -,p_column_display_sequence=>40 +,p_column_display_sequence=>39 ,p_column_heading=>'W38' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -19058,7 +19711,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15101467741532002) ,p_query_column_id=>40 ,p_column_alias=>'W39' -,p_column_display_sequence=>41 +,p_column_display_sequence=>40 ,p_column_heading=>'W39' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -19072,7 +19725,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15101501587532003) ,p_query_column_id=>41 ,p_column_alias=>'W40' -,p_column_display_sequence=>42 +,p_column_display_sequence=>41 ,p_column_heading=>'W40' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -19086,7 +19739,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15101628599532004) ,p_query_column_id=>42 ,p_column_alias=>'W41' -,p_column_display_sequence=>43 +,p_column_display_sequence=>42 ,p_column_heading=>'W41' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -19100,7 +19753,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15101775120532005) ,p_query_column_id=>43 ,p_column_alias=>'W42' -,p_column_display_sequence=>44 +,p_column_display_sequence=>43 ,p_column_heading=>'W42' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -19114,7 +19767,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15101834422532006) ,p_query_column_id=>44 ,p_column_alias=>'W43' -,p_column_display_sequence=>45 +,p_column_display_sequence=>44 ,p_column_heading=>'W43' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -19128,7 +19781,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15101918299532007) ,p_query_column_id=>45 ,p_column_alias=>'W44' -,p_column_display_sequence=>46 +,p_column_display_sequence=>45 ,p_column_heading=>'W44' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -19142,7 +19795,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15102016850532008) ,p_query_column_id=>46 ,p_column_alias=>'W45' -,p_column_display_sequence=>47 +,p_column_display_sequence=>46 ,p_column_heading=>'W45' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -19156,7 +19809,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15102102479532009) ,p_query_column_id=>47 ,p_column_alias=>'W46' -,p_column_display_sequence=>48 +,p_column_display_sequence=>47 ,p_column_heading=>'W46' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -19170,7 +19823,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15102201934532010) ,p_query_column_id=>48 ,p_column_alias=>'W47' -,p_column_display_sequence=>49 +,p_column_display_sequence=>48 ,p_column_heading=>'W47' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -19184,7 +19837,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15102376964532011) ,p_query_column_id=>49 ,p_column_alias=>'W48' -,p_column_display_sequence=>50 +,p_column_display_sequence=>49 ,p_column_heading=>'W48' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -19198,7 +19851,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15102424245532012) ,p_query_column_id=>50 ,p_column_alias=>'W49' -,p_column_display_sequence=>51 +,p_column_display_sequence=>50 ,p_column_heading=>'W49' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -19212,7 +19865,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15102519216532013) ,p_query_column_id=>51 ,p_column_alias=>'W50' -,p_column_display_sequence=>52 +,p_column_display_sequence=>51 ,p_column_heading=>'W50' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -19226,7 +19879,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15102602847532014) ,p_query_column_id=>52 ,p_column_alias=>'W51' -,p_column_display_sequence=>53 +,p_column_display_sequence=>52 ,p_column_heading=>'W51' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -19240,7 +19893,7 @@ wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15102752424532015) ,p_query_column_id=>53 ,p_column_alias=>'W52' -,p_column_display_sequence=>54 +,p_column_display_sequence=>53 ,p_column_heading=>'W52' ,p_use_as_row_header=>'N' ,p_column_format=>'999G999G999G999G990D00' @@ -19263,7 +19916,7 @@ wwv_flow_api.create_report_region( ,p_query_type=>'SQL' ,p_source=>wwv_flow_string.join(wwv_flow_t_varchar2( 'SELECT ', -' COST_PRODUCT_SKU || '' '' || replace(prd_description,''Oracle Cloud Infrastructure'',''OCI'') as product_name,', +' COST_PRODUCT_SKU || '' '' || replace(replace(PRD_DESCRIPTION,COST_PRODUCT_SKU||'' - '',''''),''Oracle Cloud Infrastructure'',''OCI'') as product_name,', ' sum(case when to_char(USAGE_INTERVAL_START,''MM'') = ''01'' then USG_BILLED_QUANTITY else null end) Jan,', ' sum(case when to_char(USAGE_INTERVAL_START,''MM'') = ''02'' then USG_BILLED_QUANTITY else null end) Feb,', ' sum(case when to_char(USAGE_INTERVAL_START,''MM'') = ''03'' then USG_BILLED_QUANTITY else null end) Mar,', @@ -19291,7 +19944,7 @@ wwv_flow_api.create_report_region( ' (:P5_TAG_DATA is null or tags_data like ''%#'' || nvl(:P5_TAG_KEY,''%'') || ''=%'' || :P5_TAG_DATA || ''#'') and', ' :P5_REPORT_SELECTOR = ''Monthly Product Unit Report''', 'GROUP BY ', -' COST_PRODUCT_SKU || '' '' || replace(prd_description,''Oracle Cloud Infrastructure'',''OCI'')', +' COST_PRODUCT_SKU || '' '' || replace(replace(PRD_DESCRIPTION,COST_PRODUCT_SKU||'' - '',''''),''Oracle Cloud Infrastructure'',''OCI'')', 'having sum(USG_BILLED_QUANTITY)>0;', '')) ,p_ajax_enabled=>'Y' @@ -19338,6 +19991,9 @@ wwv_flow_api.create_report_region( ,p_sort_null=>'L' ,p_plug_query_strip_html=>'N' ); +end; +/ +begin wwv_flow_api.create_report_columns( p_id=>wwv_flow_api.id(15102928440532017) ,p_query_column_id=>1 @@ -19546,6 +20202,7 @@ wwv_flow_api.create_jet_chart( ,p_stack=>'on' ,p_stack_label=>'off' ,p_connect_nulls=>'Y' +,p_value_position=>'auto' ,p_sorting=>'label-asc' ,p_fill_multi_series_gaps=>true ,p_zoom_and_scroll=>'off' @@ -19553,8 +20210,20 @@ wwv_flow_api.create_jet_chart( ,p_show_series_name=>true ,p_show_group_name=>true ,p_show_value=>true +,p_show_label=>true +,p_show_row=>true +,p_show_start=>true +,p_show_end=>true +,p_show_progress=>true +,p_show_baseline=>true ,p_legend_rendered=>'on' ,p_legend_position=>'bottom' +,p_overview_rendered=>'off' +,p_horizontal_grid=>'auto' +,p_vertical_grid=>'auto' +,p_gauge_orientation=>'circular' +,p_gauge_plot_area=>'on' +,p_show_gauge_value=>true ); wwv_flow_api.create_jet_chart_series( p_id=>wwv_flow_api.id(12038129542075985) @@ -19620,11 +20289,10 @@ wwv_flow_api.create_jet_chart_series( ,p_assigned_to_y2=>'off' ,p_items_label_rendered=>true ,p_items_label_position=>'center' +,p_items_label_display_as=>'PERCENT' ,p_items_label_font_size=>'10' +,p_threshold_display=>'onIndicator' ); -end; -/ -begin wwv_flow_api.create_jet_chart_series( p_id=>wwv_flow_api.id(11933638002191629) ,p_chart_id=>wwv_flow_api.id(12036462660075984) @@ -19689,7 +20357,9 @@ wwv_flow_api.create_jet_chart_series( ,p_assigned_to_y2=>'off' ,p_items_label_rendered=>true ,p_items_label_position=>'center' +,p_items_label_display_as=>'PERCENT' ,p_items_label_font_size=>'10' +,p_threshold_display=>'onIndicator' ); wwv_flow_api.create_jet_chart_axis( p_id=>wwv_flow_api.id(12036986078075984) @@ -19729,6 +20399,14 @@ wwv_flow_api.create_jet_chart_axis( ,p_major_tick_rendered=>'on' ,p_minor_tick_rendered=>'off' ,p_tick_label_rendered=>'on' +,p_zoom_order_seconds=>false +,p_zoom_order_minutes=>false +,p_zoom_order_hours=>false +,p_zoom_order_days=>false +,p_zoom_order_weeks=>false +,p_zoom_order_months=>false +,p_zoom_order_quarters=>false +,p_zoom_order_years=>false ); wwv_flow_api.create_page_plug( p_id=>wwv_flow_api.id(41488126786200900) @@ -20181,6 +20859,9 @@ wwv_flow_api.create_page_item( ,p_attribute_02=>'VALUE' ,p_attribute_04=>'Y' ); +end; +/ +begin wwv_flow_api.create_page_item( p_id=>wwv_flow_api.id(12055265653076068) ,p_name=>'P5_SUBSCRIPTION' @@ -20412,9 +21093,6 @@ wwv_flow_api.create_page_item( ,p_attribute_02=>'VALUE' ,p_attribute_04=>'Y' ); -end; -/ -begin wwv_flow_api.create_page_computation( p_id=>wwv_flow_api.id(11934077528191633) ,p_computation_sequence=>10 @@ -21017,6 +21695,7 @@ wwv_flow_api.create_worksheet( ,p_max_row_count=>'1000000' ,p_show_nulls_as=>'-' ,p_show_search_bar=>'N' +,p_report_list_mode=>'TABS' ,p_show_detail_link=>'N' ,p_owner=>'ADI.ZOHAR@ORACLE.COM' ,p_internal_uid=>13352241944239119 @@ -21246,6 +21925,7 @@ wwv_flow_api.create_worksheet( ,p_max_row_count=>'1000000' ,p_show_nulls_as=>'-' ,p_show_search_bar=>'N' +,p_report_list_mode=>'TABS' ,p_show_detail_link=>'N' ,p_owner=>'ADI.ZOHAR@ORACLE.COM' ,p_internal_uid=>13350953403239106 @@ -21404,6 +22084,341 @@ wwv_flow_api.create_page_item( ); end; / +prompt --application/pages/page_00007 +begin +wwv_flow_api.create_page( + p_id=>7 +,p_user_interface_id=>wwv_flow_api.id(9843694399688199) +,p_name=>'Rate Card' +,p_step_title=>'Rate Card' +,p_autocomplete_on_off=>'OFF' +,p_inline_css=>wwv_flow_string.join(wwv_flow_t_varchar2( +'.a-IRR-table tr td[headers*="rep_col_grey"]', +'{', +' background-color: #efffff;', +'}', +'.a-IRR-table tr td[headers*="rep_col_blue"]', +'{', +' background-color: #ffefff;', +'}', +'', +'')) +,p_page_template_options=>'#DEFAULT#' +,p_last_updated_by=>'ADIZOHAR' +,p_last_upd_yyyymmddhh24miss=>'20200514125242' +); +wwv_flow_api.create_page_plug( + p_id=>wwv_flow_api.id(72369311697812384) +,p_plug_name=>'Filter' +,p_region_template_options=>'#DEFAULT#:t-Region--removeHeader:t-Region--accent12:t-Region--scrollBody:t-Form--noPadding:margin-top-none:margin-bottom-md:margin-left-none:margin-right-none' +,p_plug_template=>wwv_flow_api.id(9765042323688020) +,p_plug_display_sequence=>10 +,p_include_in_reg_disp_sel_yn=>'Y' +,p_plug_grid_column_span=>12 +,p_plug_display_point=>'BODY' +,p_plug_query_options=>'DERIVED_REPORT_COLUMNS' +,p_attribute_01=>'N' +,p_attribute_02=>'HTML' +); +wwv_flow_api.create_page_plug( + p_id=>wwv_flow_api.id(83161602120160340) +,p_plug_name=>'ShowGraphs' +,p_region_template_options=>'#DEFAULT#:t-Region--removeHeader:t-Region--scrollBody' +,p_plug_template=>wwv_flow_api.id(9765042323688020) +,p_plug_display_sequence=>40 +,p_include_in_reg_disp_sel_yn=>'Y' +,p_plug_display_point=>'BODY' +,p_plug_query_options=>'DERIVED_REPORT_COLUMNS' +,p_attribute_01=>'N' +,p_attribute_02=>'HTML' +); +wwv_flow_api.create_page_plug( + p_id=>wwv_flow_api.id(61791178689852192) +,p_plug_name=>'Rate Card Report' +,p_parent_plug_id=>wwv_flow_api.id(83161602120160340) +,p_region_template_options=>'#DEFAULT#' +,p_plug_template=>wwv_flow_api.id(9763915989688019) +,p_plug_display_sequence=>60 +,p_plug_display_point=>'BODY' +,p_query_type=>'SQL' +,p_plug_source=>wwv_flow_string.join(wwv_flow_t_varchar2( +'SELECT', +' TENANT_NAME TENANT,', +' COST_PRODUCT_SKU SKU,', +' replace(PRD_DESCRIPTION,COST_PRODUCT_SKU||'' - '','''') PRODUCT,', +' COST_CURRENCY_CODE CURRENCY,', +' COST_UNIT_PRICE COST_PRICE,', +' COST_LAST_UPDATE,', +' RATE_DESCRIPTION,', +' RATE_PAYGO_PRICE RATE_PAYGO,', +' CASE WHEN RATE_PAYGO_PRICE > 0 AND RATE_PAYGO_PRICE IS NOT NULL and COST_UNIT_PRICE > 0 THEN', +' ROUND((RATE_PAYGO_PRICE - COST_UNIT_PRICE )/RATE_PAYGO_PRICE * 100,1)', +' ELSE NULL END PCT_PAYGO,', +' ROUND(RATE_MONTHLY_FLEX_PRICE,4) RATE_MONTHLY,', +' CASE WHEN RATE_MONTHLY_FLEX_PRICE > 0 AND RATE_MONTHLY_FLEX_PRICE IS NOT NULL and COST_UNIT_PRICE>0 THEN', +' ROUND((RATE_MONTHLY_FLEX_PRICE - COST_UNIT_PRICE )/RATE_MONTHLY_FLEX_PRICE * 100,1)', +' ELSE NULL END PCT_MONTH,', +' RATE_UPDATE_DATE', +'FROM', +' OCI_PRICE_LIST', +'where tenant_name=:P7_TENANT_NAME', +'order by cost_product_sku;')) +,p_plug_source_type=>'NATIVE_IR' +,p_plug_query_options=>'DERIVED_REPORT_COLUMNS' +,p_prn_content_disposition=>'ATTACHMENT' +,p_prn_document_header=>'APEX' +,p_prn_units=>'INCHES' +,p_prn_paper_size=>'LETTER' +,p_prn_width=>8.5 +,p_prn_height=>11 +,p_prn_orientation=>'HORIZONTAL' +,p_prn_page_header_font_color=>'#000000' +,p_prn_page_header_font_family=>'Helvetica' +,p_prn_page_header_font_weight=>'normal' +,p_prn_page_header_font_size=>'12' +,p_prn_page_footer_font_color=>'#000000' +,p_prn_page_footer_font_family=>'Helvetica' +,p_prn_page_footer_font_weight=>'normal' +,p_prn_page_footer_font_size=>'12' +,p_prn_header_bg_color=>'#9bafde' +,p_prn_header_font_color=>'#000000' +,p_prn_header_font_family=>'Helvetica' +,p_prn_header_font_weight=>'normal' +,p_prn_header_font_size=>'10' +,p_prn_body_bg_color=>'#efefef' +,p_prn_body_font_color=>'#000000' +,p_prn_body_font_family=>'Helvetica' +,p_prn_body_font_weight=>'normal' +,p_prn_body_font_size=>'10' +,p_prn_border_width=>.5 +,p_prn_page_header_alignment=>'CENTER' +,p_prn_page_footer_alignment=>'CENTER' +); +wwv_flow_api.create_worksheet( + p_id=>wwv_flow_api.id(16358400984490309) +,p_max_row_count=>'1000000' +,p_show_nulls_as=>'-' +,p_pagination_type=>'ROWS_X_TO_Y' +,p_pagination_display_pos=>'BOTTOM_RIGHT' +,p_report_list_mode=>'TABS' +,p_show_detail_link=>'N' +,p_show_notify=>'Y' +,p_download_formats=>'CSV:HTML:EMAIL:XLS:PDF:RTF' +,p_owner=>'ADIZOHAR' +,p_internal_uid=>16358400984490309 +); +wwv_flow_api.create_worksheet_column( + p_id=>wwv_flow_api.id(16358519224490310) +,p_db_column_name=>'TENANT' +,p_display_order=>10 +,p_column_identifier=>'A' +,p_column_label=>'Tenant' +,p_column_type=>'STRING' +); +wwv_flow_api.create_worksheet_column( + p_id=>wwv_flow_api.id(16358680829490311) +,p_db_column_name=>'SKU' +,p_display_order=>20 +,p_column_identifier=>'B' +,p_column_label=>'Sku' +,p_column_type=>'STRING' +); +wwv_flow_api.create_worksheet_column( + p_id=>wwv_flow_api.id(16358753197490312) +,p_db_column_name=>'PRODUCT' +,p_display_order=>30 +,p_column_identifier=>'C' +,p_column_label=>'Product' +,p_column_html_expression=>'#PRODUCT#' +,p_column_type=>'STRING' +); +wwv_flow_api.create_worksheet_column( + p_id=>wwv_flow_api.id(16358884845490313) +,p_db_column_name=>'CURRENCY' +,p_display_order=>40 +,p_column_identifier=>'D' +,p_column_label=>'Currency' +,p_column_type=>'STRING' +,p_column_alignment=>'CENTER' +); +wwv_flow_api.create_worksheet_column( + p_id=>wwv_flow_api.id(16358959661490314) +,p_db_column_name=>'COST_PRICE' +,p_display_order=>50 +,p_column_identifier=>'E' +,p_column_label=>'Cost Price' +,p_column_type=>'NUMBER' +,p_column_alignment=>'RIGHT' +,p_format_mask=>'999G999G999G999G990D0000' +,p_static_id=>'rep_col_grey' +); +wwv_flow_api.create_worksheet_column( + p_id=>wwv_flow_api.id(16359088388490315) +,p_db_column_name=>'COST_LAST_UPDATE' +,p_display_order=>60 +,p_column_identifier=>'F' +,p_column_label=>'Cost Last Update' +,p_column_html_expression=>'#COST_LAST_UPDATE#' +,p_column_type=>'DATE' +,p_column_alignment=>'CENTER' +,p_format_mask=>'DD-MON-YYYY HH24:MI' +,p_tz_dependent=>'N' +); +wwv_flow_api.create_worksheet_column( + p_id=>wwv_flow_api.id(16359157348490316) +,p_db_column_name=>'RATE_DESCRIPTION' +,p_display_order=>70 +,p_column_identifier=>'G' +,p_column_label=>'Rate Full Description' +,p_column_html_expression=>'#RATE_DESCRIPTION#' +,p_column_type=>'STRING' +); +wwv_flow_api.create_worksheet_column( + p_id=>wwv_flow_api.id(16359237070490317) +,p_db_column_name=>'RATE_PAYGO' +,p_display_order=>80 +,p_column_identifier=>'H' +,p_column_label=>'Public Rate PayGo' +,p_column_type=>'NUMBER' +,p_column_alignment=>'RIGHT' +,p_format_mask=>'999G999G999G999G990D0000' +); +wwv_flow_api.create_worksheet_column( + p_id=>wwv_flow_api.id(16359398402490318) +,p_db_column_name=>'PCT_PAYGO' +,p_display_order=>90 +,p_column_identifier=>'I' +,p_column_label=>'% Discount PayGo' +,p_column_type=>'NUMBER' +,p_column_alignment=>'RIGHT' +,p_format_mask=>'999G999G999G999G990D00' +,p_static_id=>'rep_col_blue' +); +wwv_flow_api.create_worksheet_column( + p_id=>wwv_flow_api.id(16359449849490319) +,p_db_column_name=>'RATE_MONTHLY' +,p_display_order=>100 +,p_column_identifier=>'J' +,p_column_label=>'Public Rate MonFlex' +,p_column_type=>'NUMBER' +,p_column_alignment=>'RIGHT' +,p_format_mask=>'999G999G999G999G990D0000' +,p_static_id=>'rep_col_grey' +); +wwv_flow_api.create_worksheet_column( + p_id=>wwv_flow_api.id(16359539927490320) +,p_db_column_name=>'PCT_MONTH' +,p_display_order=>110 +,p_column_identifier=>'K' +,p_column_label=>'% Discount MonFlex' +,p_column_type=>'NUMBER' +,p_column_alignment=>'RIGHT' +,p_format_mask=>'999G999G999G999G990D00' +,p_static_id=>'rep_col_blue' +); +wwv_flow_api.create_worksheet_column( + p_id=>wwv_flow_api.id(16359640418490321) +,p_db_column_name=>'RATE_UPDATE_DATE' +,p_display_order=>120 +,p_column_identifier=>'L' +,p_column_label=>'Rate Update Date' +,p_column_html_expression=>'#RATE_UPDATE_DATE#' +,p_column_type=>'DATE' +,p_column_alignment=>'CENTER' +,p_format_mask=>'DD-MON-YYYY HH24:MI' +,p_tz_dependent=>'N' +); +wwv_flow_api.create_worksheet_rpt( + p_id=>wwv_flow_api.id(16392788699988040) +,p_application_user=>'APXWS_DEFAULT' +,p_report_seq=>10 +,p_report_alias=>'163928' +,p_status=>'PUBLIC' +,p_is_default=>'Y' +,p_report_columns=>'SKU:PRODUCT:CURRENCY:COST_PRICE:PCT_MONTH:RATE_MONTHLY:RATE_DESCRIPTION:RATE_UPDATE_DATE:' +); +wwv_flow_api.create_worksheet_rpt( + p_id=>wwv_flow_api.id(16440462414039910) +,p_application_user=>'APXWS_ALTERNATIVE' +,p_name=>'PayGo' +,p_report_seq=>10 +,p_report_alias=>'164405' +,p_status=>'PUBLIC' +,p_is_default=>'Y' +,p_report_columns=>'SKU:PRODUCT:CURRENCY:COST_PRICE:RATE_PAYGO:PCT_PAYGO:RATE_DESCRIPTION:RATE_UPDATE_DATE:' +); +wwv_flow_api.create_worksheet_rpt( + p_id=>wwv_flow_api.id(16440945673042259) +,p_application_user=>'APXWS_ALTERNATIVE' +,p_name=>'Monthly Flex' +,p_report_seq=>10 +,p_report_alias=>'164410' +,p_status=>'PUBLIC' +,p_is_default=>'Y' +,p_report_columns=>'SKU:PRODUCT:CURRENCY:COST_PRICE:PCT_MONTH:RATE_MONTHLY:RATE_DESCRIPTION:RATE_UPDATE_DATE:' +); +wwv_flow_api.create_page_item( + p_id=>wwv_flow_api.id(16372411599522248) +,p_name=>'P7_TENANT_NAME' +,p_item_sequence=>10 +,p_item_plug_id=>wwv_flow_api.id(72369311697812384) +,p_prompt=>'Tenant Name' +,p_display_as=>'NATIVE_SELECT_LIST' +,p_lov=>'select distinct tenant_name o, tenant_name r from oci_cost order by 1' +,p_lov_display_null=>'YES' +,p_lov_null_text=>'Please Choose...' +,p_cHeight=>1 +,p_colspan=>2 +,p_field_template=>wwv_flow_api.id(9820028477688087) +,p_item_template_options=>'#DEFAULT#' +,p_lov_display_extra=>'NO' +,p_attribute_01=>'SUBMIT' +,p_attribute_03=>'Y' +); +wwv_flow_api.create_page_computation( + p_id=>wwv_flow_api.id(16378387657522263) +,p_computation_sequence=>10 +,p_computation_item=>'P7_TENANT_NAME' +,p_computation_point=>'AFTER_HEADER' +,p_computation_type=>'QUERY' +,p_computation=>'select tenant_name from oci_cost where rownum=1' +,p_compute_when=>'P7_TENANT_NAME' +,p_compute_when_type=>'ITEM_IS_NULL' +); +wwv_flow_api.create_page_da_event( + p_id=>wwv_flow_api.id(16378604995522264) +,p_name=>'ShowGraphsOrNot' +,p_event_sequence=>10 +,p_triggering_element_type=>'ITEM' +,p_triggering_element=>'P7_ROWS' +,p_condition_element=>'P7_ROWS' +,p_triggering_condition_type=>'GREATER_THAN' +,p_triggering_expression=>'0' +,p_bind_type=>'bind' +,p_bind_event_type=>'change' +); +wwv_flow_api.create_page_da_action( + p_id=>wwv_flow_api.id(16379183002522265) +,p_event_id=>wwv_flow_api.id(16378604995522264) +,p_event_result=>'TRUE' +,p_action_sequence=>10 +,p_execute_on_page_init=>'Y' +,p_action=>'NATIVE_SHOW' +,p_affected_elements_type=>'REGION' +,p_affected_region_id=>wwv_flow_api.id(83161602120160340) +); +wwv_flow_api.create_page_da_action( + p_id=>wwv_flow_api.id(16379612138522266) +,p_event_id=>wwv_flow_api.id(16378604995522264) +,p_event_result=>'FALSE' +,p_action_sequence=>20 +,p_execute_on_page_init=>'Y' +,p_action=>'NATIVE_HIDE' +,p_affected_elements_type=>'REGION' +,p_affected_region_id=>wwv_flow_api.id(83161602120160340) +); +end; +/ prompt --application/pages/page_09999 begin wwv_flow_api.create_page( diff --git a/examples/usage_reports_to_adw/img/screen_8.png b/examples/usage_reports_to_adw/img/screen_8.png new file mode 100644 index 0000000000..e690c51029 Binary files /dev/null and b/examples/usage_reports_to_adw/img/screen_8.png differ diff --git a/examples/usage_reports_to_adw/readme.md b/examples/usage_reports_to_adw/readme.md index 528f3b603c..213f275662 100644 --- a/examples/usage_reports_to_adw/readme.md +++ b/examples/usage_reports_to_adw/readme.md @@ -8,12 +8,22 @@ Authentication to OCI by User or instance principals. ** DISCLAIMER – This is not an official Oracle application ** +## Main Features +- Usage Current State +- Usage Over Time +- Cost Analysis +- Cost Over Time +- Rate Card for Used Products + ## Cost Reports ![](img/screen_4.png) ![](img/screen_5.png) ![](img/screen_6.png) ![](img/screen_7.png) +## Rate Card +![](img/screen_8.png) + ## Usage Reports ![](img/screen_1.png) ![](img/screen_2.png) @@ -47,6 +57,7 @@ Please check step by step guide - [step_by_step_installation.md](step_by_step_in - OCI_COST_STATS - Summary Stats of the Cost Report for quick query if only filtered by tenant and date - OCI_COST_TAG_KEYS - Tag keys of the cost reports - OCI_COST_REFERENCE - Reference table of the cost filter keys - SERVICE, REGION, COMPARTMENT, PRODUCT, SUBSCRIPTION +- OCI_PRICE_LIST - Hold the price list and the cost per product ## OCI APIs Used: - IdentityClient.list_compartments - Policy COMPARTMENT_INSPECT @@ -54,6 +65,9 @@ Please check step by step guide - [step_by_step_installation.md](step_by_step_in - ObjectStorageClient.list_objects - Policy OBJECT_INSPECT - ObjectStorageClient.get_object - Policy OBJECT_READ +## REST API Used: +- https://itra.oraclecloud.com/itas/.anon/myservices/api/v1/products?partNumber=XX + ## Python 3 OCI SDK ### Installation of Python 3 incase you don't have Python3 installed: @@ -62,6 +76,9 @@ Please follow Python Documentation - https://docs.python.org/3/using/index.html ### install oci SDK Packages: Please follow Oracle Python SDK Documentation - https://github.com/oracle/oci-python-sdk +### install requests package: +pip install requests or pip3 install requests + ## Setup connectivity using Instance Principals ``` diff --git a/examples/usage_reports_to_adw/step_by_step_installation.md b/examples/usage_reports_to_adw/step_by_step_installation.md index 1a9c518e20..6e865a7d1c 100644 --- a/examples/usage_reports_to_adw/step_by_step_installation.md +++ b/examples/usage_reports_to_adw/step_by_step_installation.md @@ -98,7 +98,7 @@ Oracle Application Express (APEX) will be used for reporting. ``` sudo yum install -y python3 - sudo pip3 install oci oci-cli cx_Oracle + sudo pip3 install oci oci-cli cx_Oracle requests # test instance principle is working using oci-cli oci os ns get --auth instance_principal @@ -264,7 +264,7 @@ Oracle Application Express (APEX) will be used for reporting. ## 16. Import APEX application -Download [usage.demo.apex.sql](apex_demo_app/usage.demo.apex.sql) from github "apex_demo_app" folder +Right Click and Download [usage.demo.apex.sql](https://raw.githubusercontent.com/oracle/oci-python-sdk/master/examples/usage_reports_to_adw/apex_demo_app/usage.demo.apex.sql) from github "apex_demo_app" folder (raw) ``` APEX Top Menu -> App Builder -> Import diff --git a/examples/usage_reports_to_adw/usage2adw.py b/examples/usage_reports_to_adw/usage2adw.py index 747c4d9a3f..ff9720f692 100644 --- a/examples/usage_reports_to_adw/usage2adw.py +++ b/examples/usage_reports_to_adw/usage2adw.py @@ -44,6 +44,9 @@ # - ObjectStorageClient.list_objects - Policy OBJECT_INSPECT # - ObjectStorageClient.get_object - Policy OBJECT_READ # +# Meter API for Public Rate: +# - https://itra.oraclecloud.com/itas/.anon/myservices/api/v1/products?partNumber=XX +# ########################################################################## # Tables used: # - OCI_USAGE - Raw data of the usage reports @@ -53,6 +56,7 @@ # - OCI_COST_STATS - Summary Stats of the Cost Report for quick query if only filtered by tenant and date # - OCI_COST_TAG_KEYS - Tag keys of the cost reports # - OCI_COST_REFERENCE - Reference table of the cost filter keys - SERVICE, REGION, COMPARTMENT, PRODUCT, SUBSCRIPTION +# - OCI_PRICE_LIST - Hold the price list and the cost per product ########################################################################## import sys import argparse @@ -62,8 +66,10 @@ import os import csv import cx_Oracle +import requests + -version = "20.05.11" +version = "20.05.18" usage_report_namespace = "bling" work_report_dir = os.curdir + "/work_report_dir" @@ -435,6 +441,58 @@ def update_cost_stats(connection): raise Exception("\nError manipulating database at update_cost_stats() - " + str(e)) +########################################################################## +# update_price_list +########################################################################## +def update_price_list(connection): + try: + # open cursor + cursor = connection.cursor() + + print("\nMerging statistics into OCI_PRICE_LIST...") + + # run merge to oci_update_stats + sql = "MERGE INTO OCI_PRICE_LIST A " + sql += "USING " + sql += "( " + sql += " SELECT " + sql += " TENANT_NAME, " + sql += " COST_PRODUCT_SKU, " + sql += " PRD_DESCRIPTION, " + sql += " COST_CURRENCY_CODE, " + sql += " COST_UNIT_PRICE " + sql += " FROM " + sql += " ( " + sql += " SELECT " + sql += " TENANT_NAME, " + sql += " COST_PRODUCT_SKU, " + sql += " PRD_DESCRIPTION, " + sql += " COST_CURRENCY_CODE, " + sql += " COST_UNIT_PRICE, " + sql += " ROW_NUMBER() OVER (PARTITION BY TENANT_NAME, COST_PRODUCT_SKU ORDER BY USAGE_INTERVAL_START DESC, COST_UNIT_PRICE DESC) RN " + sql += " FROM OCI_COST A " + sql += " ) " + sql += " WHERE RN = 1 " + sql += " ORDER BY 1,2 " + sql += ") B " + sql += "ON (A.TENANT_NAME = B.TENANT_NAME AND A.COST_PRODUCT_SKU = B.COST_PRODUCT_SKU) " + sql += "WHEN MATCHED THEN UPDATE SET A.PRD_DESCRIPTION=B.PRD_DESCRIPTION, A.COST_CURRENCY_CODE=B.COST_CURRENCY_CODE, A.COST_UNIT_PRICE=B.COST_UNIT_PRICE, COST_LAST_UPDATE = SYSDATE " + sql += "WHEN NOT MATCHED THEN INSERT (TENANT_NAME,COST_PRODUCT_SKU,PRD_DESCRIPTION,COST_CURRENCY_CODE,COST_UNIT_PRICE,COST_LAST_UPDATE) " + sql += " VALUES (B.TENANT_NAME,B.COST_PRODUCT_SKU,B.PRD_DESCRIPTION,B.COST_CURRENCY_CODE,B.COST_UNIT_PRICE,SYSDATE)" + + cursor.execute(sql) + connection.commit() + print(" Merge Completed, " + str(cursor.rowcount) + " rows merged") + cursor.close() + + except cx_Oracle.DatabaseError as e: + print("\nError manipulating database at update_price_list() - " + str(e) + "\n") + raise SystemExit + + except Exception as e: + raise Exception("\nError manipulating database at update_price_list() - " + str(e)) + + ########################################################################## # update_cost_reference ########################################################################## @@ -486,6 +544,83 @@ def update_cost_reference(connection): raise Exception("\nError manipulating database at update_cost_reference() - " + str(e)) +########################################################################## +# update_public_rates +########################################################################## +def update_public_rates(connection, tenant_name): + try: + # open cursor + num_rows = 0 + cursor = connection.cursor() + api_url = "https://itra.oraclecloud.com/itas/.anon/myservices/api/v1/products?partNumber=" + + print("\nMerging Public Rates into OCI_RATE_CARD...") + + # retrieve the SKUS to query + sql = "select COST_PRODUCT_SKU, COST_CURRENCY_CODE from OCI_PRICE_LIST where tenant_name=:tenant_name" + + cursor.execute(sql, {"tenant_name": tenant_name}) + rows = cursor.fetchall() + + if rows: + for row in rows: + + rate_description = "" + rate_paygo_price = None + rate_monthly_flex_price = None + + # Call API to fetch the data + cost_produdt_sku = str(row[0]) + country_code = str(row[1]) + resp = requests.get(api_url + cost_produdt_sku, headers={'X-Oracle-Accept-CurrencyCode': country_code}) + + if not resp: + continue + + for item in resp.json()['items']: + rate_description = item["displayName"] + for price in item['prices']: + if price['model'] == 'PAY_AS_YOU_GO': + rate_paygo_price = price['value'] + elif price['model'] == 'MONTHLY_COMMIT': + rate_monthly_flex_price = price['value'] + + # update database + sql = "update OCI_PRICE_LIST set " + sql += "RATE_DESCRIPTION=:rate_description, " + sql += "RATE_PAYGO_PRICE=:rate_paygo, " + sql += "RATE_MONTHLY_FLEX_PRICE=:rate_monthly, " + sql += "RATE_UPDATE_DATE=sysdate " + sql += "where TENANT_NAME=:tenant_name and COST_PRODUCT_SKU=:cost_produdt_sku " + + sql_variables = { + "rate_description": rate_description, + "rate_paygo": rate_paygo_price, + "rate_monthly": rate_monthly_flex_price, + "tenant_name": tenant_name, + "cost_produdt_sku": cost_produdt_sku + } + + cursor.execute(sql, sql_variables) + num_rows += 1 + + # Commit + connection.commit() + + print(" Update Completed, " + str(num_rows) + " rows updated.") + cursor.close() + + except cx_Oracle.DatabaseError as e: + print("\nError manipulating database at update_public_rates() - " + str(e) + "\n") + raise SystemExit + + except requests.exceptions.ConnectionError as e: + print("\nError connecting to billing metering API at update_public_rates() - " + str(e)) + + except Exception as e: + raise Exception("\nError manipulating database at update_public_rates() - " + str(e)) + + ########################################################################## # update_usage_stats ########################################################################## @@ -667,6 +802,52 @@ def check_database_table_structure_cost(connection): raise Exception("\nError manipulating database at check_database_table_structure_cost() - " + str(e)) +########################################################################## +# Check Table Structure Price List +########################################################################## +def check_database_table_structure_price_list(connection, tenant_name): + try: + # open cursor + cursor = connection.cursor() + + # check if OCI_PRICE_LIST table exist, if not create + sql = "select count(*) from user_tables where table_name = 'OCI_PRICE_LIST'" + cursor.execute(sql) + val, = cursor.fetchone() + + # if table not exist, create it + if val == 0: + print(" Table OCI_PRICE_LIST was not exist, creating") + sql = "create table OCI_PRICE_LIST (" + sql += " TENANT_NAME VARCHAR2(100)," + sql += " COST_PRODUCT_SKU VARCHAR2(10)," + sql += " PRD_DESCRIPTION VARCHAR2(1000)," + sql += " COST_CURRENCY_CODE VARCHAR2(10)," + sql += " COST_UNIT_PRICE NUMBER," + sql += " COST_LAST_UPDATE DATE," + sql += " RATE_DESCRIPTION VARCHAR2(1000)," + sql += " RATE_PAYGO_PRICE NUMBER," + sql += " RATE_MONTHLY_FLEX_PRICE NUMBER," + sql += " RATE_UPDATE_DATE DATE," + sql += " CONSTRAINT OCI_PRICE_LIST_PK PRIMARY KEY (TENANT_NAME,COST_PRODUCT_SKU) " + sql += ") " + cursor.execute(sql) + print(" Table OCI_PRICE_LIST created") + update_price_list(connection) + update_public_rates(connection, tenant_name) + else: + print(" Table OCI_PRICE_LIST exist") + + cursor.close() + + except cx_Oracle.DatabaseError as e: + print("\nError manipulating database at check_database_table_price_list() - " + str(e) + "\n") + raise SystemExit + + except Exception as e: + raise Exception("\nError manipulating database at check_database_table_price_list() - " + str(e)) + + ######################################################################### # Load Cost File ########################################################################## @@ -789,6 +970,26 @@ def load_cost_file(connection, object_storage, object_file, max_file_id, cmd, te product_Description = "Oracle Security Monitoring and Compliance Edition" cost_billingUnitReadable = "100 Entities Per Hour" + elif cost_productSku == "B88269" and product_Description == "": + product_Description = "Compute Classic" + cost_billingUnitReadable = "OCPU Per Hour " + + elif cost_productSku == "B88269" and product_Description == "": + product_Description = "Compute Classic" + cost_billingUnitReadable = "OCPU Per Hour" + + elif cost_productSku == "B88275" and product_Description == "": + product_Description = "Block Storage Classic - High I/O" + cost_billingUnitReadable = "Gigabyte Storage Per Month" + + elif cost_productSku == "B88283" and product_Description == "": + product_Description = "Object Storage Classic - GET and all other Requests" + cost_billingUnitReadable = "10,000 Requests Per Month" + + elif cost_productSku == "B88284" and product_Description == "": + product_Description = "Object Storage Classic - PUT, COPY, POST or LIST Requests" + cost_billingUnitReadable = "10,000 Requests Per Month" + # create array row_data = ( str(tenancy.name), @@ -1132,6 +1333,7 @@ def main_process(): print("\nChecking Database Structure...") check_database_table_structure_usage(connection) check_database_table_structure_cost(connection) + check_database_table_structure_price_list(connection, tenancy.name) ############################### # fetch max file id processed @@ -1198,6 +1400,8 @@ def main_process(): if cost_num > 0: update_cost_stats(connection) update_cost_reference(connection) + update_price_list(connection) + update_public_rates(connection, tenancy.name) # Close Connection connection.close() diff --git a/src/oci/apigateway/models/__init__.py b/src/oci/apigateway/models/__init__.py index de29013c7b..58bc976d45 100644 --- a/src/oci/apigateway/models/__init__.py +++ b/src/oci/apigateway/models/__init__.py @@ -30,9 +30,17 @@ from .gateway_summary import GatewaySummary from .http_backend import HTTPBackend from .header_field_specification import HeaderFieldSpecification +from .json_web_key import JsonWebKey +from .json_web_token_claim import JsonWebTokenClaim +from .jwt_authentication_policy import JwtAuthenticationPolicy from .oracle_function_backend import OracleFunctionBackend +from .pem_encoded_public_key import PemEncodedPublicKey +from .public_key_set import PublicKeySet from .rate_limiting_policy import RateLimitingPolicy +from .remote_json_web_key_set import RemoteJsonWebKeySet from .route_authorization_policy import RouteAuthorizationPolicy +from .static_public_key import StaticPublicKey +from .static_public_key_set import StaticPublicKeySet from .stock_response_backend import StockResponseBackend from .update_deployment_details import UpdateDeploymentDetails from .update_gateway_details import UpdateGatewayDetails @@ -73,9 +81,17 @@ "GatewaySummary": GatewaySummary, "HTTPBackend": HTTPBackend, "HeaderFieldSpecification": HeaderFieldSpecification, + "JsonWebKey": JsonWebKey, + "JsonWebTokenClaim": JsonWebTokenClaim, + "JwtAuthenticationPolicy": JwtAuthenticationPolicy, "OracleFunctionBackend": OracleFunctionBackend, + "PemEncodedPublicKey": PemEncodedPublicKey, + "PublicKeySet": PublicKeySet, "RateLimitingPolicy": RateLimitingPolicy, + "RemoteJsonWebKeySet": RemoteJsonWebKeySet, "RouteAuthorizationPolicy": RouteAuthorizationPolicy, + "StaticPublicKey": StaticPublicKey, + "StaticPublicKeySet": StaticPublicKeySet, "StockResponseBackend": StockResponseBackend, "UpdateDeploymentDetails": UpdateDeploymentDetails, "UpdateGatewayDetails": UpdateGatewayDetails, diff --git a/src/oci/apigateway/models/authentication_policy.py b/src/oci/apigateway/models/authentication_policy.py index 549092af46..9ce179ac30 100644 --- a/src/oci/apigateway/models/authentication_policy.py +++ b/src/oci/apigateway/models/authentication_policy.py @@ -17,11 +17,16 @@ class AuthenticationPolicy(object): #: This constant has a value of "CUSTOM_AUTHENTICATION" TYPE_CUSTOM_AUTHENTICATION = "CUSTOM_AUTHENTICATION" + #: A constant which can be used with the type property of a AuthenticationPolicy. + #: This constant has a value of "JWT_AUTHENTICATION" + TYPE_JWT_AUTHENTICATION = "JWT_AUTHENTICATION" + def __init__(self, **kwargs): """ Initializes a new AuthenticationPolicy object with values from keyword arguments. This class has the following subclasses and if you are using this class as input to a service operations then you should favor using a subclass over the base class: + * :class:`~oci.apigateway.models.JwtAuthenticationPolicy` * :class:`~oci.apigateway.models.CustomAuthenticationPolicy` The following keyword arguments are supported (corresponding to the getters/setters of this class): @@ -32,7 +37,7 @@ def __init__(self, **kwargs): :param type: The value to assign to the type property of this AuthenticationPolicy. - Allowed values for this property are: "CUSTOM_AUTHENTICATION", 'UNKNOWN_ENUM_VALUE'. + Allowed values for this property are: "CUSTOM_AUTHENTICATION", "JWT_AUTHENTICATION", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'. :type type: str @@ -58,6 +63,9 @@ def get_subtype(object_dictionary): """ type = object_dictionary['type'] + if type == 'JWT_AUTHENTICATION': + return 'JwtAuthenticationPolicy' + if type == 'CUSTOM_AUTHENTICATION': return 'CustomAuthenticationPolicy' else: @@ -95,7 +103,7 @@ def type(self): **[Required]** Gets the type of this AuthenticationPolicy. Type of the authentication policy to use. - Allowed values for this property are: "CUSTOM_AUTHENTICATION", 'UNKNOWN_ENUM_VALUE'. + Allowed values for this property are: "CUSTOM_AUTHENTICATION", "JWT_AUTHENTICATION", 'UNKNOWN_ENUM_VALUE'. Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'. @@ -114,7 +122,7 @@ def type(self, type): :param type: The type of this AuthenticationPolicy. :type: str """ - allowed_values = ["CUSTOM_AUTHENTICATION"] + allowed_values = ["CUSTOM_AUTHENTICATION", "JWT_AUTHENTICATION"] if not value_allowed_none_or_none_sentinel(type, allowed_values): type = 'UNKNOWN_ENUM_VALUE' self._type = type diff --git a/src/oci/apigateway/models/custom_authentication_policy.py b/src/oci/apigateway/models/custom_authentication_policy.py index fd013319a1..71a3f080b6 100644 --- a/src/oci/apigateway/models/custom_authentication_policy.py +++ b/src/oci/apigateway/models/custom_authentication_policy.py @@ -26,7 +26,7 @@ def __init__(self, **kwargs): :param type: The value to assign to the type property of this CustomAuthenticationPolicy. - Allowed values for this property are: "CUSTOM_AUTHENTICATION" + Allowed values for this property are: "CUSTOM_AUTHENTICATION", "JWT_AUTHENTICATION" :type type: str :param function_id: diff --git a/src/oci/apigateway/models/json_web_key.py b/src/oci/apigateway/models/json_web_key.py new file mode 100644 index 0000000000..4818aef936 --- /dev/null +++ b/src/oci/apigateway/models/json_web_key.py @@ -0,0 +1,283 @@ +# coding: utf-8 +# Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved. +# This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license. + +from .static_public_key import StaticPublicKey +from oci.util import formatted_flat_dict, NONE_SENTINEL, value_allowed_none_or_none_sentinel # noqa: F401 +from oci.decorators import init_model_state_from_kwargs + + +@init_model_state_from_kwargs +class JsonWebKey(StaticPublicKey): + """ + A JSON Web Key that represents the public key used for verifying the JWT signature. + """ + + #: A constant which can be used with the kty property of a JsonWebKey. + #: This constant has a value of "RSA" + KTY_RSA = "RSA" + + #: A constant which can be used with the use property of a JsonWebKey. + #: This constant has a value of "sig" + USE_SIG = "sig" + + #: A constant which can be used with the key_ops property of a JsonWebKey. + #: This constant has a value of "verify" + KEY_OPS_VERIFY = "verify" + + def __init__(self, **kwargs): + """ + Initializes a new JsonWebKey object with values from keyword arguments. The default value of the :py:attr:`~oci.apigateway.models.JsonWebKey.format` attribute + of this class is ``JSON_WEB_KEY`` and it should not be changed. + The following keyword arguments are supported (corresponding to the getters/setters of this class): + + :param kid: + The value to assign to the kid property of this JsonWebKey. + :type kid: str + + :param format: + The value to assign to the format property of this JsonWebKey. + Allowed values for this property are: "JSON_WEB_KEY", "PEM", 'UNKNOWN_ENUM_VALUE'. + Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'. + :type format: str + + :param kty: + The value to assign to the kty property of this JsonWebKey. + Allowed values for this property are: "RSA", 'UNKNOWN_ENUM_VALUE'. + Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'. + :type kty: str + + :param use: + The value to assign to the use property of this JsonWebKey. + Allowed values for this property are: "sig", 'UNKNOWN_ENUM_VALUE'. + Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'. + :type use: str + + :param key_ops: + The value to assign to the key_ops property of this JsonWebKey. + Allowed values for items in this list are: "verify", 'UNKNOWN_ENUM_VALUE'. + Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'. + :type key_ops: list[str] + + :param alg: + The value to assign to the alg property of this JsonWebKey. + :type alg: str + + :param n: + The value to assign to the n property of this JsonWebKey. + :type n: str + + :param e: + The value to assign to the e property of this JsonWebKey. + :type e: str + + """ + self.swagger_types = { + 'kid': 'str', + 'format': 'str', + 'kty': 'str', + 'use': 'str', + 'key_ops': 'list[str]', + 'alg': 'str', + 'n': 'str', + 'e': 'str' + } + + self.attribute_map = { + 'kid': 'kid', + 'format': 'format', + 'kty': 'kty', + 'use': 'use', + 'key_ops': 'key_ops', + 'alg': 'alg', + 'n': 'n', + 'e': 'e' + } + + self._kid = None + self._format = None + self._kty = None + self._use = None + self._key_ops = None + self._alg = None + self._n = None + self._e = None + self._format = 'JSON_WEB_KEY' + + @property + def kty(self): + """ + **[Required]** Gets the kty of this JsonWebKey. + The key type. + + Allowed values for this property are: "RSA", 'UNKNOWN_ENUM_VALUE'. + Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'. + + + :return: The kty of this JsonWebKey. + :rtype: str + """ + return self._kty + + @kty.setter + def kty(self, kty): + """ + Sets the kty of this JsonWebKey. + The key type. + + + :param kty: The kty of this JsonWebKey. + :type: str + """ + allowed_values = ["RSA"] + if not value_allowed_none_or_none_sentinel(kty, allowed_values): + kty = 'UNKNOWN_ENUM_VALUE' + self._kty = kty + + @property + def use(self): + """ + Gets the use of this JsonWebKey. + The intended use of the public key. + + Allowed values for this property are: "sig", 'UNKNOWN_ENUM_VALUE'. + Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'. + + + :return: The use of this JsonWebKey. + :rtype: str + """ + return self._use + + @use.setter + def use(self, use): + """ + Sets the use of this JsonWebKey. + The intended use of the public key. + + + :param use: The use of this JsonWebKey. + :type: str + """ + allowed_values = ["sig"] + if not value_allowed_none_or_none_sentinel(use, allowed_values): + use = 'UNKNOWN_ENUM_VALUE' + self._use = use + + @property + def key_ops(self): + """ + Gets the key_ops of this JsonWebKey. + The operations for which this key is to be used. + + Allowed values for items in this list are: "verify", 'UNKNOWN_ENUM_VALUE'. + Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'. + + + :return: The key_ops of this JsonWebKey. + :rtype: list[str] + """ + return self._key_ops + + @key_ops.setter + def key_ops(self, key_ops): + """ + Sets the key_ops of this JsonWebKey. + The operations for which this key is to be used. + + + :param key_ops: The key_ops of this JsonWebKey. + :type: list[str] + """ + allowed_values = ["verify"] + if key_ops: + key_ops[:] = ['UNKNOWN_ENUM_VALUE' if not value_allowed_none_or_none_sentinel(x, allowed_values) else x for x in key_ops] + self._key_ops = key_ops + + @property + def alg(self): + """ + **[Required]** Gets the alg of this JsonWebKey. + The algorithm intended for use with this key. + + + :return: The alg of this JsonWebKey. + :rtype: str + """ + return self._alg + + @alg.setter + def alg(self, alg): + """ + Sets the alg of this JsonWebKey. + The algorithm intended for use with this key. + + + :param alg: The alg of this JsonWebKey. + :type: str + """ + self._alg = alg + + @property + def n(self): + """ + **[Required]** Gets the n of this JsonWebKey. + The base64 url encoded modulus of the RSA public key represented + by this key. + + + :return: The n of this JsonWebKey. + :rtype: str + """ + return self._n + + @n.setter + def n(self, n): + """ + Sets the n of this JsonWebKey. + The base64 url encoded modulus of the RSA public key represented + by this key. + + + :param n: The n of this JsonWebKey. + :type: str + """ + self._n = n + + @property + def e(self): + """ + **[Required]** Gets the e of this JsonWebKey. + The base64 url encoded exponent of the RSA public key represented + by this key. + + + :return: The e of this JsonWebKey. + :rtype: str + """ + return self._e + + @e.setter + def e(self, e): + """ + Sets the e of this JsonWebKey. + The base64 url encoded exponent of the RSA public key represented + by this key. + + + :param e: The e of this JsonWebKey. + :type: str + """ + self._e = e + + def __repr__(self): + return formatted_flat_dict(self) + + def __eq__(self, other): + if other is None: + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not self == other diff --git a/src/oci/apigateway/models/json_web_token_claim.py b/src/oci/apigateway/models/json_web_token_claim.py new file mode 100644 index 0000000000..219bd224a5 --- /dev/null +++ b/src/oci/apigateway/models/json_web_token_claim.py @@ -0,0 +1,140 @@ +# coding: utf-8 +# Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved. +# This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license. + + +from oci.util import formatted_flat_dict, NONE_SENTINEL, value_allowed_none_or_none_sentinel # noqa: F401 +from oci.decorators import init_model_state_from_kwargs + + +@init_model_state_from_kwargs +class JsonWebTokenClaim(object): + """ + An individual JWT claim. + """ + + def __init__(self, **kwargs): + """ + Initializes a new JsonWebTokenClaim object with values from keyword arguments. + The following keyword arguments are supported (corresponding to the getters/setters of this class): + + :param key: + The value to assign to the key property of this JsonWebTokenClaim. + :type key: str + + :param values: + The value to assign to the values property of this JsonWebTokenClaim. + :type values: list[str] + + :param is_required: + The value to assign to the is_required property of this JsonWebTokenClaim. + :type is_required: bool + + """ + self.swagger_types = { + 'key': 'str', + 'values': 'list[str]', + 'is_required': 'bool' + } + + self.attribute_map = { + 'key': 'key', + 'values': 'values', + 'is_required': 'isRequired' + } + + self._key = None + self._values = None + self._is_required = None + + @property + def key(self): + """ + **[Required]** Gets the key of this JsonWebTokenClaim. + Name of the claim. + + + :return: The key of this JsonWebTokenClaim. + :rtype: str + """ + return self._key + + @key.setter + def key(self, key): + """ + Sets the key of this JsonWebTokenClaim. + Name of the claim. + + + :param key: The key of this JsonWebTokenClaim. + :type: str + """ + self._key = key + + @property + def values(self): + """ + Gets the values of this JsonWebTokenClaim. + The list of acceptable values for a given claim. + If this value is \"null\" or empty and \"isRequired\" set to \"true\", then + the presence of this claim in the JWT is validated. + + + :return: The values of this JsonWebTokenClaim. + :rtype: list[str] + """ + return self._values + + @values.setter + def values(self, values): + """ + Sets the values of this JsonWebTokenClaim. + The list of acceptable values for a given claim. + If this value is \"null\" or empty and \"isRequired\" set to \"true\", then + the presence of this claim in the JWT is validated. + + + :param values: The values of this JsonWebTokenClaim. + :type: list[str] + """ + self._values = values + + @property + def is_required(self): + """ + Gets the is_required of this JsonWebTokenClaim. + Whether the claim is required to be present in the JWT or not. If set + to \"false\", the claim values will be matched only if the claim is + present in the JWT. + + + :return: The is_required of this JsonWebTokenClaim. + :rtype: bool + """ + return self._is_required + + @is_required.setter + def is_required(self, is_required): + """ + Sets the is_required of this JsonWebTokenClaim. + Whether the claim is required to be present in the JWT or not. If set + to \"false\", the claim values will be matched only if the claim is + present in the JWT. + + + :param is_required: The is_required of this JsonWebTokenClaim. + :type: bool + """ + self._is_required = is_required + + def __repr__(self): + return formatted_flat_dict(self) + + def __eq__(self, other): + if other is None: + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not self == other diff --git a/src/oci/apigateway/models/jwt_authentication_policy.py b/src/oci/apigateway/models/jwt_authentication_policy.py new file mode 100644 index 0000000000..2a5e77da48 --- /dev/null +++ b/src/oci/apigateway/models/jwt_authentication_policy.py @@ -0,0 +1,305 @@ +# coding: utf-8 +# Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved. +# This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license. + +from .authentication_policy import AuthenticationPolicy +from oci.util import formatted_flat_dict, NONE_SENTINEL, value_allowed_none_or_none_sentinel # noqa: F401 +from oci.decorators import init_model_state_from_kwargs + + +@init_model_state_from_kwargs +class JwtAuthenticationPolicy(AuthenticationPolicy): + """ + Validate a JWT token present in the header or query parameter. A valid + policy must specify either tokenHeader or tokenQueryParam. + """ + + def __init__(self, **kwargs): + """ + Initializes a new JwtAuthenticationPolicy object with values from keyword arguments. The default value of the :py:attr:`~oci.apigateway.models.JwtAuthenticationPolicy.type` attribute + of this class is ``JWT_AUTHENTICATION`` and it should not be changed. + The following keyword arguments are supported (corresponding to the getters/setters of this class): + + :param is_anonymous_access_allowed: + The value to assign to the is_anonymous_access_allowed property of this JwtAuthenticationPolicy. + :type is_anonymous_access_allowed: bool + + :param type: + The value to assign to the type property of this JwtAuthenticationPolicy. + Allowed values for this property are: "CUSTOM_AUTHENTICATION", "JWT_AUTHENTICATION" + :type type: str + + :param token_header: + The value to assign to the token_header property of this JwtAuthenticationPolicy. + :type token_header: str + + :param token_query_param: + The value to assign to the token_query_param property of this JwtAuthenticationPolicy. + :type token_query_param: str + + :param token_auth_scheme: + The value to assign to the token_auth_scheme property of this JwtAuthenticationPolicy. + :type token_auth_scheme: str + + :param issuers: + The value to assign to the issuers property of this JwtAuthenticationPolicy. + :type issuers: list[str] + + :param audiences: + The value to assign to the audiences property of this JwtAuthenticationPolicy. + :type audiences: list[str] + + :param verify_claims: + The value to assign to the verify_claims property of this JwtAuthenticationPolicy. + :type verify_claims: list[JsonWebTokenClaim] + + :param max_clock_skew_in_seconds: + The value to assign to the max_clock_skew_in_seconds property of this JwtAuthenticationPolicy. + :type max_clock_skew_in_seconds: float + + :param public_keys: + The value to assign to the public_keys property of this JwtAuthenticationPolicy. + :type public_keys: PublicKeySet + + """ + self.swagger_types = { + 'is_anonymous_access_allowed': 'bool', + 'type': 'str', + 'token_header': 'str', + 'token_query_param': 'str', + 'token_auth_scheme': 'str', + 'issuers': 'list[str]', + 'audiences': 'list[str]', + 'verify_claims': 'list[JsonWebTokenClaim]', + 'max_clock_skew_in_seconds': 'float', + 'public_keys': 'PublicKeySet' + } + + self.attribute_map = { + 'is_anonymous_access_allowed': 'isAnonymousAccessAllowed', + 'type': 'type', + 'token_header': 'tokenHeader', + 'token_query_param': 'tokenQueryParam', + 'token_auth_scheme': 'tokenAuthScheme', + 'issuers': 'issuers', + 'audiences': 'audiences', + 'verify_claims': 'verifyClaims', + 'max_clock_skew_in_seconds': 'maxClockSkewInSeconds', + 'public_keys': 'publicKeys' + } + + self._is_anonymous_access_allowed = None + self._type = None + self._token_header = None + self._token_query_param = None + self._token_auth_scheme = None + self._issuers = None + self._audiences = None + self._verify_claims = None + self._max_clock_skew_in_seconds = None + self._public_keys = None + self._type = 'JWT_AUTHENTICATION' + + @property + def token_header(self): + """ + Gets the token_header of this JwtAuthenticationPolicy. + The name of the header containing the authentication token. + + + :return: The token_header of this JwtAuthenticationPolicy. + :rtype: str + """ + return self._token_header + + @token_header.setter + def token_header(self, token_header): + """ + Sets the token_header of this JwtAuthenticationPolicy. + The name of the header containing the authentication token. + + + :param token_header: The token_header of this JwtAuthenticationPolicy. + :type: str + """ + self._token_header = token_header + + @property + def token_query_param(self): + """ + Gets the token_query_param of this JwtAuthenticationPolicy. + The name of the query parameter containing the authentication token. + + + :return: The token_query_param of this JwtAuthenticationPolicy. + :rtype: str + """ + return self._token_query_param + + @token_query_param.setter + def token_query_param(self, token_query_param): + """ + Sets the token_query_param of this JwtAuthenticationPolicy. + The name of the query parameter containing the authentication token. + + + :param token_query_param: The token_query_param of this JwtAuthenticationPolicy. + :type: str + """ + self._token_query_param = token_query_param + + @property + def token_auth_scheme(self): + """ + Gets the token_auth_scheme of this JwtAuthenticationPolicy. + The authentication scheme that is to be used when authenticating + the token. This must to be provided if \"tokenHeader\" is specified. + + + :return: The token_auth_scheme of this JwtAuthenticationPolicy. + :rtype: str + """ + return self._token_auth_scheme + + @token_auth_scheme.setter + def token_auth_scheme(self, token_auth_scheme): + """ + Sets the token_auth_scheme of this JwtAuthenticationPolicy. + The authentication scheme that is to be used when authenticating + the token. This must to be provided if \"tokenHeader\" is specified. + + + :param token_auth_scheme: The token_auth_scheme of this JwtAuthenticationPolicy. + :type: str + """ + self._token_auth_scheme = token_auth_scheme + + @property + def issuers(self): + """ + **[Required]** Gets the issuers of this JwtAuthenticationPolicy. + A list of parties that could have issued the token. + + + :return: The issuers of this JwtAuthenticationPolicy. + :rtype: list[str] + """ + return self._issuers + + @issuers.setter + def issuers(self, issuers): + """ + Sets the issuers of this JwtAuthenticationPolicy. + A list of parties that could have issued the token. + + + :param issuers: The issuers of this JwtAuthenticationPolicy. + :type: list[str] + """ + self._issuers = issuers + + @property + def audiences(self): + """ + **[Required]** Gets the audiences of this JwtAuthenticationPolicy. + The list of intended recipients for the token. + + + :return: The audiences of this JwtAuthenticationPolicy. + :rtype: list[str] + """ + return self._audiences + + @audiences.setter + def audiences(self, audiences): + """ + Sets the audiences of this JwtAuthenticationPolicy. + The list of intended recipients for the token. + + + :param audiences: The audiences of this JwtAuthenticationPolicy. + :type: list[str] + """ + self._audiences = audiences + + @property + def verify_claims(self): + """ + Gets the verify_claims of this JwtAuthenticationPolicy. + A list of claims which should be validated to consider the token valid. + + + :return: The verify_claims of this JwtAuthenticationPolicy. + :rtype: list[JsonWebTokenClaim] + """ + return self._verify_claims + + @verify_claims.setter + def verify_claims(self, verify_claims): + """ + Sets the verify_claims of this JwtAuthenticationPolicy. + A list of claims which should be validated to consider the token valid. + + + :param verify_claims: The verify_claims of this JwtAuthenticationPolicy. + :type: list[JsonWebTokenClaim] + """ + self._verify_claims = verify_claims + + @property + def max_clock_skew_in_seconds(self): + """ + Gets the max_clock_skew_in_seconds of this JwtAuthenticationPolicy. + The maximum expected time difference between the system clocks + of the token issuer and the API Gateway. + + + :return: The max_clock_skew_in_seconds of this JwtAuthenticationPolicy. + :rtype: float + """ + return self._max_clock_skew_in_seconds + + @max_clock_skew_in_seconds.setter + def max_clock_skew_in_seconds(self, max_clock_skew_in_seconds): + """ + Sets the max_clock_skew_in_seconds of this JwtAuthenticationPolicy. + The maximum expected time difference between the system clocks + of the token issuer and the API Gateway. + + + :param max_clock_skew_in_seconds: The max_clock_skew_in_seconds of this JwtAuthenticationPolicy. + :type: float + """ + self._max_clock_skew_in_seconds = max_clock_skew_in_seconds + + @property + def public_keys(self): + """ + **[Required]** Gets the public_keys of this JwtAuthenticationPolicy. + + :return: The public_keys of this JwtAuthenticationPolicy. + :rtype: PublicKeySet + """ + return self._public_keys + + @public_keys.setter + def public_keys(self, public_keys): + """ + Sets the public_keys of this JwtAuthenticationPolicy. + + :param public_keys: The public_keys of this JwtAuthenticationPolicy. + :type: PublicKeySet + """ + self._public_keys = public_keys + + def __repr__(self): + return formatted_flat_dict(self) + + def __eq__(self, other): + if other is None: + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not self == other diff --git a/src/oci/apigateway/models/pem_encoded_public_key.py b/src/oci/apigateway/models/pem_encoded_public_key.py new file mode 100644 index 0000000000..7db6c41710 --- /dev/null +++ b/src/oci/apigateway/models/pem_encoded_public_key.py @@ -0,0 +1,87 @@ +# coding: utf-8 +# Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved. +# This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license. + +from .static_public_key import StaticPublicKey +from oci.util import formatted_flat_dict, NONE_SENTINEL, value_allowed_none_or_none_sentinel # noqa: F401 +from oci.decorators import init_model_state_from_kwargs + + +@init_model_state_from_kwargs +class PemEncodedPublicKey(StaticPublicKey): + """ + A PEM-encoded public key used for verifying the JWT signature. + """ + + def __init__(self, **kwargs): + """ + Initializes a new PemEncodedPublicKey object with values from keyword arguments. The default value of the :py:attr:`~oci.apigateway.models.PemEncodedPublicKey.format` attribute + of this class is ``PEM`` and it should not be changed. + The following keyword arguments are supported (corresponding to the getters/setters of this class): + + :param kid: + The value to assign to the kid property of this PemEncodedPublicKey. + :type kid: str + + :param format: + The value to assign to the format property of this PemEncodedPublicKey. + Allowed values for this property are: "JSON_WEB_KEY", "PEM" + :type format: str + + :param key: + The value to assign to the key property of this PemEncodedPublicKey. + :type key: str + + """ + self.swagger_types = { + 'kid': 'str', + 'format': 'str', + 'key': 'str' + } + + self.attribute_map = { + 'kid': 'kid', + 'format': 'format', + 'key': 'key' + } + + self._kid = None + self._format = None + self._key = None + self._format = 'PEM' + + @property + def key(self): + """ + **[Required]** Gets the key of this PemEncodedPublicKey. + The content of the PEM-encoded public key. + + + :return: The key of this PemEncodedPublicKey. + :rtype: str + """ + return self._key + + @key.setter + def key(self, key): + """ + Sets the key of this PemEncodedPublicKey. + The content of the PEM-encoded public key. + + + :param key: The key of this PemEncodedPublicKey. + :type: str + """ + self._key = key + + def __repr__(self): + return formatted_flat_dict(self) + + def __eq__(self, other): + if other is None: + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not self == other diff --git a/src/oci/apigateway/models/public_key_set.py b/src/oci/apigateway/models/public_key_set.py new file mode 100644 index 0000000000..30b15d3271 --- /dev/null +++ b/src/oci/apigateway/models/public_key_set.py @@ -0,0 +1,107 @@ +# coding: utf-8 +# Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved. +# This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license. + + +from oci.util import formatted_flat_dict, NONE_SENTINEL, value_allowed_none_or_none_sentinel # noqa: F401 +from oci.decorators import init_model_state_from_kwargs + + +@init_model_state_from_kwargs +class PublicKeySet(object): + """ + A set of Public Keys that will be used to verify the JWT signature. + """ + + #: A constant which can be used with the type property of a PublicKeySet. + #: This constant has a value of "STATIC_KEYS" + TYPE_STATIC_KEYS = "STATIC_KEYS" + + #: A constant which can be used with the type property of a PublicKeySet. + #: This constant has a value of "REMOTE_JWKS" + TYPE_REMOTE_JWKS = "REMOTE_JWKS" + + def __init__(self, **kwargs): + """ + Initializes a new PublicKeySet object with values from keyword arguments. This class has the following subclasses and if you are using this class as input + to a service operations then you should favor using a subclass over the base class: + + * :class:`~oci.apigateway.models.StaticPublicKeySet` + * :class:`~oci.apigateway.models.RemoteJsonWebKeySet` + + The following keyword arguments are supported (corresponding to the getters/setters of this class): + + :param type: + The value to assign to the type property of this PublicKeySet. + Allowed values for this property are: "STATIC_KEYS", "REMOTE_JWKS", 'UNKNOWN_ENUM_VALUE'. + Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'. + :type type: str + + """ + self.swagger_types = { + 'type': 'str' + } + + self.attribute_map = { + 'type': 'type' + } + + self._type = None + + @staticmethod + def get_subtype(object_dictionary): + """ + Given the hash representation of a subtype of this class, + use the info in the hash to return the class of the subtype. + """ + type = object_dictionary['type'] + + if type == 'STATIC_KEYS': + return 'StaticPublicKeySet' + + if type == 'REMOTE_JWKS': + return 'RemoteJsonWebKeySet' + else: + return 'PublicKeySet' + + @property + def type(self): + """ + **[Required]** Gets the type of this PublicKeySet. + Type of the public key set. + + Allowed values for this property are: "STATIC_KEYS", "REMOTE_JWKS", 'UNKNOWN_ENUM_VALUE'. + Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'. + + + :return: The type of this PublicKeySet. + :rtype: str + """ + return self._type + + @type.setter + def type(self, type): + """ + Sets the type of this PublicKeySet. + Type of the public key set. + + + :param type: The type of this PublicKeySet. + :type: str + """ + allowed_values = ["STATIC_KEYS", "REMOTE_JWKS"] + if not value_allowed_none_or_none_sentinel(type, allowed_values): + type = 'UNKNOWN_ENUM_VALUE' + self._type = type + + def __repr__(self): + return formatted_flat_dict(self) + + def __eq__(self, other): + if other is None: + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not self == other diff --git a/src/oci/apigateway/models/remote_json_web_key_set.py b/src/oci/apigateway/models/remote_json_web_key_set.py new file mode 100644 index 0000000000..bdc83b9b7b --- /dev/null +++ b/src/oci/apigateway/models/remote_json_web_key_set.py @@ -0,0 +1,148 @@ +# coding: utf-8 +# Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved. +# This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license. + +from .public_key_set import PublicKeySet +from oci.util import formatted_flat_dict, NONE_SENTINEL, value_allowed_none_or_none_sentinel # noqa: F401 +from oci.decorators import init_model_state_from_kwargs + + +@init_model_state_from_kwargs +class RemoteJsonWebKeySet(PublicKeySet): + """ + A set of public keys that is retrieved at run-time from a remote location + to verify the JWT signature. The set should only contain JWK-formatted + keys. + """ + + def __init__(self, **kwargs): + """ + Initializes a new RemoteJsonWebKeySet object with values from keyword arguments. The default value of the :py:attr:`~oci.apigateway.models.RemoteJsonWebKeySet.type` attribute + of this class is ``REMOTE_JWKS`` and it should not be changed. + The following keyword arguments are supported (corresponding to the getters/setters of this class): + + :param type: + The value to assign to the type property of this RemoteJsonWebKeySet. + Allowed values for this property are: "STATIC_KEYS", "REMOTE_JWKS" + :type type: str + + :param uri: + The value to assign to the uri property of this RemoteJsonWebKeySet. + :type uri: str + + :param is_ssl_verify_disabled: + The value to assign to the is_ssl_verify_disabled property of this RemoteJsonWebKeySet. + :type is_ssl_verify_disabled: bool + + :param max_cache_duration_in_hours: + The value to assign to the max_cache_duration_in_hours property of this RemoteJsonWebKeySet. + :type max_cache_duration_in_hours: int + + """ + self.swagger_types = { + 'type': 'str', + 'uri': 'str', + 'is_ssl_verify_disabled': 'bool', + 'max_cache_duration_in_hours': 'int' + } + + self.attribute_map = { + 'type': 'type', + 'uri': 'uri', + 'is_ssl_verify_disabled': 'isSslVerifyDisabled', + 'max_cache_duration_in_hours': 'maxCacheDurationInHours' + } + + self._type = None + self._uri = None + self._is_ssl_verify_disabled = None + self._max_cache_duration_in_hours = None + self._type = 'REMOTE_JWKS' + + @property + def uri(self): + """ + **[Required]** Gets the uri of this RemoteJsonWebKeySet. + The uri from which to retrieve the key. It must be accessible + without authentication. + + + :return: The uri of this RemoteJsonWebKeySet. + :rtype: str + """ + return self._uri + + @uri.setter + def uri(self, uri): + """ + Sets the uri of this RemoteJsonWebKeySet. + The uri from which to retrieve the key. It must be accessible + without authentication. + + + :param uri: The uri of this RemoteJsonWebKeySet. + :type: str + """ + self._uri = uri + + @property + def is_ssl_verify_disabled(self): + """ + Gets the is_ssl_verify_disabled of this RemoteJsonWebKeySet. + Defines whether or not to uphold SSL verification. + + + :return: The is_ssl_verify_disabled of this RemoteJsonWebKeySet. + :rtype: bool + """ + return self._is_ssl_verify_disabled + + @is_ssl_verify_disabled.setter + def is_ssl_verify_disabled(self, is_ssl_verify_disabled): + """ + Sets the is_ssl_verify_disabled of this RemoteJsonWebKeySet. + Defines whether or not to uphold SSL verification. + + + :param is_ssl_verify_disabled: The is_ssl_verify_disabled of this RemoteJsonWebKeySet. + :type: bool + """ + self._is_ssl_verify_disabled = is_ssl_verify_disabled + + @property + def max_cache_duration_in_hours(self): + """ + Gets the max_cache_duration_in_hours of this RemoteJsonWebKeySet. + The duration for which the JWKS should be cached before it is + fetched again. + + + :return: The max_cache_duration_in_hours of this RemoteJsonWebKeySet. + :rtype: int + """ + return self._max_cache_duration_in_hours + + @max_cache_duration_in_hours.setter + def max_cache_duration_in_hours(self, max_cache_duration_in_hours): + """ + Sets the max_cache_duration_in_hours of this RemoteJsonWebKeySet. + The duration for which the JWKS should be cached before it is + fetched again. + + + :param max_cache_duration_in_hours: The max_cache_duration_in_hours of this RemoteJsonWebKeySet. + :type: int + """ + self._max_cache_duration_in_hours = max_cache_duration_in_hours + + def __repr__(self): + return formatted_flat_dict(self) + + def __eq__(self, other): + if other is None: + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not self == other diff --git a/src/oci/apigateway/models/static_public_key.py b/src/oci/apigateway/models/static_public_key.py new file mode 100644 index 0000000000..ac583af01b --- /dev/null +++ b/src/oci/apigateway/models/static_public_key.py @@ -0,0 +1,140 @@ +# coding: utf-8 +# Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved. +# This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license. + + +from oci.util import formatted_flat_dict, NONE_SENTINEL, value_allowed_none_or_none_sentinel # noqa: F401 +from oci.decorators import init_model_state_from_kwargs + + +@init_model_state_from_kwargs +class StaticPublicKey(object): + """ + A static public key which is used to verify the JWT signature. + """ + + #: A constant which can be used with the format property of a StaticPublicKey. + #: This constant has a value of "JSON_WEB_KEY" + FORMAT_JSON_WEB_KEY = "JSON_WEB_KEY" + + #: A constant which can be used with the format property of a StaticPublicKey. + #: This constant has a value of "PEM" + FORMAT_PEM = "PEM" + + def __init__(self, **kwargs): + """ + Initializes a new StaticPublicKey object with values from keyword arguments. This class has the following subclasses and if you are using this class as input + to a service operations then you should favor using a subclass over the base class: + + * :class:`~oci.apigateway.models.JsonWebKey` + * :class:`~oci.apigateway.models.PemEncodedPublicKey` + + The following keyword arguments are supported (corresponding to the getters/setters of this class): + + :param kid: + The value to assign to the kid property of this StaticPublicKey. + :type kid: str + + :param format: + The value to assign to the format property of this StaticPublicKey. + Allowed values for this property are: "JSON_WEB_KEY", "PEM", 'UNKNOWN_ENUM_VALUE'. + Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'. + :type format: str + + """ + self.swagger_types = { + 'kid': 'str', + 'format': 'str' + } + + self.attribute_map = { + 'kid': 'kid', + 'format': 'format' + } + + self._kid = None + self._format = None + + @staticmethod + def get_subtype(object_dictionary): + """ + Given the hash representation of a subtype of this class, + use the info in the hash to return the class of the subtype. + """ + type = object_dictionary['format'] + + if type == 'JSON_WEB_KEY': + return 'JsonWebKey' + + if type == 'PEM': + return 'PemEncodedPublicKey' + else: + return 'StaticPublicKey' + + @property + def kid(self): + """ + **[Required]** Gets the kid of this StaticPublicKey. + A unique key ID. This key will be used to verify the signature of a + JWT with matching \"kid\". + + + :return: The kid of this StaticPublicKey. + :rtype: str + """ + return self._kid + + @kid.setter + def kid(self, kid): + """ + Sets the kid of this StaticPublicKey. + A unique key ID. This key will be used to verify the signature of a + JWT with matching \"kid\". + + + :param kid: The kid of this StaticPublicKey. + :type: str + """ + self._kid = kid + + @property + def format(self): + """ + **[Required]** Gets the format of this StaticPublicKey. + The format of the public key. + + Allowed values for this property are: "JSON_WEB_KEY", "PEM", 'UNKNOWN_ENUM_VALUE'. + Any unrecognized values returned by a service will be mapped to 'UNKNOWN_ENUM_VALUE'. + + + :return: The format of this StaticPublicKey. + :rtype: str + """ + return self._format + + @format.setter + def format(self, format): + """ + Sets the format of this StaticPublicKey. + The format of the public key. + + + :param format: The format of this StaticPublicKey. + :type: str + """ + allowed_values = ["JSON_WEB_KEY", "PEM"] + if not value_allowed_none_or_none_sentinel(format, allowed_values): + format = 'UNKNOWN_ENUM_VALUE' + self._format = format + + def __repr__(self): + return formatted_flat_dict(self) + + def __eq__(self, other): + if other is None: + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not self == other diff --git a/src/oci/apigateway/models/static_public_key_set.py b/src/oci/apigateway/models/static_public_key_set.py new file mode 100644 index 0000000000..338643c252 --- /dev/null +++ b/src/oci/apigateway/models/static_public_key_set.py @@ -0,0 +1,80 @@ +# coding: utf-8 +# Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved. +# This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license. + +from .public_key_set import PublicKeySet +from oci.util import formatted_flat_dict, NONE_SENTINEL, value_allowed_none_or_none_sentinel # noqa: F401 +from oci.decorators import init_model_state_from_kwargs + + +@init_model_state_from_kwargs +class StaticPublicKeySet(PublicKeySet): + """ + A set of static public keys that will be used to verify the JWT signature. + """ + + def __init__(self, **kwargs): + """ + Initializes a new StaticPublicKeySet object with values from keyword arguments. The default value of the :py:attr:`~oci.apigateway.models.StaticPublicKeySet.type` attribute + of this class is ``STATIC_KEYS`` and it should not be changed. + The following keyword arguments are supported (corresponding to the getters/setters of this class): + + :param type: + The value to assign to the type property of this StaticPublicKeySet. + Allowed values for this property are: "STATIC_KEYS", "REMOTE_JWKS" + :type type: str + + :param keys: + The value to assign to the keys property of this StaticPublicKeySet. + :type keys: list[StaticPublicKey] + + """ + self.swagger_types = { + 'type': 'str', + 'keys': 'list[StaticPublicKey]' + } + + self.attribute_map = { + 'type': 'type', + 'keys': 'keys' + } + + self._type = None + self._keys = None + self._type = 'STATIC_KEYS' + + @property + def keys(self): + """ + Gets the keys of this StaticPublicKeySet. + The set of static public keys. + + + :return: The keys of this StaticPublicKeySet. + :rtype: list[StaticPublicKey] + """ + return self._keys + + @keys.setter + def keys(self, keys): + """ + Sets the keys of this StaticPublicKeySet. + The set of static public keys. + + + :param keys: The keys of this StaticPublicKeySet. + :type: list[StaticPublicKey] + """ + self._keys = keys + + def __repr__(self): + return formatted_flat_dict(self) + + def __eq__(self, other): + if other is None: + return False + + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not self == other diff --git a/src/oci/database/models/autonomous_database.py b/src/oci/database/models/autonomous_database.py index 90350a7e08..db305fb5f5 100644 --- a/src/oci/database/models/autonomous_database.py +++ b/src/oci/database/models/autonomous_database.py @@ -230,6 +230,10 @@ def __init__(self, **kwargs): The value to assign to the private_endpoint_label property of this AutonomousDatabase. :type private_endpoint_label: str + :param private_endpoint_ip: + The value to assign to the private_endpoint_ip property of this AutonomousDatabase. + :type private_endpoint_ip: str + :param db_version: The value to assign to the db_version property of this AutonomousDatabase. :type db_version: str @@ -298,6 +302,7 @@ def __init__(self, **kwargs): 'nsg_ids': 'list[str]', 'private_endpoint': 'str', 'private_endpoint_label': 'str', + 'private_endpoint_ip': 'str', 'db_version': 'str', 'is_preview': 'bool', 'db_workload': 'str', @@ -336,6 +341,7 @@ def __init__(self, **kwargs): 'nsg_ids': 'nsgIds', 'private_endpoint': 'privateEndpoint', 'private_endpoint_label': 'privateEndpointLabel', + 'private_endpoint_ip': 'privateEndpointIp', 'db_version': 'dbVersion', 'is_preview': 'isPreview', 'db_workload': 'dbWorkload', @@ -373,6 +379,7 @@ def __init__(self, **kwargs): self._nsg_ids = None self._private_endpoint = None self._private_endpoint_label = None + self._private_endpoint_ip = None self._db_version = None self._is_preview = None self._db_workload = None @@ -1093,6 +1100,30 @@ def private_endpoint_label(self, private_endpoint_label): """ self._private_endpoint_label = private_endpoint_label + @property + def private_endpoint_ip(self): + """ + Gets the private_endpoint_ip of this AutonomousDatabase. + The private endpoint Ip address for the resource. + + + :return: The private_endpoint_ip of this AutonomousDatabase. + :rtype: str + """ + return self._private_endpoint_ip + + @private_endpoint_ip.setter + def private_endpoint_ip(self, private_endpoint_ip): + """ + Sets the private_endpoint_ip of this AutonomousDatabase. + The private endpoint Ip address for the resource. + + + :param private_endpoint_ip: The private_endpoint_ip of this AutonomousDatabase. + :type: str + """ + self._private_endpoint_ip = private_endpoint_ip + @property def db_version(self): """ diff --git a/src/oci/database/models/autonomous_database_summary.py b/src/oci/database/models/autonomous_database_summary.py index ff5ebfe98f..01ad43aebc 100644 --- a/src/oci/database/models/autonomous_database_summary.py +++ b/src/oci/database/models/autonomous_database_summary.py @@ -232,6 +232,10 @@ def __init__(self, **kwargs): The value to assign to the private_endpoint_label property of this AutonomousDatabaseSummary. :type private_endpoint_label: str + :param private_endpoint_ip: + The value to assign to the private_endpoint_ip property of this AutonomousDatabaseSummary. + :type private_endpoint_ip: str + :param db_version: The value to assign to the db_version property of this AutonomousDatabaseSummary. :type db_version: str @@ -300,6 +304,7 @@ def __init__(self, **kwargs): 'nsg_ids': 'list[str]', 'private_endpoint': 'str', 'private_endpoint_label': 'str', + 'private_endpoint_ip': 'str', 'db_version': 'str', 'is_preview': 'bool', 'db_workload': 'str', @@ -338,6 +343,7 @@ def __init__(self, **kwargs): 'nsg_ids': 'nsgIds', 'private_endpoint': 'privateEndpoint', 'private_endpoint_label': 'privateEndpointLabel', + 'private_endpoint_ip': 'privateEndpointIp', 'db_version': 'dbVersion', 'is_preview': 'isPreview', 'db_workload': 'dbWorkload', @@ -375,6 +381,7 @@ def __init__(self, **kwargs): self._nsg_ids = None self._private_endpoint = None self._private_endpoint_label = None + self._private_endpoint_ip = None self._db_version = None self._is_preview = None self._db_workload = None @@ -1095,6 +1102,30 @@ def private_endpoint_label(self, private_endpoint_label): """ self._private_endpoint_label = private_endpoint_label + @property + def private_endpoint_ip(self): + """ + Gets the private_endpoint_ip of this AutonomousDatabaseSummary. + The private endpoint Ip address for the resource. + + + :return: The private_endpoint_ip of this AutonomousDatabaseSummary. + :rtype: str + """ + return self._private_endpoint_ip + + @private_endpoint_ip.setter + def private_endpoint_ip(self, private_endpoint_ip): + """ + Sets the private_endpoint_ip of this AutonomousDatabaseSummary. + The private endpoint Ip address for the resource. + + + :param private_endpoint_ip: The private_endpoint_ip of this AutonomousDatabaseSummary. + :type: str + """ + self._private_endpoint_ip = private_endpoint_ip + @property def db_version(self): """ diff --git a/src/oci/regions.py b/src/oci/regions.py index 700128ae4e..7dbd93b347 100644 --- a/src/oci/regions.py +++ b/src/oci/regions.py @@ -6,9 +6,14 @@ import os import json import logging +from enum import Enum from . import service_endpoints from oci._vendor import six +from oci._vendor import requests +from oci._vendor.requests.exceptions import HTTPError, ConnectionError, RetryError +from oci._vendor.requests.adapters import HTTPAdapter +from oci._vendor.urllib3.util.retry import Retry REGIONS_SHORT_NAMES = { 'phx': 'us-phoenix-1', @@ -101,11 +106,30 @@ REGION_KEY_PROPERTY_NAME = "regionKey" REGION_IDENTIFIER_PROPERTY_NAME = "regionIdentifier" +# Region Metadata schema REGION_METADATA_KEYS = (REALM_KEY_PROPERTY_NAME, REALM_DOMAIN_COMPONENT_PROPERTY_NAME, REGION_KEY_PROPERTY_NAME, REGION_IDENTIFIER_PROPERTY_NAME) +# Constants for getting region info from IMDS +METADATA_URL_BASE = 'http://169.254.169.254/opc/v2' +GET_REGION_URL = '{}/instance/regionInfo'.format(METADATA_URL_BASE) +METADATA_AUTH_HEADERS = {'Authorization': 'Bearer Oracle'} + +# Constants for regions config file +REGIONS_CONFIG_FILE_PATH = os.path.join('~', '.oci', 'regions-config.json') + +# Enumerate region information sources outside of lookups +ExternalSources = Enum('ExternalSources', ['REGIONS_CFG_FILE', 'ENV_VAR', 'IMDS']) + +# Dict to track if we have read the ExternalSources +_has_been_read_external_sources = { + ExternalSources.REGIONS_CFG_FILE: False, + ExternalSources.ENV_VAR: False, + ExternalSources.IMDS: False +} + logger = logging.getLogger(__name__) @@ -139,7 +163,7 @@ def is_region_short_name(region): def get_region_from_short_name(region): region = region.lower() if not is_region_short_name(region): - logger.info("Could not find region information in lookups and any other sources") + logger.debug("Could not find region information in lookups and any other sources") # Return the input string to allow fallback to OC1 return region # Return region from lookup @@ -152,7 +176,7 @@ def get_realm_from_region(region): # get_region_from_short_name also adds metadata from other sources region = get_region_from_short_name(region) if not is_region(region): - logger.info("Cannot find region information in lookups and other sources, defaulting to OC1 realm") + logger.debug("Cannot find region information in lookups and other sources, defaulting to OC1 realm") return "oc1" else: return REGION_REALMS[region] @@ -176,6 +200,14 @@ def endpoint_for(service, region=None, endpoint=None, service_endpoint_template= "regionIdentifier" : string } + For example, for the Sydney OC1 region, the schema would be filled out as follows: + { + "realmKey" : "OC1", + "realmDomainComponent" : "oraclecloud.com", + "regionKey" : "SYD", + "regionIdentifier" : "ap-sydney-1" + } + If the region still cannot be resolved, we fall back to OC1 realm """ if not (endpoint or region): @@ -192,23 +224,82 @@ def endpoint_for(service, region=None, endpoint=None, service_endpoint_template= return _endpoint_for(service, region, service_endpoint_template) +def skip_instance_metadata_service(): + _set_source_has_been_read(ExternalSources.IMDS) + + +def _set_source_has_been_read(source): + _has_been_read_external_sources[source] = True + + +def _get_source_has_been_read(source): + return _has_been_read_external_sources[source] + + def _check_and_add_region_metadata(region): - region = region.lower() # Follow the hierarchy of sources if _set_region_metadata_from_cfg_file(region): + logger.debug("Added metadata information for {} region from regions config file".format(region)) return True elif _set_region_metadata_from_env_var(region): + logger.debug("Added metadata information for {} region from environment variable".format(region)) return True elif _set_region_from_instance_metadata_service(region): + logger.debug("Added metadata information for {} region from IMDS".format(region)) return True + logger.debug("Unknown regionId '{}', will assume it's in Realm OC1".format(region)) return False def _set_region_metadata_from_cfg_file(region): + # Check if region information from regions cfg file has already been read + if _get_source_has_been_read(ExternalSources.REGIONS_CFG_FILE): + # Return False to allow fallback + return False + + # Set source as read + _set_source_has_been_read(ExternalSources.REGIONS_CFG_FILE) + + expanded_file_location = os.path.expanduser(REGIONS_CONFIG_FILE_PATH) + if os.path.isfile(expanded_file_location): + logger.debug("Regions configuration file found") + try: + with open(expanded_file_location, 'r') as regions_config_file: + regions_metadata_raw = regions_config_file.read() + except (OSError, IOError) as e: + logger.debug("Reading regions configuration file failed because of error: {}".format(e)) + return False + + # Try importing JSONDecodeError for Python 2 and Python 3 compatibility + try: + from json.decoder import JSONDecodeError + except ImportError: + JSONDecodeError = ValueError + try: + regions_metadata_array = json.loads(regions_metadata_raw) + except JSONDecodeError as e: + # Unable to parse the json array + logger.debug("Decoding JSON array from regions configuration file failed because of error: {}".format(e)) + return False + + added = False + for region_metadata in regions_metadata_array: + if _check_valid_schema(region_metadata): + if _add_region_information_to_lookup(region_metadata, region): + added = True + return added return False def _set_region_metadata_from_env_var(region): + # Check if region information from env var has already been read + if _get_source_has_been_read(ExternalSources.ENV_VAR): + # Return False to allow fallback + return False + + # Set source as read + _set_source_has_been_read(ExternalSources.ENV_VAR) + if os.environ.get(OCI_REGION_METADATA_ENV_VAR_NAME): # Try importing JSONDecodeError for Python 2 and Python 3 compatibility try: @@ -219,17 +310,60 @@ def _set_region_metadata_from_env_var(region): region_metadata = json.loads(os.environ.get(OCI_REGION_METADATA_ENV_VAR_NAME)) except JSONDecodeError as e: # Unable to parse the env variable - logger.debug("Decoding JSON failed because of error: {}".format(e)) + logger.debug("Decoding JSON from environment variable failed because of error: {}".format(e)) return False if _check_valid_schema(region_metadata): - region_metadata = {k: v.lower() for k, v in six.iteritems(region_metadata)} return _add_region_information_to_lookup(region_metadata, region) return False def _set_region_from_instance_metadata_service(region): + # Check if region information from IMDS has already been read + if _get_source_has_been_read(ExternalSources.IMDS): + # Return False to allow fallback + return False + + # Set source as read + _set_source_has_been_read(ExternalSources.IMDS) + + try: + + retry_strategy = Retry( + total=3, + status_forcelist=[429, 500, 502, 503, 504], + read=0, + connect=3, + status=3 + ) + s = requests.Session() + s.mount(GET_REGION_URL, HTTPAdapter(max_retries=retry_strategy)) + response = s.get(GET_REGION_URL, timeout=(10, 60), headers=METADATA_AUTH_HEADERS) + region_metadata_raw = response.text + logger.debug("Region metadata blob from IMDS is: {}".format(region_metadata_raw)) + except (HTTPError, ConnectionError, RetryError) as e: + logger.debug("Failed to call IMDS service because of error: {}".format(e)) + return False + + if response.status_code != 200: + logger.debug("HTTP Get Failed: URL: {}, Status: {}, Message: {}".format(GET_REGION_URL, response.status_code, response.text)) + return False + + try: + from json.decoder import JSONDecodeError + except ImportError: + JSONDecodeError = ValueError + try: + region_metadata = json.loads(region_metadata_raw) + except JSONDecodeError as e: + # Unable to parse the raw response + logger.debug("Decoding JSON from IMDS service because of error: {}".format(e)) + return False + + if _check_valid_schema(region_metadata): + return _add_region_information_to_lookup(region_metadata, region) + return False @@ -247,6 +381,7 @@ def _check_valid_schema(region_metadata): def _add_region_information_to_lookup(region_metadata, region): # Check if the region metadata has information about the requested region # Add the region information from region_metadata to the existing lookups + region_metadata = {k: v.lower() for k, v in six.iteritems(region_metadata)} if region_metadata[REGION_KEY_PROPERTY_NAME] not in REGIONS_SHORT_NAMES: REGIONS_SHORT_NAMES[region_metadata[REGION_KEY_PROPERTY_NAME]] = region_metadata[REGION_IDENTIFIER_PROPERTY_NAME] diff --git a/src/oci/version.py b/src/oci/version.py index a691862644..eedb55d60c 100644 --- a/src/oci/version.py +++ b/src/oci/version.py @@ -2,4 +2,4 @@ # Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved. # This software is dual-licensed to you under the Universal Permissive License (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl or Apache License 2.0 as shown at http://www.apache.org/licenses/LICENSE-2.0. You may choose either license. -__version__ = "2.14.2" +__version__ = "2.14.3"