mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-17 02:51:36 -05:00
More Azure strict nulls (#20614)
This commit is contained in:
@@ -32,7 +32,7 @@ export class AzureMonitorResourceService extends ResourceServiceBase<AzureMonito
|
|||||||
defaultDatabaseName: '',
|
defaultDatabaseName: '',
|
||||||
subscription: {
|
subscription: {
|
||||||
id: resource.subscriptionId,
|
id: resource.subscriptionId,
|
||||||
name: resource.subscriptionName
|
name: resource.subscriptionName || ''
|
||||||
},
|
},
|
||||||
tenant: resource.tenantId,
|
tenant: resource.tenantId,
|
||||||
resourceGroup: resource.resourceGroup
|
resourceGroup: resource.resourceGroup
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ export class CosmosDbMongoService extends ResourceServiceBase<DbServerGraphData,
|
|||||||
tenant: resource.tenantId,
|
tenant: resource.tenantId,
|
||||||
subscription: {
|
subscription: {
|
||||||
id: resource.subscriptionId,
|
id: resource.subscriptionId,
|
||||||
name: resource.subscriptionName
|
name: resource.subscriptionName || ''
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,6 +68,10 @@ export class AzureResourceDatabaseService implements IAzureResourceService<azure
|
|||||||
let serversForRg = rgMap.get(db.resourceGroup);
|
let serversForRg = rgMap.get(db.resourceGroup);
|
||||||
if (serversForRg && !db.kind.endsWith('system') && svrIdRegExp.test(db.id)) {
|
if (serversForRg && !db.kind.endsWith('system') && svrIdRegExp.test(db.id)) {
|
||||||
const founds = svrIdRegExp.exec(db.id);
|
const founds = svrIdRegExp.exec(db.id);
|
||||||
|
if (!founds) {
|
||||||
|
console.warn(`Could not parse server name from ID ${db.id}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
const serverName = founds[2];
|
const serverName = founds[2];
|
||||||
let server = combined.find(s => s.name === serverName);
|
let server = combined.find(s => s.name === serverName);
|
||||||
if (server) {
|
if (server) {
|
||||||
@@ -80,7 +84,7 @@ export class AzureResourceDatabaseService implements IAzureResourceService<azure
|
|||||||
loginName: (server as SynapseWorkspaceGraphData).properties.sqlAdministratorLogin ?? (server as DbServerGraphData).properties.administratorLogin,
|
loginName: (server as SynapseWorkspaceGraphData).properties.sqlAdministratorLogin ?? (server as DbServerGraphData).properties.administratorLogin,
|
||||||
subscription: {
|
subscription: {
|
||||||
id: db.subscriptionId,
|
id: db.subscriptionId,
|
||||||
name: (subscriptions.find(sub => sub.id === db.subscriptionId))?.name
|
name: (subscriptions.find(sub => sub.id === db.subscriptionId))?.name || ''
|
||||||
},
|
},
|
||||||
tenant: db.tenantId,
|
tenant: db.tenantId,
|
||||||
resourceGroup: db.resourceGroup
|
resourceGroup: db.resourceGroup
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ export class AzureResourceDatabaseServerService implements IAzureResourceService
|
|||||||
combinedGraphResources.forEach((res) => {
|
combinedGraphResources.forEach((res) => {
|
||||||
if (!ids.has(res.id)) {
|
if (!ids.has(res.id)) {
|
||||||
ids.add(res.id);
|
ids.add(res.id);
|
||||||
res.subscriptionName = subscriptions.find(sub => sub.id === res.subscriptionId).name;
|
res.subscriptionName = subscriptions.find(sub => sub.id === res.subscriptionId)?.name;
|
||||||
const converted = this.convertResource(res);
|
const converted = this.convertResource(res);
|
||||||
convertedResources.push(converted);
|
convertedResources.push(converted);
|
||||||
}
|
}
|
||||||
@@ -87,7 +87,7 @@ export class AzureResourceDatabaseServerService implements IAzureResourceService
|
|||||||
defaultDatabaseName: 'master',
|
defaultDatabaseName: 'master',
|
||||||
subscription: {
|
subscription: {
|
||||||
id: resource.subscriptionId,
|
id: resource.subscriptionId,
|
||||||
name: resource.subscriptionName
|
name: resource.subscriptionName || ''
|
||||||
},
|
},
|
||||||
tenant: resource.tenantId,
|
tenant: resource.tenantId,
|
||||||
resourceGroup: resource.resourceGroup
|
resourceGroup: resource.resourceGroup
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ export class KustoResourceService extends ResourceServiceBase<KustoGraphData, az
|
|||||||
defaultDatabaseName: '',
|
defaultDatabaseName: '',
|
||||||
subscription: {
|
subscription: {
|
||||||
id: resource.subscriptionId,
|
id: resource.subscriptionId,
|
||||||
name: resource.subscriptionName
|
name: resource.subscriptionName || ''
|
||||||
},
|
},
|
||||||
tenant: resource.tenantId,
|
tenant: resource.tenantId,
|
||||||
resourceGroup: resource.resourceGroup
|
resourceGroup: resource.resourceGroup
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ export class MysqlFlexibleServerService extends ResourceServiceBase<DbServerGrap
|
|||||||
tenant: resource.tenantId,
|
tenant: resource.tenantId,
|
||||||
subscription: {
|
subscription: {
|
||||||
id: resource.subscriptionId,
|
id: resource.subscriptionId,
|
||||||
name: resource.subscriptionName
|
name: resource.subscriptionName || ''
|
||||||
},
|
},
|
||||||
resourceGroup: resource.resourceGroup
|
resourceGroup: resource.resourceGroup
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ export class PostgresServerArcService extends ResourceServiceBase<PostgresArcSer
|
|||||||
defaultDatabaseName: 'postgres',
|
defaultDatabaseName: 'postgres',
|
||||||
subscription: {
|
subscription: {
|
||||||
id: resource.subscriptionId,
|
id: resource.subscriptionId,
|
||||||
name: resource.subscriptionName
|
name: resource.subscriptionName || ''
|
||||||
},
|
},
|
||||||
tenant: resource.tenantId,
|
tenant: resource.tenantId,
|
||||||
resourceGroup: resource.resourceGroup
|
resourceGroup: resource.resourceGroup
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ export class PostgresServerService extends ResourceServiceBase<DbServerGraphData
|
|||||||
defaultDatabaseName: 'postgres',
|
defaultDatabaseName: 'postgres',
|
||||||
subscription: {
|
subscription: {
|
||||||
id: resource.subscriptionId,
|
id: resource.subscriptionId,
|
||||||
name: resource.subscriptionName
|
name: resource.subscriptionName || ''
|
||||||
},
|
},
|
||||||
tenant: resource.tenantId,
|
tenant: resource.tenantId,
|
||||||
resourceGroup: resource.resourceGroup
|
resourceGroup: resource.resourceGroup
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ export class AzureResourceGroupService extends ResourceServiceBase<DbServerGraph
|
|||||||
name: resource.name,
|
name: resource.name,
|
||||||
subscription: {
|
subscription: {
|
||||||
id: resource.subscriptionId,
|
id: resource.subscriptionId,
|
||||||
name: resource.subscriptionName
|
name: resource.subscriptionName || ''
|
||||||
},
|
},
|
||||||
tenant: resource.tenantId
|
tenant: resource.tenantId
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -39,6 +39,9 @@ export abstract class ResourceTreeDataProviderBase<T extends azureResource.Azure
|
|||||||
|
|
||||||
private async getResources(element: azureResource.IAzureResourceNode): Promise<T[]> {
|
private async getResources(element: azureResource.IAzureResourceNode): Promise<T[]> {
|
||||||
const response = await azdata.accounts.getAccountSecurityToken(element.account, element.tenantId, azdata.AzureResource.ResourceManagement);
|
const response = await azdata.accounts.getAccountSecurityToken(element.account, element.tenantId, azdata.AzureResource.ResourceManagement);
|
||||||
|
if (!response) {
|
||||||
|
throw new Error(`Did not receive security token when getting resources for account ${element.account.displayInfo.displayName}`);
|
||||||
|
}
|
||||||
const credential = new msRest.TokenCredentials(response.token, response.tokenType);
|
const credential = new msRest.TokenCredentials(response.token, response.tokenType);
|
||||||
|
|
||||||
const resources: T[] = await this._resourceService.getResources([element.subscription], credential, element.account) || <T[]>[];
|
const resources: T[] = await this._resourceService.getResources([element.subscription], credential, element.account) || <T[]>[];
|
||||||
@@ -125,7 +128,7 @@ export abstract class ResourceServiceBase<T extends GraphData, U extends azureRe
|
|||||||
graphResources.forEach((res) => {
|
graphResources.forEach((res) => {
|
||||||
if (!ids.has(res.id)) {
|
if (!ids.has(res.id)) {
|
||||||
ids.add(res.id);
|
ids.add(res.id);
|
||||||
res.subscriptionName = subscriptions.find(sub => sub.id === res.subscriptionId).name;
|
res.subscriptionName = subscriptions.find(sub => sub.id === res.subscriptionId)?.name;
|
||||||
const converted = this.convertResource(res);
|
const converted = this.convertResource(res);
|
||||||
convertedResources.push(converted);
|
convertedResources.push(converted);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ export class SqlInstanceResourceService extends ResourceServiceBase<SqlInstanceG
|
|||||||
defaultDatabaseName: 'master',
|
defaultDatabaseName: 'master',
|
||||||
subscription: {
|
subscription: {
|
||||||
id: resource.subscriptionId,
|
id: resource.subscriptionId,
|
||||||
name: resource.subscriptionName
|
name: resource.subscriptionName || ''
|
||||||
},
|
},
|
||||||
tenant: resource.tenantId,
|
tenant: resource.tenantId,
|
||||||
resourceGroup: resource.resourceGroup
|
resourceGroup: resource.resourceGroup
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ export class SqlInstanceArcResourceService extends ResourceServiceBase<SqlInstan
|
|||||||
defaultDatabaseName: 'master',
|
defaultDatabaseName: 'master',
|
||||||
subscription: {
|
subscription: {
|
||||||
id: resource.subscriptionId,
|
id: resource.subscriptionId,
|
||||||
name: resource.subscriptionName
|
name: resource.subscriptionName || ''
|
||||||
},
|
},
|
||||||
tenant: resource.tenantId,
|
tenant: resource.tenantId,
|
||||||
resourceGroup: resource.resourceGroup
|
resourceGroup: resource.resourceGroup
|
||||||
|
|||||||
@@ -60,20 +60,20 @@ export class AzureResourceResourceTreeNode extends TreeNode {
|
|||||||
const treeItem = this.resourceNodeWithProviderId.resourceNode.treeItem;
|
const treeItem = this.resourceNodeWithProviderId.resourceNode.treeItem;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
label: <any>treeItem.label,
|
label: typeof treeItem.label === 'object' ? treeItem.label.label : treeItem.label || '',
|
||||||
isLeaf: treeItem.collapsibleState === TreeItemCollapsibleState.None ? true : false,
|
isLeaf: treeItem.collapsibleState === TreeItemCollapsibleState.None ? true : false,
|
||||||
errorMessage: undefined,
|
errorMessage: undefined,
|
||||||
metadata: undefined,
|
metadata: undefined,
|
||||||
nodePath: this.generateNodePath(),
|
nodePath: this.generateNodePath(),
|
||||||
nodeStatus: undefined,
|
nodeStatus: undefined,
|
||||||
nodeType: treeItem.contextValue,
|
nodeType: treeItem.contextValue || '',
|
||||||
nodeSubType: undefined,
|
nodeSubType: undefined,
|
||||||
iconType: treeItem.contextValue
|
iconType: treeItem.contextValue
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public get nodePathValue(): string {
|
public get nodePathValue(): string {
|
||||||
return this.resourceNodeWithProviderId.resourceNode.treeItem.id;
|
return this.resourceNodeWithProviderId.resourceNode.treeItem.id || '';
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,10 +9,8 @@ import { IAzureResourceCacheService } from '../interfaces';
|
|||||||
|
|
||||||
export class AzureResourceCacheService implements IAzureResourceCacheService {
|
export class AzureResourceCacheService implements IAzureResourceCacheService {
|
||||||
public constructor(
|
public constructor(
|
||||||
context: ExtensionContext
|
private _context: ExtensionContext
|
||||||
) {
|
) { }
|
||||||
this._context = context;
|
|
||||||
}
|
|
||||||
|
|
||||||
public generateKey(id: string): string {
|
public generateKey(id: string): string {
|
||||||
return `${AzureResourceCacheService.cacheKeyPrefix}.${id}`;
|
return `${AzureResourceCacheService.cacheKeyPrefix}.${id}`;
|
||||||
@@ -26,7 +24,5 @@ export class AzureResourceCacheService implements IAzureResourceCacheService {
|
|||||||
await this._context.workspaceState.update(key, value);
|
await this._context.workspaceState.update(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
private _context: ExtensionContext = undefined;
|
|
||||||
|
|
||||||
private static readonly cacheKeyPrefix = 'azure.resource.cache';
|
private static readonly cacheKeyPrefix = 'azure.resource.cache';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,11 +11,11 @@ interface AzureResourceSelectedSubscriptionsCache {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class AzureResourceSubscriptionFilterService implements IAzureResourceSubscriptionFilterService {
|
export class AzureResourceSubscriptionFilterService implements IAzureResourceSubscriptionFilterService {
|
||||||
public constructor(
|
private _cacheKey: string;
|
||||||
cacheService: IAzureResourceCacheService
|
|
||||||
) {
|
|
||||||
this._cacheService = cacheService;
|
|
||||||
|
|
||||||
|
public constructor(
|
||||||
|
private _cacheService: IAzureResourceCacheService
|
||||||
|
) {
|
||||||
this._cacheKey = this._cacheService.generateKey('selectedSubscriptions');
|
this._cacheKey = this._cacheService.generateKey('selectedSubscriptions');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,7 +51,4 @@ export class AzureResourceSubscriptionFilterService implements IAzureResourceSub
|
|||||||
filters.push(...selectedSubscriptionsCache[accountId].map((subscription) => `${accountId}/${subscription.id}/${subscription.name}`));
|
filters.push(...selectedSubscriptionsCache[accountId].map((subscription) => `${accountId}/${subscription.id}/${subscription.name}`));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private _cacheService: IAzureResourceCacheService = undefined;
|
|
||||||
private _cacheKey: string = undefined;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,8 +36,8 @@ export class AzureResourceSubscriptionService implements IAzureResourceSubscript
|
|||||||
const newSubs = await subClient.subscriptions.list();
|
const newSubs = await subClient.subscriptions.list();
|
||||||
subscriptions.push(...newSubs.map(newSub => {
|
subscriptions.push(...newSubs.map(newSub => {
|
||||||
return {
|
return {
|
||||||
id: newSub.subscriptionId,
|
id: newSub.subscriptionId || '',
|
||||||
name: newSub.displayName,
|
name: newSub.displayName || '',
|
||||||
tenant: tenantId
|
tenant: tenantId
|
||||||
};
|
};
|
||||||
}));
|
}));
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ const handleNeverUsed = async (): Promise<void> => {
|
|||||||
|
|
||||||
const option = await vscode.window.showInformationMessage<TerminalMessageItem>(neverUsedString, openAzureShellButton, okButton);
|
const option = await vscode.window.showInformationMessage<TerminalMessageItem>(neverUsedString, openAzureShellButton, okButton);
|
||||||
|
|
||||||
if (option.action === TerminalOption.OPEN_SITE) {
|
if (option?.action === TerminalOption.OPEN_SITE) {
|
||||||
void vscode.env.openExternal(vscode.Uri.parse('https://aka.ms/AA83f8f'));
|
void vscode.env.openExternal(vscode.Uri.parse('https://aka.ms/AA83f8f'));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -50,6 +50,9 @@ export class AzureTerminalService implements IAzureTerminalService {
|
|||||||
|
|
||||||
public async getOrCreateCloudConsole(account: AzureAccount, tenant: Tenant): Promise<void> {
|
public async getOrCreateCloudConsole(account: AzureAccount, tenant: Tenant): Promise<void> {
|
||||||
const token = await azdata.accounts.getAccountSecurityToken(account, tenant.id, azdata.AzureResource.MicrosoftResourceManagement);
|
const token = await azdata.accounts.getAccountSecurityToken(account, tenant.id, azdata.AzureResource.MicrosoftResourceManagement);
|
||||||
|
if (!token) {
|
||||||
|
throw new Error('Did not receive security token when creating cloud console');
|
||||||
|
}
|
||||||
const settings: AxiosRequestConfig = {
|
const settings: AxiosRequestConfig = {
|
||||||
headers: {
|
headers: {
|
||||||
'Accept': 'application/json',
|
'Accept': 'application/json',
|
||||||
@@ -76,7 +79,7 @@ export class AzureTerminalService implements IAzureTerminalService {
|
|||||||
|
|
||||||
const consoleRequestUri = this.getConsoleRequestUri(metadata.settings.armResource.endpoint);
|
const consoleRequestUri = this.getConsoleRequestUri(metadata.settings.armResource.endpoint);
|
||||||
if (preferredLocation) {
|
if (preferredLocation) {
|
||||||
settings.headers['x-ms-console-preferred-location'] = preferredLocation;
|
settings.headers!['x-ms-console-preferred-location'] = preferredLocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
let provisionResult: AxiosResponse<any>;
|
let provisionResult: AxiosResponse<any>;
|
||||||
@@ -143,9 +146,9 @@ class AzureTerminal implements vscode.Pseudoterminal {
|
|||||||
private readonly writeEmitter: vscode.EventEmitter<string>;
|
private readonly writeEmitter: vscode.EventEmitter<string>;
|
||||||
public readonly onDidWrite: vscode.Event<string>;
|
public readonly onDidWrite: vscode.Event<string>;
|
||||||
|
|
||||||
private socket: WS;
|
private socket: WS | undefined = undefined;
|
||||||
private intervalTimer: NodeJS.Timer;
|
private intervalTimer: NodeJS.Timer | undefined = undefined;
|
||||||
private terminalDimensions: vscode.TerminalDimensions;
|
private terminalDimensions: vscode.TerminalDimensions | undefined;
|
||||||
|
|
||||||
constructor(private readonly consoleUri: string, private readonly token: string, private shell: string) {
|
constructor(private readonly consoleUri: string, private readonly token: string, private shell: string) {
|
||||||
this.writeEmitter = new vscode.EventEmitter<string>();
|
this.writeEmitter = new vscode.EventEmitter<string>();
|
||||||
@@ -209,7 +212,7 @@ class AzureTerminal implements vscode.Pseudoterminal {
|
|||||||
|
|
||||||
// Keep alives
|
// Keep alives
|
||||||
this.intervalTimer = setInterval(() => {
|
this.intervalTimer = setInterval(() => {
|
||||||
this.socket.ping();
|
this.socket?.ping();
|
||||||
}, 5000);
|
}, 5000);
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
console.log(ex);
|
console.log(ex);
|
||||||
@@ -217,10 +220,13 @@ class AzureTerminal implements vscode.Pseudoterminal {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private async establishTerminal(dimensions: vscode.TerminalDimensions): Promise<string> {
|
private async establishTerminal(dimensions: vscode.TerminalDimensions | undefined): Promise<string | undefined> {
|
||||||
let terminalResult: AxiosResponse<any>;
|
let terminalResult: AxiosResponse<any>;
|
||||||
try {
|
try {
|
||||||
terminalResult = await axios.post(`${this.consoleUri}/terminals?rows=${dimensions.rows}&cols=${dimensions.columns}&shell=${this.shell}`, undefined, {
|
const url = dimensions ?
|
||||||
|
`${this.consoleUri}/terminals?rows=${dimensions.rows}&cols=${dimensions.columns}&shell=${this.shell}`
|
||||||
|
: `${this.consoleUri}/terminals?shell=${this.shell}`;
|
||||||
|
terminalResult = await axios.post(url, undefined, {
|
||||||
headers: {
|
headers: {
|
||||||
'Accept': 'application/json',
|
'Accept': 'application/json',
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
@@ -228,7 +234,7 @@ class AzureTerminal implements vscode.Pseudoterminal {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
console.log(ex, ex.response);
|
console.log(`Error establishing terminal. ${ex}, ${ex.response}`);
|
||||||
await handleNeverUsed();
|
await handleNeverUsed();
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user