You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
6.1 KiB
136 lines
6.1 KiB
# -*- coding: utf-8 -*-
|
|
###############################################################################
|
|
#
|
|
# Cybrosys Technologies Pvt. Ltd.
|
|
#
|
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
|
|
# Author: Shafna K(odoo@cybrosys.com)
|
|
#
|
|
# You can modify it under the terms of the GNU AFFERO
|
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
|
|
#
|
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
|
|
# (AGPL v3) along with this program.
|
|
# If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
###############################################################################
|
|
import boto3
|
|
import re
|
|
from odoo import fields, models
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class AmazonBucket(models.Model):
|
|
"""Class to create an Amazon S3 bucket"""
|
|
_name = "amazon.bucket"
|
|
_description = "Amazon Bucket"
|
|
_rec_name = "bucket_name"
|
|
|
|
bucket_name = fields.Char(string="Bucket Name", required=True,
|
|
help="""Provide the bucket name.
|
|
Eg:
|
|
- docexamplebucket1
|
|
- log-delivery-march-2020
|
|
- my-hosted-content""")
|
|
state = fields.Selection([
|
|
('create_bucket', 'Create Bucket'),
|
|
('push_to_bucket', 'Push To bucket'),
|
|
('pushed', 'Pushed')
|
|
], help="States of bucket creation.", string="State",
|
|
default='create_bucket')
|
|
file_path = fields.Char(string="File Path",
|
|
help="Provide the file path of your data.")
|
|
s3_uri = fields.Char(string="S3 URI", help="After pushing the data to s3 "
|
|
"Bucket, URI will be computed.")
|
|
|
|
def _validate_bucket_name(self, bucket_name):
|
|
if len(bucket_name) < 3 or len(bucket_name) > 63:
|
|
raise ValueError("Bucket name must be between 3 and 63 characters"
|
|
" long")
|
|
if not re.match("^[a-z0-9.-]+$", bucket_name):
|
|
raise ValueError("Bucket name can consist only of lowercase "
|
|
"letters, numbers, dots, and hyphens")
|
|
if not bucket_name[0].isalnum() or not bucket_name[-1].isalnum():
|
|
raise ValueError("Bucket name must begin and end with a letter or"
|
|
" number")
|
|
if ".." in bucket_name:
|
|
raise ValueError("Bucket name must not contain two adjacent "
|
|
"periods")
|
|
if re.match(r"^\d+\.\d+\.\d+\.\d+$", bucket_name):
|
|
raise ValueError("Bucket name must not be formatted as an "
|
|
"IP address")
|
|
reserved_prefixes = ['xn--', 'sthree-', 'sthree-configurator-']
|
|
reserved_suffixes = ['-s3alias', '--ol-s3']
|
|
for prefix in reserved_prefixes:
|
|
if bucket_name.startswith(prefix):
|
|
raise ValueError("Bucket name must not start with the "
|
|
"prefix '{prefix}'")
|
|
for suffix in reserved_suffixes:
|
|
if bucket_name.endswith(suffix):
|
|
raise ValueError("Bucket name must not end with the"
|
|
" suffix '{suffix}'")
|
|
if '.' in bucket_name:
|
|
raise ValueError("Buckets used with Transfer Acceleration can't "
|
|
"have dots (.) in their names")
|
|
|
|
def action_s3bucket(self):
|
|
"""Function to create an S3 bucket in Amazon"""
|
|
file = self.env['amazon.fetch.data'].get_file_path()
|
|
values = self.env['amazon.dataset'].forecast_values()
|
|
amazon_forecast = values['amazon_forecast']
|
|
if amazon_forecast:
|
|
amazon_access_key = values['amazon_access_key']
|
|
amazon_secret_access_key = values['amazon_secret_access_key']
|
|
amazon_region = values['amazon_region']
|
|
session = boto3.Session(
|
|
aws_access_key_id=amazon_access_key,
|
|
aws_secret_access_key=amazon_secret_access_key,
|
|
region_name=amazon_region
|
|
)
|
|
s3_client = session.client('s3')
|
|
bucket_name = self.bucket_name
|
|
try:
|
|
self._validate_bucket_name(bucket_name)
|
|
except ValueError as e:
|
|
raise UserError(e)
|
|
self.write({
|
|
'file_path': file
|
|
})
|
|
s3_client.create_bucket(
|
|
Bucket=bucket_name,
|
|
CreateBucketConfiguration={'LocationConstraint': 'ap-south-1'}
|
|
)
|
|
self.write({'state': "push_to_bucket"})
|
|
|
|
def action_s3bucket_push(self):
|
|
"""To push the data to Amazon S3 bucket"""
|
|
values = self.env['amazon.dataset'].forecast_values()
|
|
amazon_forecast = values['amazon_forecast']
|
|
if amazon_forecast:
|
|
amazon_access_key = values['amazon_access_key']
|
|
amazon_secret_access_key = values['amazon_secret_access_key']
|
|
amazon_region = values['amazon_region']
|
|
session = boto3.Session(
|
|
aws_access_key_id=amazon_access_key,
|
|
aws_secret_access_key=amazon_secret_access_key,
|
|
region_name=amazon_region
|
|
)
|
|
s3_client = session.client('s3')
|
|
s3_resource = session.resource('s3')
|
|
bucket = s3_resource.Bucket(self.bucket_name)
|
|
bucket_name = self.bucket_name
|
|
file_path = self.file_path
|
|
with open(file_path, 'rb') as file:
|
|
s3_client.put_object(Body=file, Bucket=bucket_name,
|
|
Key=file_path)
|
|
for object_summary in bucket.objects.all():
|
|
object_key = object_summary.key
|
|
self.write({
|
|
's3_uri': f"s3://{self.bucket_name}/{object_key}",
|
|
})
|
|
self.write({'state': "pushed"})
|
|
|