More Azure strict nulls (#20614)

This commit is contained in:
Charles Gagnon
2022-09-16 11:43:24 -07:00
committed by GitHub
parent 2a3d0bcde5
commit c2c16c99e8
17 changed files with 46 additions and 40 deletions

View File

@@ -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

View File

@@ -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 || ''
} }
}; };
} }

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
}; };

View File

@@ -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

View File

@@ -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

View File

@@ -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
}; };

View File

@@ -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);
} }

View File

@@ -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

View File

@@ -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

View File

@@ -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 || '';
} }
} }

View File

@@ -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';
} }

View File

@@ -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;
} }

View File

@@ -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
}; };
})); }));

View File

@@ -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;
} }