Skip to content

Commit 639956e

Browse files
authored
Merge pull request oracle-samples#450 from harsh97/main
Updating AQUA stack
2 parents 56017f4 + ee30107 commit 639956e

File tree

12 files changed

+389
-4
lines changed

12 files changed

+389
-4
lines changed

.github/workflows/stack.yml

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# Copyright (c) 2022 Oracle and/or its affiliates. All rights reserved.
2+
# Licensed under the Universal Permissive License v 1.0 as shown at http://oss.oracle.com/licenses/upl.
3+
#
4+
5+
# Creates and Publishes the Oracle Resource Manager stack - v0.0.5
6+
7+
name: Generate stacks and publish release
8+
9+
on:
10+
push:
11+
branches: [ main ]
12+
paths: ['VERSION']
13+
14+
jobs:
15+
16+
publish_stack:
17+
runs-on: ubuntu-latest
18+
steps:
19+
- name: Checkout
20+
uses: actions/checkout@v3
21+
22+
- name: Create stacks
23+
id: create_stacks
24+
run: |
25+
26+
STACKNAME=oci-ods-aqua
27+
STACK_FILES="ai-quick-actions/policies/terraform/*"
28+
RELEASE=$(cat VERSION)
29+
ASSETS+="${STACKNAME}.zip"
30+
echo "::group::Processing $STACKNAME"
31+
zip -r ${STACKNAME}-stack.zip $STACK_FILES || { printf '\n⛔ Unable to create %s stack.\n'; exit 1; }
32+
cp ${STACKNAME}-stack.zip ${STACKNAME}.zip || { printf '\n⛔ Unable to create %s stack.\n'; exit 1; }
33+
echo "::endgroup::"
34+
echo "::set-output name=assets::$ASSETS"
35+
echo "::set-output name=release::$RELEASE"
36+
echo "::set-output name=prefix::$STACKNAME"
37+
38+
- name: Prepare Release Notes
39+
run: |
40+
#
41+
printf '%s\n' '${{ steps.create_stacks.outputs.prefix }} Stack - v${{ steps.create_stacks.outputs.release }}' >release.md
42+
printf '%s\n' '' '## [![Deploy to Oracle Cloud][magic_button]][magic_stack]' >>release.md
43+
printf '%s\n' '' '' >>release.md
44+
printf '%s\n' '' '[magic_button]: https://oci-resourcemanager-plugin.plugins.oci.oraclecloud.com/latest/deploy-to-oracle-cloud.svg' >>release.md
45+
printf '%s\n' '' '[magic_stack]: https://cloud.oracle.com/resourcemanager/stacks/create?zipUrl=https://github.com/${{ github.repository }}/releases/download/${{ steps.create_stacks.outputs.release }}/${{ steps.create_stacks.outputs.prefix }}.zip' >>release.md
46+
47+
- name: Create Release
48+
run: gh release create ${{ steps.create_stacks.outputs.release }} --generate-notes -F release.md ${{ steps.create_stacks.outputs.assets }}
49+
env:
50+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

VERSION

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1.0

ai-quick-actions/policies/README.md

+9-4
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,15 @@ allow group <your_admin_group> to manage policies in TENANCY
2828
allow group <your_admin_group> to read compartments in TENANCY
2929
```
3030

31-
Download terraform configuration file [oci-ods-aqua-orm.zip](./oci-ods-aqua-orm.zip) with the infrastructure instructions for the dynamic groups and polices. For steps on creating stacks, see [Creating a Stack from a Zip File](https://docs.oracle.com/en-us/iaas/Content/ResourceManager/Tasks/create-stack-local.htm#top).
31+
Click to deploy the stack [![Deploy to Oracle Cloud][magic_button]][magic_stack]
3232

33-
![Setup 1](../web_assets/policies1.png)
3433

35-
![Setup 2](../web_assets/policies2.png)
34+
After clicking the button, you will be redirected to the Oracle Cloud Infrastructure Console. You will need to sign in if you are not already signed in. You can select the kind of policies that need to be deployed for AQUA:
35+
1. All policies - This will deploy all the policies needed for AQUA in one go.
36+
2. Only admin policies - This will deploy only the minimal set of policies that are required to be defined at the root compartment by the tenancy administrator for AQUA.
37+
3. Only resource policies - This will deploy the required policies that are required to be defined at the compartment level provided that the tenancy administrator has already defined the admin policies for AQUA.
38+
39+
![Setup 1](../web_assets/policies1.png)
3640

3741
> **Note:** To save fine-tuned models, versioning has to be enabled in the selected Object Storage bucket. See [here](https://docs.oracle.com/iaas/data-science/using/ai-quick-actions-fine-tuning.htm) for more information.
3842
@@ -115,7 +119,8 @@ These policies and dynamic groups set up the necessary permissions to enable AI
115119
> **Note:** To save fine-tuned models, versioning has to be enabled in the selected Object Storage bucket. See [here](https://docs.oracle.com/iaas/data-science/using/ai-quick-actions-fine-tuning.htm) for more information.
116120
117121
![Setup 3](../web_assets/policies3.png)
118-
122+
- [magic_button]: https://oci-resourcemanager-plugin.plugins.oci.oraclecloud.com/latest/deploy-to-oracle-cloud.svg
123+
- [magic_stack]: https://cloud.oracle.com/resourcemanager/stacks/create?zipUrl=https://github.com/oracle-samples/oci-data-science-ai-samples/releases/latest/download/oci-ods-aqua.zip
119124
- [Home](../README.md)
120125
- [CLI](../cli-tips.md)
121126
- [Model Deployment](../model-deployment-tips.md)
-2.21 KB
Binary file not shown.
+117
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
resource "oci_identity_dynamic_group" "aqua-dynamic-group" {
2+
count = local.is_admin_policies_only ? 0 : 1
3+
compartment_id = var.tenancy_ocid
4+
description = "Data Science Aqua Dynamic Group"
5+
name = var.aqua_dg_name
6+
matching_rule = local.is_resource_policy_required? local.aqua_dg_match: local.aqua_admin_only_dg_match
7+
}
8+
9+
resource "oci_identity_dynamic_group" "distributed_training_job_runs" {
10+
count = local.is_resource_policy_required ? 1 : 0
11+
compartment_id = var.tenancy_ocid
12+
description = "Data Science Distributed Training Job Runs Group"
13+
name = var.distributed_training_dg_name
14+
matching_rule = "any {all {resource.type='datasciencejobrun',resource.compartment.id='${var.compartment_ocid}'}}"
15+
}
16+
17+
18+
locals {
19+
is_admin_policies_only = var.deployment_type == "Only admin policies"
20+
is_resource_policy_only = var.deployment_type == "Only resource policies"
21+
is_all_policies = var.deployment_type == "All policies"
22+
is_resource_policy_required = var.deployment_type != "Only admin policies"
23+
// Aqua dg matching rules
24+
aqua_admin_only_dg_match = "all {resource.type='datasciencenotebooksession'}"
25+
aqua_dg_match = "any {all {resource.type='datasciencenotebooksession',resource.compartment.id='${var.compartment_ocid}'}, all {resource.type='datasciencemodeldeployment',resource.compartment.id='${var.compartment_ocid}'}, all {resource.type='datasciencejobrun',resource.compartment.id='${var.compartment_ocid}'}}"
26+
is_compartment_tenancy = length(regexall(".*tenancy.*", var.compartment_ocid)) > 0
27+
compartment_policy_string = local.is_compartment_tenancy ? "tenancy" : "compartment id ${var.compartment_ocid}"
28+
policy_tenancy = local.is_resource_policy_only? var.compartment_ocid : var.tenancy_ocid
29+
// Contains only necessary admin policies. These policies will be created in the tenancy. When the user selects "Only admin policies" these policies will be created.
30+
aqua_admin_only_policies = local.is_admin_policies_only?[
31+
"Define tenancy datascience as ocid1.tenancy.oc1..aaaaaaaax5hdic7ya6r5rxsgpifff4l6xdxzltnrncdzp3m75ubbvzqqzn3q",
32+
"Endorse any-user to read data-science-models in tenancy datascience where ALL {target.compartment.name='service-managed-models'}",
33+
"Endorse any-user to inspect data-science-models in tenancy datascience where ALL {target.compartment.name='service-managed-models'}",
34+
"Endorse any-user to read object in tenancy datascience where ALL {target.compartment.name='service-managed-models', target.bucket.name='service-managed-models'}",
35+
]:[]
36+
37+
tenancy_map = ({
38+
oc1: "ocid1.tenancy.oc1..aaaaaaaax5hdic7ya6r5rxsgpifff4l6xdxzltnrncdzp3m75ubbvzqqzn3q"
39+
oc8: "ocid1.tenancy.oc8..aaaaaaaa2nxkxxix6ngdcifswvrezlmuylejvse4x6oa2ub4wfaduyz547wa"
40+
})
41+
user_realm = element(split(".", var.tenancy_ocid), 2)
42+
service_tenancy_ocid = lookup(local.tenancy_map, local.user_realm, "UNKNOWN")
43+
44+
// These are encompassing policies that will be created in the tenancy. When the user selects "All policies" these policies will be created.
45+
aqua_all_policies = local.is_all_policies? [
46+
"Define tenancy datascience as ${local.service_tenancy_ocid}",
47+
"Endorse any-user to read data-science-models in tenancy datascience where ALL {target.compartment.name='service-managed-models'}",
48+
"Endorse any-user to inspect data-science-models in tenancy datascience where ALL {target.compartment.name='service-managed-models'}",
49+
"Endorse any-user to read object in tenancy datascience where ALL {target.compartment.name='service-managed-models', target.bucket.name='service-managed-models'}",
50+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to manage data-science-model-deployments in ${local.compartment_policy_string}",
51+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to manage data-science-models in ${local.compartment_policy_string}",
52+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to use logging-family in ${local.compartment_policy_string}",
53+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to manage data-science-jobs in ${local.compartment_policy_string}",
54+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to manage data-science-job-runs in ${local.compartment_policy_string}",
55+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to use virtual-network-family in ${local.compartment_policy_string}",
56+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to read resource-availability in ${local.compartment_policy_string}",
57+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to manage data-science-projects in ${local.compartment_policy_string}",
58+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to manage data-science-notebook-sessions in ${local.compartment_policy_string}",
59+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to manage data-science-modelversionsets in ${local.compartment_policy_string}",
60+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to read buckets in ${local.compartment_policy_string}",
61+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to read objectstorage-namespaces in ${local.compartment_policy_string}",
62+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to inspect compartments in tenancy"
63+
]:[]
64+
65+
// Aqua resource only policies. These policies will be created in a specific compartment. When the user selects "Only resource policies" these policies will be created.
66+
aqua_resource_only_policies = local.is_resource_policy_only? [
67+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to manage data-science-model-deployments in ${local.compartment_policy_string}",
68+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to manage data-science-models in ${local.compartment_policy_string}",
69+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to use logging-family in ${local.compartment_policy_string}",
70+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to manage data-science-jobs in ${local.compartment_policy_string}",
71+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to manage data-science-job-runs in ${local.compartment_policy_string}",
72+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to use virtual-network-family in ${local.compartment_policy_string}",
73+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to read resource-availability in ${local.compartment_policy_string}",
74+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to manage data-science-projects in ${local.compartment_policy_string}",
75+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to manage data-science-notebook-sessions in ${local.compartment_policy_string}",
76+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to manage data-science-modelversionsets in ${local.compartment_policy_string}",
77+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to read buckets in ${local.compartment_policy_string}",
78+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to read objectstorage-namespaces in ${local.compartment_policy_string}",
79+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to inspect compartments in ${local.compartment_policy_string}"
80+
]:[]
81+
82+
policies_to_use = local.is_admin_policies_only ? local.aqua_admin_only_policies : local.is_resource_policy_only ? local.aqua_resource_only_policies : local.aqua_all_policies
83+
84+
all_buckets = concat(var.user_model_buckets, var.user_data_buckets)
85+
bucket_names = join(", ", formatlist("target.bucket.name='%s'", local.all_buckets))
86+
bucket_names_oss = join(", ", formatlist("all{target.bucket.name='%s', any {request.permission='OBJECT_CREATE', request.permission='OBJECT_INSPECT'}}", local.all_buckets))
87+
dt_jr_policies = local.is_resource_policy_required?[
88+
"Allow dynamic-group id ${oci_identity_dynamic_group.distributed_training_job_runs[0].id} to use logging-family in ${local.compartment_policy_string}",
89+
"Allow dynamic-group id ${oci_identity_dynamic_group.distributed_training_job_runs[0].id} to manage data-science-models in ${local.compartment_policy_string}",
90+
"Allow dynamic-group id ${oci_identity_dynamic_group.distributed_training_job_runs[0].id} to read data-science-jobs in ${local.compartment_policy_string}"
91+
]: []
92+
dt_jr_policies_target_buckets = local.is_resource_policy_required? [
93+
"Allow dynamic-group id ${oci_identity_dynamic_group.distributed_training_job_runs[0].id} to manage objects in ${local.compartment_policy_string} where any {${local.bucket_names}}",
94+
"Allow dynamic-group id ${oci_identity_dynamic_group.distributed_training_job_runs[0].id} to read buckets in ${local.compartment_policy_string} where any {${local.bucket_names}}"
95+
]: []
96+
aqua_policies_target_buckets = local.is_resource_policy_required?[
97+
"Allow dynamic-group id ${oci_identity_dynamic_group.aqua-dynamic-group[0].id} to manage object-family in ${local.compartment_policy_string} where any {${local.bucket_names_oss}}"
98+
]:[]
99+
100+
}
101+
102+
resource "oci_identity_policy" "aqua-policy" {
103+
compartment_id = local.policy_tenancy
104+
description = "Data Science Aqua Policies"
105+
name = var.aqua_policy_name
106+
statements = length(local.bucket_names) > 0 ? concat(local.policies_to_use, local.aqua_policies_target_buckets): local.policies_to_use
107+
}
108+
109+
resource "oci_identity_policy" "distributed_training_job_runs_policy" {
110+
count = local.is_resource_policy_required ? 1 : 0
111+
compartment_id = local.policy_tenancy
112+
description = "Distributed Training Job Runs Policies"
113+
name = var.distributed_training_policy_name
114+
statements = length(local.bucket_names) > 0 ? concat(local.dt_jr_policies, local.dt_jr_policies_target_buckets) : local.dt_jr_policies
115+
}
116+
117+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
output "deployment_type" {
2+
value = var.deployment_type
3+
}
4+
5+
output "aqua_info" {
6+
value = "https://docs.oracle.com/en-us/iaas/data-science/using/ai-quick-actions.htm"
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
2+
terraform {
3+
required_version = ">= 1.0"
4+
}
5+
6+
provider "oci" {
7+
region = var.region
8+
tenancy_ocid = var.tenancy_ocid
9+
# auth = "SecurityToken"
10+
# config_file_profile = "DEFAULT"
11+
}
12+

ai-quick-actions/policies/terraform/schema.yaml

+146
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#*************************************
2+
# IAM Specific
3+
#*************************************
4+
variable "aqua_policy_name" {
5+
default = "DataScienceAquaPolicies"
6+
}
7+
8+
variable "aqua_dg_name" {
9+
default = "DataScienceAquaDynamicGroup"
10+
}
11+
12+
variable "distributed_training_dg_name" {
13+
default = "DistributedTrainingJobRunsDynamicGroup"
14+
}
15+
16+
variable "distributed_training_policy_name" {
17+
default = "DistributedTrainingJobRunsPolicies"
18+
}
19+
20+
#*************************************
21+
# TF Requirements
22+
#*************************************
23+
variable "tenancy_ocid" {
24+
}
25+
variable "region" {
26+
}
27+
variable "compartment_ocid" {
28+
}
29+
variable "user_model_buckets" {
30+
default = []
31+
type = list(string)
32+
description = "List buckets for storing fine tuning models and evaluation. Important: To save fine-tuned models, versioning has to be enabled in the selected Object Storage bucket."
33+
}
34+
variable "user_data_buckets" {
35+
default = []
36+
type = list(string)
37+
description = "List buckets for storing dataset used for fine tuning and evaluation."
38+
}
39+
40+
variable "deployment_type" {
41+
type = string
42+
description = "Type of deployment"
43+
validation {
44+
condition = contains(["All policies", "Only admin policies", "Only resource policies"], var.deployment_type)
45+
error_message = "The deployment_type must be one of: 'All policies', 'Only admin policies', 'Only resource policies'."
46+
}
47+
}
-109 KB
Loading
-185 KB
Binary file not shown.
-33.1 KB
Loading

0 commit comments

Comments
 (0)