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: '',
subscription: {
id: resource.subscriptionId,
name: resource.subscriptionName
name: resource.subscriptionName || ''
},
tenant: resource.tenantId,
resourceGroup: resource.resourceGroup

View File

@@ -33,7 +33,7 @@ export class CosmosDbMongoService extends ResourceServiceBase<DbServerGraphData,
tenant: resource.tenantId,
subscription: {
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);
if (serversForRg && !db.kind.endsWith('system') && svrIdRegExp.test(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];
let server = combined.find(s => s.name === serverName);
if (server) {
@@ -80,7 +84,7 @@ export class AzureResourceDatabaseService implements IAzureResourceService<azure
loginName: (server as SynapseWorkspaceGraphData).properties.sqlAdministratorLogin ?? (server as DbServerGraphData).properties.administratorLogin,
subscription: {
id: db.subscriptionId,
name: (subscriptions.find(sub => sub.id === db.subscriptionId))?.name
name: (subscriptions.find(sub => sub.id === db.subscriptionId))?.name || ''
},
tenant: db.tenantId,
resourceGroup: db.resourceGroup

View File

@@ -67,7 +67,7 @@ export class AzureResourceDatabaseServerService implements IAzureResourceService
combinedGraphResources.forEach((res) => {
if (!ids.has(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);
convertedResources.push(converted);
}
@@ -87,7 +87,7 @@ export class AzureResourceDatabaseServerService implements IAzureResourceService
defaultDatabaseName: 'master',
subscription: {
id: resource.subscriptionId,
name: resource.subscriptionName
name: resource.subscriptionName || ''
},
tenant: resource.tenantId,
resourceGroup: resource.resourceGroup

View File

@@ -31,7 +31,7 @@ export class KustoResourceService extends ResourceServiceBase<KustoGraphData, az
defaultDatabaseName: '',
subscription: {
id: resource.subscriptionId,
name: resource.subscriptionName
name: resource.subscriptionName || ''
},
tenant: resource.tenantId,
resourceGroup: resource.resourceGroup

View File

@@ -33,7 +33,7 @@ export class MysqlFlexibleServerService extends ResourceServiceBase<DbServerGrap
tenant: resource.tenantId,
subscription: {
id: resource.subscriptionId,
name: resource.subscriptionName
name: resource.subscriptionName || ''
},
resourceGroup: resource.resourceGroup
};

View File

@@ -29,7 +29,7 @@ export class PostgresServerArcService extends ResourceServiceBase<PostgresArcSer
defaultDatabaseName: 'postgres',
subscription: {
id: resource.subscriptionId,
name: resource.subscriptionName
name: resource.subscriptionName || ''
},
tenant: resource.tenantId,
resourceGroup: resource.resourceGroup

View File

@@ -32,7 +32,7 @@ export class PostgresServerService extends ResourceServiceBase<DbServerGraphData
defaultDatabaseName: 'postgres',
subscription: {
id: resource.subscriptionId,
name: resource.subscriptionName
name: resource.subscriptionName || ''
},
tenant: resource.tenantId,
resourceGroup: resource.resourceGroup

View File

@@ -19,7 +19,7 @@ export class AzureResourceGroupService extends ResourceServiceBase<DbServerGraph
name: resource.name,
subscription: {
id: resource.subscriptionId,
name: resource.subscriptionName
name: resource.subscriptionName || ''
},
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[]> {
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 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) => {
if (!ids.has(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);
convertedResources.push(converted);
}

View File

@@ -30,7 +30,7 @@ export class SqlInstanceResourceService extends ResourceServiceBase<SqlInstanceG
defaultDatabaseName: 'master',
subscription: {
id: resource.subscriptionId,
name: resource.subscriptionName
name: resource.subscriptionName || ''
},
tenant: resource.tenantId,
resourceGroup: resource.resourceGroup

View File

@@ -29,7 +29,7 @@ export class SqlInstanceArcResourceService extends ResourceServiceBase<SqlInstan
defaultDatabaseName: 'master',
subscription: {
id: resource.subscriptionId,
name: resource.subscriptionName
name: resource.subscriptionName || ''
},
tenant: resource.tenantId,
resourceGroup: resource.resourceGroup

View File

@@ -60,20 +60,20 @@ export class AzureResourceResourceTreeNode extends TreeNode {
const treeItem = this.resourceNodeWithProviderId.resourceNode.treeItem;
return {
label: <any>treeItem.label,
label: typeof treeItem.label === 'object' ? treeItem.label.label : treeItem.label || '',
isLeaf: treeItem.collapsibleState === TreeItemCollapsibleState.None ? true : false,
errorMessage: undefined,
metadata: undefined,
nodePath: this.generateNodePath(),
nodeStatus: undefined,
nodeType: treeItem.contextValue,
nodeType: treeItem.contextValue || '',
nodeSubType: undefined,
iconType: treeItem.contextValue
};
}
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 {
public constructor(
context: ExtensionContext
) {
this._context = context;
}
private _context: ExtensionContext
) { }
public generateKey(id: string): string {
return `${AzureResourceCacheService.cacheKeyPrefix}.${id}`;
@@ -26,7 +24,5 @@ export class AzureResourceCacheService implements IAzureResourceCacheService {
await this._context.workspaceState.update(key, value);
}
private _context: ExtensionContext = undefined;
private static readonly cacheKeyPrefix = 'azure.resource.cache';
}

View File

@@ -11,11 +11,11 @@ interface AzureResourceSelectedSubscriptionsCache {
}
export class AzureResourceSubscriptionFilterService implements IAzureResourceSubscriptionFilterService {
public constructor(
cacheService: IAzureResourceCacheService
) {
this._cacheService = cacheService;
private _cacheKey: string;
public constructor(
private _cacheService: IAzureResourceCacheService
) {
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}`));
}
}
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();
subscriptions.push(...newSubs.map(newSub => {
return {
id: newSub.subscriptionId,
name: newSub.displayName,
id: newSub.subscriptionId || '',
name: newSub.displayName || '',
tenant: tenantId
};
}));

View File

@@ -36,7 +36,7 @@ const handleNeverUsed = async (): Promise<void> => {
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'));
}
};
@@ -50,6 +50,9 @@ export class AzureTerminalService implements IAzureTerminalService {
public async getOrCreateCloudConsole(account: AzureAccount, tenant: Tenant): Promise<void> {
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 = {
headers: {
'Accept': 'application/json',
@@ -76,7 +79,7 @@ export class AzureTerminalService implements IAzureTerminalService {
const consoleRequestUri = this.getConsoleRequestUri(metadata.settings.armResource.endpoint);
if (preferredLocation) {
settings.headers['x-ms-console-preferred-location'] = preferredLocation;
settings.headers!['x-ms-console-preferred-location'] = preferredLocation;
}
let provisionResult: AxiosResponse<any>;
@@ -143,9 +146,9 @@ class AzureTerminal implements vscode.Pseudoterminal {
private readonly writeEmitter: vscode.EventEmitter<string>;
public readonly onDidWrite: vscode.Event<string>;
private socket: WS;
private intervalTimer: NodeJS.Timer;
private terminalDimensions: vscode.TerminalDimensions;
private socket: WS | undefined = undefined;
private intervalTimer: NodeJS.Timer | undefined = undefined;
private terminalDimensions: vscode.TerminalDimensions | undefined;
constructor(private readonly consoleUri: string, private readonly token: string, private shell: string) {
this.writeEmitter = new vscode.EventEmitter<string>();
@@ -209,7 +212,7 @@ class AzureTerminal implements vscode.Pseudoterminal {
// Keep alives
this.intervalTimer = setInterval(() => {
this.socket.ping();
this.socket?.ping();
}, 5000);
} catch (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>;
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: {
'Accept': 'application/json',
'Content-Type': 'application/json',
@@ -228,7 +234,7 @@ class AzureTerminal implements vscode.Pseudoterminal {
}
});
} catch (ex) {
console.log(ex, ex.response);
console.log(`Error establishing terminal. ${ex}, ${ex.response}`);
await handleNeverUsed();
return undefined;
}