mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-02-16 18:47:57 -05:00
Added renaming and pinning agent notebook runs (#855)
* Added endpoint for fetching all notebook jobs * Refractored NotebookJobInfo to AgentNotebookInfo to make it more consistent with the rest of the codebase * Added Notebook History endpoint in contracts. * Added Create, Update, Delete notebook endpoints. Also added separate fetch template, materialized notebook endpoints. This will make the Notebook Request and Notebook History responses lighter. * AgentNotebookInfo is now derived from AgentJobInfo * added fetch noteook history endpoint * Added fetching materialized notebook endpoint * Added code for cleaning up the directory * Added create notebook api * Added Update and delete notebook job * Fixed notebook history API * Added last run info to the script and template folder * Added execute database feature for notebook Jobs * SQL commands are now using sqlparameters to prevent any injection attacks * Changed rundate and runtime to string to preserve leading zeros * integration test for agentnotebooks api * Made some changes mentioned in PR * Refactored the code, removed enpoint logic from the notebook handler and wrote test cases * changes select statements, fixed a bug in the test job cleanup and fixed other stuff mentioned in the PR. * added notebook_error column in notebook history select statement * Added get template notebook endpoint * Added renaming and pinning notebook runs * made tables names caps to handle servers with case sensitive queries * made some changes to the enpointpoint paths
This commit is contained in:
@@ -129,6 +129,8 @@ namespace Microsoft.SqlTools.ServiceLayer.Agent
|
|||||||
this.ServiceHost.SetRequestHandler(CreateAgentNotebookRequest.Type, HandleCreateAgentNotebookRequest);
|
this.ServiceHost.SetRequestHandler(CreateAgentNotebookRequest.Type, HandleCreateAgentNotebookRequest);
|
||||||
this.ServiceHost.SetRequestHandler(DeleteAgentNotebookRequest.Type, HandleDeleteAgentNotebooksRequest);
|
this.ServiceHost.SetRequestHandler(DeleteAgentNotebookRequest.Type, HandleDeleteAgentNotebooksRequest);
|
||||||
this.ServiceHost.SetRequestHandler(UpdateAgentNotebookRequest.Type, HandleUpdateAgentNotebookRequest);
|
this.ServiceHost.SetRequestHandler(UpdateAgentNotebookRequest.Type, HandleUpdateAgentNotebookRequest);
|
||||||
|
this.ServiceHost.SetRequestHandler(UpdateAgentNotebookRunPinRequest.Type, HandleUpdateAgentNotebookRunPinRequest);
|
||||||
|
this.ServiceHost.SetRequestHandler(UpdateAgentNotebookRunNameRequest.Type, HandleUpdateAgentNotebookRunNameRequest);
|
||||||
|
|
||||||
|
|
||||||
serviceHost.RegisterShutdownTask(async (shutdownParams, shutdownRequestContext) =>
|
serviceHost.RegisterShutdownTask(async (shutdownParams, shutdownRequestContext) =>
|
||||||
@@ -1410,6 +1412,64 @@ namespace Microsoft.SqlTools.ServiceLayer.Agent
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal async Task HandleUpdateAgentNotebookRunNameRequest(UpdateAgentNotebookRunNameParams parameters, RequestContext<ResultStatus> requestContext)
|
||||||
|
{
|
||||||
|
await Task.Run(async () =>
|
||||||
|
{
|
||||||
|
var result = new ResultStatus();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ConnectionInfo connInfo;
|
||||||
|
ConnectionServiceInstance.TryFindConnection(
|
||||||
|
parameters.OwnerUri,
|
||||||
|
out connInfo);
|
||||||
|
// Calling update helper function
|
||||||
|
await AgentNotebookHelper.UpdateMaterializedNotebookName(
|
||||||
|
connInfo,
|
||||||
|
parameters.MaterializedId,
|
||||||
|
parameters.TargetDatabase,
|
||||||
|
parameters.MaterializedNotebookName);
|
||||||
|
result.Success = true;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
result.Success = false;
|
||||||
|
result.ErrorMessage = e.ToString();
|
||||||
|
|
||||||
|
}
|
||||||
|
await requestContext.SendResult(result);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
internal async Task HandleUpdateAgentNotebookRunPinRequest(UpdateAgentNotebookRunPinParams parameters, RequestContext<ResultStatus> requestContext)
|
||||||
|
{
|
||||||
|
await Task.Run(async () =>
|
||||||
|
{
|
||||||
|
var result = new ResultStatus();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ConnectionInfo connInfo;
|
||||||
|
ConnectionServiceInstance.TryFindConnection(
|
||||||
|
parameters.OwnerUri,
|
||||||
|
out connInfo);
|
||||||
|
// Calling update helper function
|
||||||
|
await AgentNotebookHelper.UpdateMaterializedNotebookPin(
|
||||||
|
connInfo,
|
||||||
|
parameters.MaterializedId,
|
||||||
|
parameters.TargetDatabase,
|
||||||
|
parameters.MaterializedNotebookPin);
|
||||||
|
result.Success = true;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
result.Success = false;
|
||||||
|
result.ErrorMessage = e.ToString();
|
||||||
|
|
||||||
|
}
|
||||||
|
await requestContext.SendResult(result);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public AgentNotebookHistoryResult GetAgentNotebookHistories(
|
public AgentNotebookHistoryResult GetAgentNotebookHistories(
|
||||||
ConnectionInfo connInfo,
|
ConnectionInfo connInfo,
|
||||||
string jobId,
|
string jobId,
|
||||||
@@ -1475,6 +1535,8 @@ namespace Microsoft.SqlTools.ServiceLayer.Agent
|
|||||||
{
|
{
|
||||||
notebookHistory.MaterializedNotebookId = (int)notebookHistoriesDict[jobRuntime]["materialized_id"];
|
notebookHistory.MaterializedNotebookId = (int)notebookHistoriesDict[jobRuntime]["materialized_id"];
|
||||||
notebookHistory.MaterializedNotebookErrorInfo = notebookHistoriesDict[jobRuntime]["notebook_error"] as string;
|
notebookHistory.MaterializedNotebookErrorInfo = notebookHistoriesDict[jobRuntime]["notebook_error"] as string;
|
||||||
|
notebookHistory.MaterializedNotebookName = notebookHistoriesDict[jobRuntime]["notebook_name"] as string;
|
||||||
|
notebookHistory.MaterializedNotebookPin = (bool)notebookHistoriesDict[jobRuntime]["pin"];
|
||||||
}
|
}
|
||||||
notebookHistories.Add(notebookHistory);
|
notebookHistories.Add(notebookHistory);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,6 +65,8 @@ namespace Microsoft.SqlTools.ServiceLayer.Agent.Contracts
|
|||||||
public class AgentNotebookHistoryInfo : AgentJobHistoryInfo
|
public class AgentNotebookHistoryInfo : AgentJobHistoryInfo
|
||||||
{
|
{
|
||||||
public int MaterializedNotebookId { get; set; }
|
public int MaterializedNotebookId { get; set; }
|
||||||
|
public bool MaterializedNotebookPin { get; set; }
|
||||||
|
public string MaterializedNotebookName { get; set; }
|
||||||
public int MaterializedNotebookErrorFlag { get; set; }
|
public int MaterializedNotebookErrorFlag { get; set; }
|
||||||
public string MaterializedNotebookErrorInfo { get; set; }
|
public string MaterializedNotebookErrorInfo { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -212,4 +212,48 @@ namespace Microsoft.SqlTools.ServiceLayer.Agent.Contracts
|
|||||||
RequestType<AgentNotebookTemplateParams, AgentNotebookTemplateResult> Type =
|
RequestType<AgentNotebookTemplateParams, AgentNotebookTemplateResult> Type =
|
||||||
RequestType<AgentNotebookTemplateParams, AgentNotebookTemplateResult>.Create("agent/notebooktemplate");
|
RequestType<AgentNotebookTemplateParams, AgentNotebookTemplateResult>.Create("agent/notebooktemplate");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// SQL Agent Notebook templates params
|
||||||
|
/// </summary>
|
||||||
|
public class UpdateAgentNotebookRunNameParams : TaskRequestDetails
|
||||||
|
{
|
||||||
|
public string OwnerUri { get; set; }
|
||||||
|
public int MaterializedId { get; set; }
|
||||||
|
public string MaterializedNotebookName { get; set; }
|
||||||
|
public string TargetDatabase { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// SQL Agent Notebook templates request type
|
||||||
|
/// </summary>
|
||||||
|
public class UpdateAgentNotebookRunNameRequest
|
||||||
|
{
|
||||||
|
public static readonly
|
||||||
|
RequestType<UpdateAgentNotebookRunNameParams, ResultStatus> Type =
|
||||||
|
RequestType<UpdateAgentNotebookRunNameParams, ResultStatus>.Create("agent/updatenotebookname");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// SQL Agent Notebook templates params
|
||||||
|
/// </summary>
|
||||||
|
public class UpdateAgentNotebookRunPinParams : TaskRequestDetails
|
||||||
|
{
|
||||||
|
public string OwnerUri { get; set; }
|
||||||
|
public string MaterializedId { get; set; }
|
||||||
|
public bool MaterializedNotebookPin { get; set; }
|
||||||
|
public string TargetDatabase { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// SQL Agent Notebook templates request type
|
||||||
|
/// </summary>
|
||||||
|
public class UpdateAgentNotebookRunPinRequest
|
||||||
|
{
|
||||||
|
public static readonly
|
||||||
|
RequestType<UpdateAgentNotebookRunPinParams, ResultStatus> Type =
|
||||||
|
RequestType<UpdateAgentNotebookRunPinParams, ResultStatus>.Create("agent/updatenotebookpin");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -263,7 +263,9 @@ namespace Microsoft.SqlTools.ServiceLayer.Agent
|
|||||||
materialized_id,
|
materialized_id,
|
||||||
run_time,
|
run_time,
|
||||||
run_date,
|
run_date,
|
||||||
notebook_error
|
notebook_error,
|
||||||
|
pin,
|
||||||
|
notebook_name
|
||||||
FROM
|
FROM
|
||||||
notebooks.nb_materialized
|
notebooks.nb_materialized
|
||||||
WHERE JOB_ID = @jobId";
|
WHERE JOB_ID = @jobId";
|
||||||
@@ -406,9 +408,9 @@ namespace Microsoft.SqlTools.ServiceLayer.Agent
|
|||||||
string notebookDatabaseSetupQueryString =
|
string notebookDatabaseSetupQueryString =
|
||||||
@"
|
@"
|
||||||
IF NOT EXISTS (
|
IF NOT EXISTS (
|
||||||
SELECT schema_name
|
SELECT SCHEMA_NAME
|
||||||
FROM information_schema.schemata
|
FROM INFORMATION_SCHEMA.SCHEMATA
|
||||||
WHERE schema_name = 'notebooks' )
|
WHERE SCHEMA_NAME = 'notebooks' )
|
||||||
BEGIN
|
BEGIN
|
||||||
EXEC sp_executesql N'CREATE SCHEMA notebooks'
|
EXEC sp_executesql N'CREATE SCHEMA notebooks'
|
||||||
END
|
END
|
||||||
@@ -434,7 +436,9 @@ namespace Microsoft.SqlTools.ServiceLayer.Agent
|
|||||||
run_time VARCHAR(100),
|
run_time VARCHAR(100),
|
||||||
run_date VARCHAR(100),
|
run_date VARCHAR(100),
|
||||||
notebook NVARCHAR(MAX),
|
notebook NVARCHAR(MAX),
|
||||||
notebook_error NVARCHAR(MAX)
|
notebook_error NVARCHAR(MAX),
|
||||||
|
pin BIT NOT NULL DEFAULT 0,
|
||||||
|
notebook_name NVARCHAR(MAX) NOT NULL default('')
|
||||||
)
|
)
|
||||||
END
|
END
|
||||||
USE [msdb];
|
USE [msdb];
|
||||||
@@ -569,7 +573,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Agent
|
|||||||
string targetDatabase,
|
string targetDatabase,
|
||||||
string templateFileContents)
|
string templateFileContents)
|
||||||
{
|
{
|
||||||
String getNotebookTemplateQuery =
|
string getNotebookTemplateQuery =
|
||||||
@"
|
@"
|
||||||
SELECT notebook
|
SELECT notebook
|
||||||
from
|
from
|
||||||
@@ -589,5 +593,53 @@ namespace Microsoft.SqlTools.ServiceLayer.Agent
|
|||||||
DataRow templateDataRow = templateDataTable.Rows[0];
|
DataRow templateDataRow = templateDataTable.Rows[0];
|
||||||
return templateDataRow["notebook"] as string;
|
return templateDataRow["notebook"] as string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async Task UpdateMaterializedNotebookName(
|
||||||
|
ConnectionInfo connInfo,
|
||||||
|
int materializedId,
|
||||||
|
string targetDatabase,
|
||||||
|
string name)
|
||||||
|
{
|
||||||
|
string updateMaterializedNotebookNameQuery =
|
||||||
|
@"
|
||||||
|
UPDATE notebooks.nb_materialized
|
||||||
|
SET
|
||||||
|
notebook_name = @notebookName
|
||||||
|
WHERE
|
||||||
|
materialized_id = @materializedId
|
||||||
|
";
|
||||||
|
List<SqlParameter> updateMaterializedNotebookNameParams = new List<SqlParameter>();
|
||||||
|
updateMaterializedNotebookNameParams.Add(new SqlParameter("notebookName", name));
|
||||||
|
updateMaterializedNotebookNameParams.Add(new SqlParameter("materializedId", materializedId));
|
||||||
|
await AgentNotebookHelper.ExecuteSqlQueries(
|
||||||
|
connInfo,
|
||||||
|
updateMaterializedNotebookNameQuery,
|
||||||
|
updateMaterializedNotebookNameParams,
|
||||||
|
targetDatabase);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task UpdateMaterializedNotebookPin(
|
||||||
|
ConnectionInfo connInfo,
|
||||||
|
string materializedId,
|
||||||
|
string targetDatabase,
|
||||||
|
bool pin)
|
||||||
|
{
|
||||||
|
string updateMaterializedNotebookPinQuery =
|
||||||
|
@"
|
||||||
|
UPDATE notebooks.nb_materialized
|
||||||
|
SET
|
||||||
|
pin = @notebookPin
|
||||||
|
WHERE
|
||||||
|
materialized_id = @materializedId
|
||||||
|
";
|
||||||
|
List<SqlParameter> updateMaterializedNotebookPinParams = new List<SqlParameter>();
|
||||||
|
updateMaterializedNotebookPinParams.Add(new SqlParameter("notebookPin", pin));
|
||||||
|
updateMaterializedNotebookPinParams.Add(new SqlParameter("materializedId", materializedId));
|
||||||
|
await AgentNotebookHelper.ExecuteSqlQueries(
|
||||||
|
connInfo,
|
||||||
|
updateMaterializedNotebookPinQuery,
|
||||||
|
updateMaterializedNotebookPinParams,
|
||||||
|
targetDatabase);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user