moto/moto/glue/responses.py

277 lines
9.4 KiB
Python
Raw Normal View History

from __future__ import unicode_literals
import json
from moto.core.responses import BaseResponse
from .models import glue_backend
from .exceptions import (
PartitionAlreadyExistsException,
PartitionNotFoundException,
2019-10-31 15:44:26 +00:00
TableNotFoundException,
)
class GlueResponse(BaseResponse):
@property
def glue_backend(self):
return glue_backend
@property
def parameters(self):
return json.loads(self.body)
def create_database(self):
database_input = self.parameters.get("DatabaseInput")
database_name = database_input.get("Name")
self.glue_backend.create_database(database_name, database_input)
return ""
def get_database(self):
2019-10-31 15:44:26 +00:00
database_name = self.parameters.get("Name")
database = self.glue_backend.get_database(database_name)
return json.dumps({"Database": database.as_dict()})
def get_databases(self):
database_list = self.glue_backend.get_databases()
return json.dumps(
{"DatabaseList": [database.as_dict() for database in database_list]}
)
def create_table(self):
2019-10-31 15:44:26 +00:00
database_name = self.parameters.get("DatabaseName")
table_input = self.parameters.get("TableInput")
table_name = table_input.get("Name")
self.glue_backend.create_table(database_name, table_name, table_input)
return ""
def get_table(self):
2019-10-31 15:44:26 +00:00
database_name = self.parameters.get("DatabaseName")
table_name = self.parameters.get("Name")
table = self.glue_backend.get_table(database_name, table_name)
2019-10-31 15:44:26 +00:00
return json.dumps({"Table": table.as_dict()})
def update_table(self):
2019-10-31 15:44:26 +00:00
database_name = self.parameters.get("DatabaseName")
table_input = self.parameters.get("TableInput")
table_name = table_input.get("Name")
table = self.glue_backend.get_table(database_name, table_name)
table.update(table_input)
return ""
def get_table_versions(self):
2019-10-31 15:44:26 +00:00
database_name = self.parameters.get("DatabaseName")
table_name = self.parameters.get("TableName")
table = self.glue_backend.get_table(database_name, table_name)
2019-10-31 15:44:26 +00:00
return json.dumps(
{
"TableVersions": [
{"Table": table.as_dict(version=n), "VersionId": str(n + 1)}
for n in range(len(table.versions))
]
}
)
def get_table_version(self):
2019-10-31 15:44:26 +00:00
database_name = self.parameters.get("DatabaseName")
table_name = self.parameters.get("TableName")
table = self.glue_backend.get_table(database_name, table_name)
2019-10-31 15:44:26 +00:00
ver_id = self.parameters.get("VersionId")
2019-10-31 15:44:26 +00:00
return json.dumps(
{
"TableVersion": {
"Table": table.as_dict(version=ver_id),
"VersionId": ver_id,
}
}
)
def get_tables(self):
2019-10-31 15:44:26 +00:00
database_name = self.parameters.get("DatabaseName")
tables = self.glue_backend.get_tables(database_name)
2019-10-31 15:44:26 +00:00
return json.dumps({"TableList": [table.as_dict() for table in tables]})
def delete_table(self):
2019-10-31 15:44:26 +00:00
database_name = self.parameters.get("DatabaseName")
table_name = self.parameters.get("Name")
resp = self.glue_backend.delete_table(database_name, table_name)
return json.dumps(resp)
def batch_delete_table(self):
2019-10-31 15:44:26 +00:00
database_name = self.parameters.get("DatabaseName")
errors = []
2019-10-31 15:44:26 +00:00
for table_name in self.parameters.get("TablesToDelete"):
try:
self.glue_backend.delete_table(database_name, table_name)
except TableNotFoundException:
2019-10-31 15:44:26 +00:00
errors.append(
{
"TableName": table_name,
"ErrorDetail": {
"ErrorCode": "EntityNotFoundException",
"ErrorMessage": "Table not found",
},
}
2019-10-31 15:44:26 +00:00
)
out = {}
if errors:
out["Errors"] = errors
return json.dumps(out)
def get_partitions(self):
2019-10-31 15:44:26 +00:00
database_name = self.parameters.get("DatabaseName")
table_name = self.parameters.get("TableName")
if "Expression" in self.parameters:
raise NotImplementedError(
"Expression filtering in get_partitions is not implemented in moto"
)
table = self.glue_backend.get_table(database_name, table_name)
2019-10-31 15:44:26 +00:00
return json.dumps({"Partitions": [p.as_dict() for p in table.get_partitions()]})
def get_partition(self):
2019-10-31 15:44:26 +00:00
database_name = self.parameters.get("DatabaseName")
table_name = self.parameters.get("TableName")
values = self.parameters.get("PartitionValues")
table = self.glue_backend.get_table(database_name, table_name)
p = table.get_partition(values)
2019-10-31 15:44:26 +00:00
return json.dumps({"Partition": p.as_dict()})
2019-07-17 19:07:19 +00:00
def batch_get_partition(self):
2019-10-31 15:44:26 +00:00
database_name = self.parameters.get("DatabaseName")
table_name = self.parameters.get("TableName")
partitions_to_get = self.parameters.get("PartitionsToGet")
2019-07-17 19:07:19 +00:00
table = self.glue_backend.get_table(database_name, table_name)
partitions = []
for values in partitions_to_get:
try:
p = table.get_partition(values=values["Values"])
partitions.append(p.as_dict())
except PartitionNotFoundException:
continue
2019-10-31 15:44:26 +00:00
return json.dumps({"Partitions": partitions})
2019-07-17 19:07:19 +00:00
def create_partition(self):
2019-10-31 15:44:26 +00:00
database_name = self.parameters.get("DatabaseName")
table_name = self.parameters.get("TableName")
part_input = self.parameters.get("PartitionInput")
table = self.glue_backend.get_table(database_name, table_name)
table.create_partition(part_input)
return ""
def batch_create_partition(self):
2019-10-31 15:44:26 +00:00
database_name = self.parameters.get("DatabaseName")
table_name = self.parameters.get("TableName")
table = self.glue_backend.get_table(database_name, table_name)
errors_output = []
2019-10-31 15:44:26 +00:00
for part_input in self.parameters.get("PartitionInputList"):
try:
table.create_partition(part_input)
except PartitionAlreadyExistsException:
2019-10-31 15:44:26 +00:00
errors_output.append(
{
"PartitionValues": part_input["Values"],
"ErrorDetail": {
"ErrorCode": "AlreadyExistsException",
"ErrorMessage": "Partition already exists.",
},
}
2019-10-31 15:44:26 +00:00
)
out = {}
if errors_output:
out["Errors"] = errors_output
return json.dumps(out)
def update_partition(self):
2019-10-31 15:44:26 +00:00
database_name = self.parameters.get("DatabaseName")
table_name = self.parameters.get("TableName")
part_input = self.parameters.get("PartitionInput")
part_to_update = self.parameters.get("PartitionValueList")
table = self.glue_backend.get_table(database_name, table_name)
table.update_partition(part_to_update, part_input)
return ""
def batch_update_partition(self):
database_name = self.parameters.get("DatabaseName")
table_name = self.parameters.get("TableName")
table = self.glue_backend.get_table(database_name, table_name)
errors_output = []
for entry in self.parameters.get("Entries"):
part_to_update = entry["PartitionValueList"]
part_input = entry["PartitionInput"]
try:
table.update_partition(part_to_update, part_input)
except PartitionNotFoundException:
errors_output.append(
{
"PartitionValueList": part_to_update,
"ErrorDetail": {
"ErrorCode": "EntityNotFoundException",
"ErrorMessage": "Partition not found.",
},
}
)
out = {}
if errors_output:
out["Errors"] = errors_output
return json.dumps(out)
def delete_partition(self):
2019-10-31 15:44:26 +00:00
database_name = self.parameters.get("DatabaseName")
table_name = self.parameters.get("TableName")
part_to_delete = self.parameters.get("PartitionValues")
table = self.glue_backend.get_table(database_name, table_name)
table.delete_partition(part_to_delete)
return ""
def batch_delete_partition(self):
2019-10-31 15:44:26 +00:00
database_name = self.parameters.get("DatabaseName")
table_name = self.parameters.get("TableName")
table = self.glue_backend.get_table(database_name, table_name)
errors_output = []
2019-10-31 15:44:26 +00:00
for part_input in self.parameters.get("PartitionsToDelete"):
values = part_input.get("Values")
try:
table.delete_partition(values)
except PartitionNotFoundException:
2019-10-31 15:44:26 +00:00
errors_output.append(
{
"PartitionValues": values,
"ErrorDetail": {
"ErrorCode": "EntityNotFoundException",
"ErrorMessage": "Partition not found",
},
}
2019-10-31 15:44:26 +00:00
)
out = {}
if errors_output:
2019-10-31 15:44:26 +00:00
out["Errors"] = errors_output
return json.dumps(out)