Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
9d760b8
added isDevfilePresent function and associated tests
reginaelyse Aug 12, 2020
104badb
added devfile import form and tile, incorporated isDevfilePresent to …
reginaelyse Aug 12, 2020
0a2224e
removed devfile props from lazy loader
reginaelyse Aug 21, 2020
9626a0a
Removed validation for devfiles with dockerfileValidationSchema
reginaelyse Sep 1, 2020
cfd0be7
Removed error from previous commit
reginaelyse Sep 1, 2020
8013d74
Added beginnings of communication with backend
reginaelyse Sep 3, 2020
761935d
Added functions to detect if devfile is present & to get devfile content
reginaelyse Sep 8, 2020
a08a584
Added parser to get devfile version and logic to use version
reginaelyse Sep 8, 2020
bc01c23
start of new function to use devfile for building
reginaelyse Sep 8, 2020
eb127b1
rough code for createOrUpdateBuildResource
jaideepr97 Sep 9, 2020
b4ebb85
more guideline code
jaideepr97 Sep 9, 2020
260fd93
pending test of mock data
jaideepr97 Sep 10, 2020
b5eae9c
Merge pull request #10 from reginapizza/jd-addDevfile
reginaelyse Sep 10, 2020
9bbfb1f
removed promise return from devfileCreate
jaideepr97 Sep 10, 2020
f0478f9
fixed errors with devfileFlow
reginaelyse Sep 10, 2020
a1e5b33
Merge branch 'devfileBackendCommunication' of github.com:reginapizza/…
jaideepr97 Sep 11, 2020
4064c3d
solved merge conflicts from regina-devfile
jaideepr97 Sep 11, 2020
5f70552
mock build complete - need to revisit
jaideepr97 Sep 11, 2020
991337b
Merge pull request #12 from reginapizza/jd-addDevfile
reginaelyse Sep 11, 2020
a9a421b
adding SemVar function to compare versions
reginaelyse Sep 11, 2020
578c7cf
Merge pull request #13 from reginapizza/regina-devfile
reginaelyse Sep 11, 2020
eac06dd
code restructured, mock data done - pending bug fixes
jaideepr97 Sep 12, 2020
b1482d1
frontend works with mock data
jaideepr97 Sep 13, 2020
22373da
Merge pull request #14 from reginapizza/jd-addDevfile
reginaelyse Sep 14, 2020
2a81778
rebasing from upstream master
reginaelyse Sep 14, 2020
ce7114d
commented out metadata check that was removed in upstream
reginaelyse Sep 14, 2020
e96188a
Added new logo for devfile
reginaelyse Sep 14, 2020
63bf40e
Added dev preview badge on devfile import form
reginaelyse Sep 16, 2020
4623151
Fixed flow for edit application with devfile and devfile icon
reginaelyse Sep 17, 2020
377208c
removed comment
reginaelyse Sep 18, 2020
7294293
made builderImages a required field again
reginaelyse Sep 18, 2020
b457b48
Merge pull request #15 from reginapizza/devfileEditApp
reginaelyse Sep 18, 2020
097278d
added annotation for isDevfilePresent to use for edit application
reginaelyse Sep 22, 2020
0999bc2
fixing merge conflicts
reginaelyse Sep 22, 2020
72db3d1
WIP- successful push to registry but still can't edit
reginaelyse Sep 25, 2020
2434247
Vendor updates for api.
bigkevmcd Sep 25, 2020
e4f1f6c
fixed dependency issues, able to import openshift/api and build
jaideepr97 Sep 25, 2020
1241d21
attmepting pull from devfileBackendCommunication
jaideepr97 Sep 25, 2020
b5a783c
Merge pull request #16 from reginapizza/EditApplication
reginaelyse Sep 25, 2020
a38e8b8
import from devfile working with data coming from bridge
jaideepr97 Sep 25, 2020
54e8f25
Merge branch 'devfileBackendCommunication' of github.com:reginapizza/…
jaideepr97 Sep 25, 2020
55b426b
updated to support edit app redirect to import from devfile
jaideepr97 Sep 28, 2020
80dd462
figuring out service/route issue
jaideepr97 Sep 28, 2020
428c35f
fixed save button issue with mockdata frontend
jaideepr97 Sep 28, 2020
b986801
Merge pull request #17 from reginapizza/jd-odc-add-devfile
reginaelyse Sep 29, 2020
3dc2606
added comments and code cleanup
jaideepr97 Sep 29, 2020
413ae83
fixed service/route not showing up issue
jaideepr97 Sep 29, 2020
00ed4a3
merged from upstream
reginaelyse Sep 30, 2020
424d354
api addition and commenting out mocked data
reginaelyse Sep 30, 2020
f371d19
readding in jaideep's changes
reginaelyse Sep 30, 2020
930af0b
Merge branch 'master' of https://github.com/openshift/console into de…
reginaelyse Sep 30, 2020
feb1f20
removed mocked data from frontend- using backend mocked only
reginaelyse Sep 30, 2020
7054371
small code cleanup
reginaelyse Sep 30, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions cmd/bridge/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ const (

// Well-known location of the GitOps service. This is only accessible in-cluster
openshiftGitOpsHost = "cluster.openshift-pipelines-app-delivery.svc:8080"

// Well-known location of the GitOps service. This is only accessible in-cluster
openshiftDevfileParserHost = "cluster.openshift-pipelines-app-delivery.svc:8080"
)

func main() {
Expand Down
10 changes: 10 additions & 0 deletions frontend/packages/dev-console/src/actions/add-resources.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
OsImageIcon,
CatalogIcon,
CubeIcon,
LayerGroupIcon,
DatabaseIcon,
} from '@patternfly/react-icons';
import { ImportOptions } from '../components/import/import-types';
Expand Down Expand Up @@ -39,6 +40,13 @@ export const fromDockerfile = createKebabAction(
allImportResourceAccess,
);

export const fromDevfile = createKebabAction(
'From Devfile',
<LayerGroupIcon />,
ImportOptions.DEVFILE,
allImportResourceAccess,
);

export const fromDatabaseCatalog = createKebabAction(
'Database',
<DatabaseIcon />,
Expand All @@ -50,11 +58,13 @@ export const addResourceMenu: KebabAction[] = [
containerImage,
fromCatalog,
fromDockerfile,
fromDevfile,
fromDatabaseCatalog,
];

export const addResourceMenuWithoutCatalog: KebabAction[] = [
fromGit,
containerImage,
fromDockerfile,
fromDevfile,
];
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import GitSection from '../import/git/GitSection';
import BuilderSection from '../import/builder/BuilderSection';
import DockerSection from '../import/git/DockerSection';
import IconSection from '../import/section/IconSection';
import DevPreviewBadge from '@console/shared/src/components/badges/DevPreviewBadge';
import AdvancedSection from '../import/advanced/AdvancedSection';
import AppSection from '../import/app/AppSection';
import { NormalizedBuilderImages } from '../../utils/imagestream-utils';
Expand All @@ -34,10 +35,13 @@ const EditApplicationForm: React.FC<FormikProps<FormikValues> & EditApplicationF
appResources,
}) => (
<>
<PageHeading title={createFlowType} style={{ padding: '0px' }} />
{createFlowType === CreateApplicationFlow.Devfile
? <PageHeading title={createFlowType} style={{ padding: '0px' }} badge={<DevPreviewBadge />} />
: <PageHeading title={createFlowType} style={{ padding: '0px' }} />
}
<Form onSubmit={handleSubmit}>
{createFlowType !== CreateApplicationFlow.Container && (
<GitSection builderImages={builderImages} />
<GitSection buildStrategy={values.build.strategy} builderImages={builderImages} />
)}
{createFlowType === CreateApplicationFlow.Git && (
<BuilderSection image={values.image} builderImages={builderImages} />
Expand All @@ -48,7 +52,9 @@ const EditApplicationForm: React.FC<FormikProps<FormikValues> & EditApplicationF
{createFlowType === CreateApplicationFlow.Container && <ImageSearchSection />}
{createFlowType === CreateApplicationFlow.Container && <IconSection />}
<AppSection project={values.project} />
<AdvancedSection values={values} appResources={appResources} />
{createFlowType !== CreateApplicationFlow.Devfile && (
<AdvancedSection values={values} appResources={appResources} />
)}
<FormFooter
handleReset={handleReset}
errorMessage={status && status.submitError}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import { detectGitType } from '../import/import-validation-utils';
export enum CreateApplicationFlow {
Git = 'Import from Git',
Dockerfile = 'Import from Dockerfile',
Devfile = 'Import from Devfile',
Container = 'Deploy Image',
}

Expand All @@ -41,6 +42,8 @@ export const getPageHeading = (buildStrategy: string): string => {
return CreateApplicationFlow.Git;
case BuildStrategyType.Docker:
return CreateApplicationFlow.Dockerfile;
case BuildStrategyType.Devfile:
return CreateApplicationFlow.Devfile;
default:
return CreateApplicationFlow.Container;
}
Expand Down Expand Up @@ -108,7 +111,7 @@ export const getRouteData = (route: K8sResourceKind, resource: K8sResourceKind)
};

export const getBuildData = (buildConfig: K8sResourceKind, gitType: string) => {
const buildStrategyType = _.get(buildConfig, 'spec.strategy.type', '');
let buildStrategyType = _.get(buildConfig, 'spec.strategy.type', '');
let buildStrategyData;
switch (buildStrategyType) {
case BuildStrategyType.Source:
Expand All @@ -120,6 +123,10 @@ export const getBuildData = (buildConfig: K8sResourceKind, gitType: string) => {
default:
buildStrategyData = { env: [] };
}
if (buildConfig.metadata.annotations['isFromDevfile'] === "true") {
buildStrategyType = BuildStrategyType.Devfile;
// buildStrategyData = _.get(buildConfig, 'spec.strategy.dockerStrategy');
}
const triggers = _.get(buildConfig, 'spec.triggers');
const buildData = {
env: buildStrategyData.env || [],
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import * as React from 'react';
import * as _ from 'lodash';
import { Form } from '@patternfly/react-core';
import { FormikProps, FormikValues } from 'formik';
import { FormFooter } from '@console/shared/src/components/form-utils';
import { DevfileImportFormProps } from './import-types';
import GitSection from './git/GitSection';
import AppSection from './app/AppSection';

const DevfileImportForm: React.FC<FormikProps<FormikValues> & DevfileImportFormProps> = ({
values,
errors,
handleSubmit,
handleReset,
status,
builderImages,
isSubmitting,
dirty,
projects,
}) => (
<Form onSubmit={handleSubmit} data-test-id="import-devfile-form">
<GitSection buildStrategy= "Devfile" builderImages={builderImages}/>
<AppSection
project={values.project}
noProjectsAvailable={projects.loaded && _.isEmpty(projects.data)}
/>
<FormFooter
handleReset={handleReset}
errorMessage={status && status.submitError}
isSubmitting={isSubmitting}
submitLabel="Create"
sticky
disableSubmit={!dirty || !_.isEmpty(errors)}
resetLabel="Cancel"
/>
</Form>
);

export default DevfileImportForm;
24 changes: 22 additions & 2 deletions frontend/packages/dev-console/src/components/import/ImportPage.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import * as React from 'react';
import { RouteComponentProps } from 'react-router-dom';
import { Helmet } from 'react-helmet';
import { PageHeading, Firehose, FirehoseResource } from '@console/internal/components/utils';
import { PageHeading, Firehose, FirehoseResource, BuildStrategy } from '@console/internal/components/utils';
import DevPreviewBadge from '@console/shared/src/components/badges/DevPreviewBadge';
import { ImageStreamModel } from '@console/internal/models';
import { QUERY_PROPERTIES } from '../../const';
import NamespacedPage, { NamespacedPageVariants } from '../NamespacedPage';
Expand All @@ -26,6 +27,13 @@ const ImportFlows: { [name: string]: ImportData } = {
loader: () =>
import('./GitImportForm' /* webpackChunkName: "git-import-form" */).then((m) => m.default),
},
devfile: {
type: ImportTypes.devfile,
title: 'Import from devfile',
buildStrategy: 'Devfile',
loader: () =>
import('./DevfileImportForm' /* webpackChunkName: "devfile-import-form" */).then((m) => m.default),
},
s2i: {
type: ImportTypes.s2i,
title: 'Create Source-to-Image Application',
Expand Down Expand Up @@ -72,6 +80,15 @@ const ImportPage: React.FunctionComponent<ImportPageProps> = ({ match, location
isList: true,
},
];
} else if (importType === ImportTypes.devfile) {
importData = ImportFlows.devfile;
resources = [
{
kind: 'Project',
prop: 'projects',
isList: true,
},
];
} else {
importData = ImportFlows.git;
resources = [
Expand All @@ -96,7 +113,10 @@ const ImportPage: React.FunctionComponent<ImportPageProps> = ({ match, location
<Helmet>
<title>{importData.title}</title>
</Helmet>
<PageHeading title={importData.title} />
{ importType === ImportTypes.devfile
? <PageHeading title={importData.title} badge={<DevPreviewBadge />} />
: <PageHeading title={importData.title} />
}
<div className="co-m-pane__body" style={{ paddingBottom: 0 }}>
<Firehose resources={resources}>
<ImportForm
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
} from '@console/shared';
import { GitReadableTypes, GitTypes } from '../import-types';
import { detectGitType, detectGitRepoName } from '../import-validation-utils';
import { DevfileParser } from '@console/git-service/src/utils/devfile-parser';
import {
getSampleRepo,
getSampleRef,
Expand All @@ -23,10 +24,11 @@ import { UNASSIGNED_KEY, CREATE_APPLICATION_KEY } from '../../../const';

export interface GitSectionProps {
showSample?: boolean;
buildStrategy? : string
builderImages: NormalizedBuilderImages;
}

const GitSection: React.FC<GitSectionProps> = ({ showSample, builderImages }) => {
const GitSection: React.FC<GitSectionProps> = ({ showSample, buildStrategy, builderImages }) => {
const { values, setFieldValue, setFieldTouched, touched, dirty } = useFormikContext<
FormikValues
>();
Expand All @@ -50,11 +52,41 @@ const GitSection: React.FC<GitSectionProps> = ({ showSample, builderImages }) =>
setFieldValue('git.type', gitType);
setFieldValue('git.showGitType', showGitType);
showGitType && setFieldTouched('git.type', false);

const gitService = getGitService({ url, ref }, gitType as GitProvider);
const isReachable = gitService && (await gitService.isRepoReachable());
const isDevfilePresent = gitService && (await gitService.isDevfilePresent());
const DevfileContents = gitService && (await gitService.getDevfileContent());
const devfileParser = new DevfileParser(DevfileContents);

setFieldValue('git.isUrlValidating', false);
if (isReachable) {

if (buildStrategy === 'Devfile' ) {
if (isReachable && isDevfilePresent){
const DevfileVersion = await devfileParser.getDevfileVersion(DevfileContents)
const semver = require('semver')
if (semver.gte(DevfileVersion, '2.1.0')) {
gitRepoName && !values.name && setFieldValue('name', gitRepoName);
gitRepoName &&
!values.application.name &&
values.application.selectedKey !== UNASSIGNED_KEY &&
setFieldValue('application.name', `${gitRepoName}-app`);
setFieldValue('devfile.devfilePath', `${url}/devfile.yaml`)
setFieldValue('devfile.devfileContent', DevfileContents)
setValidated(ValidatedOptions.success);
}
else {
setValidated(ValidatedOptions.warning);
}
}
else if (isReachable && !isDevfilePresent){
setValidated(ValidatedOptions.warning);
}
else {
setValidated(ValidatedOptions.error);
}
}
else if (isReachable) {
setValidated(ValidatedOptions.success);
gitRepoName && !values.name && setFieldValue('name', gitRepoName);
gitRepoName &&
Expand Down Expand Up @@ -157,6 +189,9 @@ const GitSection: React.FC<GitSectionProps> = ({ showSample, builderImages }) =>
if (validated === ValidatedOptions.warning) {
return 'URL is valid but cannot be reached. If this is a private repository, enter a source secret in Advanced Git Options';
}
if (validated === ValidatedOptions.warning) {
return 'Valid URL but devfile build guidance not available.';
}
Comment on lines 189 to +194
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both these if conditions check for warning. Looks like the condition for not reachable should be an error looking at the logic above in this file

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Interesting, I'll have to validate the UI code once I move it over. I'm trying to close off the ticket I'm working on but clusters seem to be having some issues today. Good catch though.

return '';
};

Expand Down
Loading