Skip to content
This repository has been archived by the owner on Mar 25, 2023. It is now read-only.

Commit

Permalink
Merge 4b810ea into 8eb44a4
Browse files Browse the repository at this point in the history
  • Loading branch information
Vladimir Shakhov committed Oct 9, 2018
2 parents 8eb44a4 + 4b810ea commit 4d57f8a
Show file tree
Hide file tree
Showing 19 changed files with 104 additions and 84 deletions.
6 changes: 3 additions & 3 deletions src/app/reducers/security-groups/redux/sg.actions.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Action } from '@ngrx/store';
import { SecurityGroup } from '../../../security-group/sg.model';
import { SecurityGroup, SecurityGroupNative } from '../../../security-group/sg.model';
import { SecurityGroupCreationParams } from '../../../security-group/sg-creation/security-group-creation.component';
import { VirtualMachine } from '../../../vm/shared/vm.model';

Expand Down Expand Up @@ -115,14 +115,14 @@ export class DeleteSecurityGroupError implements Action {
export class ConvertSecurityGroup implements Action {
readonly type = CONVERT_SECURITY_GROUP;

constructor(readonly payload: SecurityGroup) {
constructor(readonly payload: SecurityGroupNative) {
}
}

export class ConvertSecurityGroupSuccess implements Action {
readonly type = CONVERT_SECURITY_GROUP_SUCCESS;

constructor(readonly payload: SecurityGroup) {
constructor(readonly payload: SecurityGroupNative) {
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/app/reducers/security-groups/redux/sg.effects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ export class SecurityGroupEffects {
const message = 'NOTIFICATIONS.FIREWALL.CONVERT_PRIVATE_TO_SHARED_DONE';
this.showNotificationsOnFinish(message);
}),
map((response: SecurityGroup) => {
map(response => {
return new securityGroupActions.ConvertSecurityGroupSuccess(response);
}),
catchError(error => {
Expand Down
28 changes: 22 additions & 6 deletions src/app/reducers/security-groups/redux/sg.reducers.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
import { createEntityAdapter, EntityAdapter, EntityState } from '@ngrx/entity';
import { createFeatureSelector, createSelector } from '@ngrx/store';
import { SecurityGroupViewMode } from '../../../security-group/sg-view-mode';
import { getType, isDefaultSecurityGroup, SecurityGroup, SecurityGroupType } from '../../../security-group/sg.model';
import {
getType,
isDefaultSecurityGroup,
isSecurityGroupNative,
SecurityGroup,
SecurityGroupType
} from '../../../security-group/sg.model';

import * as fromAccounts from '../../accounts/redux/accounts.reducers';
import * as fromAuth from '../../auth/redux/auth.reducers';
Expand Down Expand Up @@ -243,9 +249,11 @@ export const selectFilteredSecurityGroups = createSelector(
}
};

const isOrphan = (group: SecurityGroup) => filter.selectOrphanSG && mode === SecurityGroupViewMode.Private
? group.virtualmachineids.length === 0
: true;
const isOrphan = (group: SecurityGroup) => (
filter.selectOrphanSG
&& mode === SecurityGroupViewMode.Private
&& isSecurityGroupNative(group)
) ? group.virtualmachineids.length === 0 : true;

const renameDefaultSG = (securityGroup: SecurityGroup) => {
return isDefaultSecurityGroup(securityGroup) ? {...securityGroup, name: defaultSecurityGroupName} : securityGroup;
Expand All @@ -264,7 +272,11 @@ export const selectSecurityGroupsForVmCreation = createSelector(
fromAuth.getUserAccount,
selectDefaultSecurityGroupName,
(securityGroups, account, defaultSecurityGroupName) => {
const accountFilter = (securityGroup: SecurityGroup) => account && securityGroup.account === account.name;
const accountFilter = (securityGroup: SecurityGroup) => (
account
&& isSecurityGroupNative(securityGroup)
&& securityGroup.account === account.name
);
const onlySharedFilter = (securityGroup: SecurityGroup) =>
getType(securityGroup) === SecurityGroupType.Shared;
const renameDefaultSG = (securityGroup: SecurityGroup) => {
Expand All @@ -286,6 +298,10 @@ export const selectDefaultSecurityGroup = createSelector(
selectDefaultSecurityGroupName,
fromAuth.getUserAccount,
(securityGroups, defaultSecurityGroupName, user) => {
const defaultGroup = securityGroups.find((sg: SecurityGroup) => sg.account === user.name && sg.name === 'default');
const defaultGroup = securityGroups.find((sg: SecurityGroup) => (
isSecurityGroupNative(sg)
&& sg.account === user.name
&& sg.name === 'default'
));
return { ...defaultGroup, name: defaultSecurityGroupName };
});
4 changes: 2 additions & 2 deletions src/app/security-group/containers/sg-actions.container.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { Observable, of } from 'rxjs';

import { State } from '../../reducers';
import * as securityGroupActions from '../../reducers/security-groups/redux/sg.actions';
import { SecurityGroup } from '../sg.model';
import { SecurityGroup, SecurityGroupNative } from '../sg.model';

@Component({
selector: 'cs-security-group-actions-container',
Expand Down Expand Up @@ -39,7 +39,7 @@ export class SecurityGroupActionsContainerComponent {
return of(securityGroup);
}

public onSecurityGroupConvert(securityGroup: SecurityGroup) {
public onSecurityGroupConvert(securityGroup: SecurityGroupNative) {
this.store.dispatch(new securityGroupActions.ConvertSecurityGroup(securityGroup));
}
}
20 changes: 16 additions & 4 deletions src/app/security-group/containers/sg-tags.container.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { take } from 'rxjs/operators';
import { State } from '../../reducers';
import { Tag } from '../../shared/models';
import { KeyValuePair, TagEditAction } from '../../tags/tags-view/tags-view.component';
import { SecurityGroup } from '../sg.model';
import { isSecurityGroupNative, SecurityGroup, SecurityGroupNative } from '../sg.model';
import * as fromSecurityGroups from '../../reducers/security-groups/redux/sg.reducers';
import * as sgActions from '../../reducers/security-groups/redux/sg.actions';

Expand All @@ -27,7 +27,11 @@ export class SecurityGroupTagsContainerComponent {
}

public editTag(tagEditAction: TagEditAction) {
this.sg$.pipe(take(1)).subscribe((sg: SecurityGroup) => {
this.sg$.pipe(take(1)).subscribe(sg => {
if (!isSecurityGroupNative(sg)) {
throw new Error('Can not edit tag of a predefined group');
}

const newTag: Tag = {
resourceid: sg.id,
resourcetype: 'SecurityGroup',
Expand All @@ -45,14 +49,22 @@ export class SecurityGroupTagsContainerComponent {
}

public deleteTag(tag: Tag) {
this.sg$.pipe(take(1)).subscribe((sg: SecurityGroup) => {
this.sg$.pipe(take(1)).subscribe(sg => {
if (!isSecurityGroupNative(sg)) {
throw new Error('Can not delete tag of a predefined group');
}

const newTags = sg.tags.filter(_ => tag.key !== _.key);
this.store.dispatch(new sgActions.UpdateSecurityGroup({ ...sg, tags: newTags }));
});
}

public addTag(keyValuePair: KeyValuePair) {
this.sg$.pipe(take(1)).subscribe((sg: SecurityGroup) => {
this.sg$.pipe(take(1)).subscribe(sg => {
if (!isSecurityGroupNative(sg)) {
throw new Error('Can not add tag to a predefined group');
}

const newTag = {
resourceid: sg.id,
resourcetype: 'SecurityGroup',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@ import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';

import { SecurityGroupCreationService } from './security-group-creation.service';
import { SecurityGroup } from '../../sg.model';
import { SecurityGroupNative } from '../../sg.model';


@Injectable()
export class PrivateSecurityGroupCreationService extends SecurityGroupCreationService {
protected securityGroupCreationPostAction(securityGroup: SecurityGroup): Observable<SecurityGroup> {
protected securityGroupCreationPostAction(securityGroup: SecurityGroupNative): Observable<SecurityGroupNative> {
return this.securityGroupTagService.markAsPrivate(securityGroup);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@ import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';

import { SecurityGroupCreationService } from './security-group-creation.service';
import { SecurityGroup } from '../../sg.model';
import { SecurityGroupNative } from '../../sg.model';


@Injectable()
export class TemplateSecurityGroupCreationService extends SecurityGroupCreationService {
protected securityGroupCreationPostAction(securityGroup: SecurityGroup): Observable<SecurityGroup> {
protected securityGroupCreationPostAction(securityGroup: SecurityGroupNative): Observable<SecurityGroupNative> {
return this.securityGroupTagService.markAsTemplate(securityGroup);
}
}
4 changes: 2 additions & 2 deletions src/app/security-group/services/security-group.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { Rules } from '../../shared/components/security-group-builder/rules';
import { BackendResource } from '../../shared/decorators';
import { BaseBackendService } from '../../shared/services/base-backend.service';
import { SecurityGroupTagService } from '../../shared/services/tags/security-group-tag.service';
import { SecurityGroup } from '../sg.model';
import { SecurityGroup, SecurityGroupNative } from '../sg.model';
import { PrivateSecurityGroupCreationService } from './creation-services/private-security-group-creation.service';
import { SharedSecurityGroupCreationService } from './creation-services/shared-security-group-creation.service';
import { TemplateSecurityGroupCreationService } from './creation-services/template-security-group-creation.service';
Expand Down Expand Up @@ -51,7 +51,7 @@ export class SecurityGroupService extends BaseBackendService<SecurityGroup> {
}));
}

public markForRemoval(securityGroup: SecurityGroup): Observable<any> {
public markForRemoval(securityGroup: SecurityGroupNative): Observable<SecurityGroupNative> {
return this.securityGroupTagService.markForRemoval(securityGroup);
}
}
13 changes: 8 additions & 5 deletions src/app/security-group/sg-actions/sg-action.service.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { getType, SecurityGroup, SecurityGroupType } from '../sg.model';
import { getType, isSecurityGroupNative, SecurityGroup, SecurityGroupType } from '../sg.model';
import { Action } from '../../shared/models';

export enum SecurityGroupActionType {
Expand All @@ -15,14 +15,17 @@ const SecurityGroupConvertAction = {
canActivate: () => true
};

const doesGroupHaveNoVirtualMachines = (securityGroup: SecurityGroup) => (
isSecurityGroupNative(securityGroup) &&
securityGroup.virtualmachineids.length === 0
);

const SecurityGroupDeleteAction = {
name: 'COMMON.DELETE',
command: SecurityGroupActionType.Delete,
icon: 'mdi-delete',
canShow: (securityGroup: SecurityGroup) =>
getType(securityGroup) !== SecurityGroupType.PredefinedTemplate && securityGroup.virtualmachineids.length === 0,
canActivate: (securityGroup: SecurityGroup) =>
getType(securityGroup) !== SecurityGroupType.PredefinedTemplate && securityGroup.virtualmachineids.length === 0
canShow: doesGroupHaveNoVirtualMachines,
canActivate: doesGroupHaveNoVirtualMachines
};

const SecurityGroupShowRulesAction = {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
import { MatMenuTrigger } from '@angular/material';

import { getType, SecurityGroup } from '../sg.model';
import { getType, isSecurityGroupNative, SecurityGroup } from '../sg.model';
import { VirtualMachine } from '../../vm';
import { SecurityGroupViewMode } from '../sg-view-mode';
import { NgrxEntities } from '../../shared/interfaces';
Expand All @@ -17,6 +17,10 @@ export class SecurityGroupListItemComponent implements OnChanges {
public query: string;

public get sgVmName() {
if (!isSecurityGroupNative(this.item)) {
return '';
}

const vmId = this.item.virtualmachineids[0];
const vm = this.vmList[vmId];

Expand Down
4 changes: 2 additions & 2 deletions src/app/security-group/sg-rules/sg-rules.component.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@ import { MockTranslatePipe } from '../../../testutils/mocks/mock-translate.pipe.
import { MockTranslateService } from '../../../testutils/mocks/mock-translate.service.spec';
import { SnackBarService } from '../../core/services';
import { SecurityGroupService } from '../services/security-group.service';
import { IPVersion, NetworkRuleType, SecurityGroup } from '../sg.model';
import { IPVersion, NetworkRuleType, SecurityGroup, SecurityGroupTemplate } from '../sg.model';
import { SgRulesComponent } from './sg-rules.component';
import { NetworkProtocol } from '../network-rule.model';
import { NetworkRuleService } from '../services/network-rule.service';
import { DialogService } from '../../dialog/dialog-service/dialog.service';
import { LoadingDirective } from '../../shared/directives/loading.directive';

const securityGroupTemplates: Array<Object> = require(
const securityGroupTemplates: Array<SecurityGroupTemplate> = require(
'../../../testutils/mocks/model-services/fixtures/securityGroupTemplates.json');

@Injectable()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@ import { Component, Input } from '@angular/core';
import { DialogService } from '../../../dialog/dialog-service/dialog.service';
import { TagService } from '../../../shared/services/tags/tag.service';
import { TagsComponent } from '../../../tags/tags.component';
import { SecurityGroup } from '../../sg.model';
import { SecurityGroup, SecurityGroupNative } from '../../sg.model';


@Component({
selector: 'cs-sg-tags',
templateUrl: 'sg-tags.component.html'
})
export class SecurityGroupTagsComponent extends TagsComponent<SecurityGroup> {
@Input() public entity: SecurityGroup;
export class SecurityGroupTagsComponent extends TagsComponent<SecurityGroupNative> {
@Input() public entity: SecurityGroupNative;
public resourceType = 'SecurityGroup';

constructor(
Expand Down
24 changes: 19 additions & 5 deletions src/app/security-group/sg.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ export enum IPVersion {
ipv6 = 'ipv6'
}

export interface SecurityGroup {
export interface SecurityGroupNative {
id: string;
account: string;
description: string;
Expand All @@ -30,25 +30,39 @@ export interface SecurityGroup {
virtualmachinecount: number;
virtualmachineids: string[];
egressrule: NetworkRule[];
ingressrule: NetworkRule[]
ingressrule: NetworkRule[];
tags: Tag[];
preselected?: boolean; // used by custom templates, described in config
}

export const isCustomTemplate = (securityGroup: SecurityGroup) => {
export interface SecurityGroupTemplate {
id: string;
name: string;
description: string;
preselected?: boolean;
egressrule: NetworkRule[];
ingressrule: NetworkRule[]
}

export const isSecurityGroupNative = (sg: SecurityGroup): sg is SecurityGroupNative =>
((sg as SecurityGroupNative).tags) != null;

export type SecurityGroup = SecurityGroupNative | SecurityGroupTemplate;

export const isCustomTemplate = (securityGroup: SecurityGroupNative) => {
const typeTag = securityGroup.tags.find(tag => tag.key === SecurityGroupTagKeys.type);

return typeTag && typeTag.value === SecurityGroupType.CustomTemplate;
};

export const isPrivate = (securityGroup: SecurityGroup) => {
export const isPrivate = (securityGroup: SecurityGroupNative) => {
const typeTag = securityGroup.tags.find(tag => tag.key === SecurityGroupTagKeys.type);

return typeTag && typeTag.value === SecurityGroupType.Private;
};

export const getType = (securityGroup: SecurityGroup): SecurityGroupType => {
if (securityGroup.id.startsWith('template')) {
if (!isSecurityGroupNative(securityGroup)) {
return SecurityGroupType.PredefinedTemplate;
}

Expand Down
3 changes: 2 additions & 1 deletion src/app/shared/models/config/config.interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { CustomComputeOfferingHardwareValues } from './custom-compute-offering-h
import { DefaultComputeOffering } from './default-compute-offering.interface';
import { CustomComputeOfferingHardwareRestrictions } from './custom-compute-offering-hardware-restrictions.interface';
import { CustomComputeOfferingParameters } from './custom-compute-offering-parameters.interface';
import { SecurityGroupTemplate } from '../../../security-group/sg.model';

export interface CustomizableConfig {
/*
Expand All @@ -26,7 +27,7 @@ export interface CustomizableConfig {
/*
* Firewall (Security groups) settings
*/
securityGroupTemplates: Array<any>;
securityGroupTemplates: Array<SecurityGroupTemplate>;
defaultSecurityGroupName: { en: string, ru: string };
/*
* Images settings
Expand Down
2 changes: 1 addition & 1 deletion src/app/shared/services/tags/mark-for-removal.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const deletionMarkValue = 'removed';
export class MarkForRemovalService {
constructor(private tagService: TagService) {}

public markForRemoval(entity: Taggable): Observable<Taggable> {
public markForRemoval<T extends Taggable>(entity: T): Observable<T> {
return this.tagService.update(
entity,
entity.resourceType,
Expand Down

0 comments on commit 4d57f8a

Please sign in to comment.