Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upgrade 1.30.x to 1.33.x #27

Closed
wants to merge 169 commits into from
Closed

Upgrade 1.30.x to 1.33.x #27

wants to merge 169 commits into from

Conversation

aman-agrawal
Copy link
Collaborator

@aman-agrawal aman-agrawal commented May 23, 2024

Jira : https://devopsmx.atlassian.net/browse/OP-22085
Testing : Compile success, No new TCs failed bcoz of this change, deployed to ns=cvetarget aman1603/echo:23may1 - cron trigger worked fine, echo logs are clean.
Note :
All commits covered - verified from sheet.
Will add/modify echo code wrt final kork & fiat versions publish (if required). This code works with fiatVersion=1-0-SNAPSHOT & korkVersion=1-0-SNAPSHOT
Will not merge it to OES-1.30.1, will create separate branch OES-1.33.x. This is done just to compare the code.

spinnakerbot and others added 30 commits February 20, 2023 19:52
Co-authored-by: root <root@447a079020df>
Co-authored-by: root <root@d357836a74e2>
Co-authored-by: root <root@ddd9a40eca8a>
…ases over junit5 and cleanup of useJUnitPlatform() from sub-modules in echo (spinnaker#1266)

Spring boot 2.4.x removed JUnit5 vintage engine from spring-boot-starter-test.
[https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.4-Release-Notes#junit-5s-vintage-engine-removed-from-spring-boot-starter-test]
It is required for executing junit4 based test cases in echo.
So, introducing junit-vintage-engine dependency in build.gradle, using testRuntimeOnly() as suggested in section 3.1 of https://junit.org/junit5/docs/5.6.2/user-guide/index.pdf

After applying this fix, coverage increased from 533 to 535 test case executions.

Clean up the call for test engines using `useJUnitPlatform()` from sub-modules, and placing it in build.gradle. As per the gradle docs, all test engines on the test runtime classpath will be used by sub modules.
https://docs.gradle.org/6.8.1/userguide/java_testing.html#filtering_test_engine

Encountered below error with `gradle :echo-web:test --tests "com.netflix.spinnaker.echo.ApplicationSpec.startupTest"` and similar error with `gradle :echo-web:test --tests "com.netflix.spinnaker.echo.telemetry.TelemetrySpec.telemetryDownEchoStillHealthyTest"' test execution:
```
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2023-03-13 22:26:53.554 ERROR 60447 --- [    Test worker] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'pipelineTriggerJob' defined in URL [jar:file:/echo/echo-scheduler/build/libs/echo-scheduler.jar!/com/netflix/spinnaker/echo/scheduler/actions/pipeline/PipelineTriggerJob.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'pipelineInitiator' defined in URL [jar:file:/echo/echo-pipelinetriggers/build/libs/echo-pipelinetriggers.jar!/com/netflix/spinnaker/echo/pipelinetriggers/orca/PipelineInitiator.class]: Unsatisfied dependency expressed through constructor parameter 2; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'fiatPermissionEvaluator' defined in URL [jar:file:/.gradle/caches/modules-2/files-2.1/io.spinnaker.fiat/fiat-api/1.36.0/f491739bbb725f377af0e49136c948964ff25827/fiat-api-1.36.0.jar!/com/netflix/spinnaker/fiat/shared/FiatPermissionEvaluator.class]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'fiatService' defined in class path resource [com/netflix/spinnaker/fiat/shared/FiatAuthenticationConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.netflix.spinnaker.fiat.shared.FiatService]: Factory method 'fiatService' threw exception; nested exception is java.lang.NullPointerException
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) ~[spring-beans-5.3.13.jar:5.3.13]
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) ~[spring-beans-5.3.13.jar:5.3.13]

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'pipelineInitiator' defined in URL [jar:file:/echo/echo-pipelinetriggers/build/libs/echo-pipelinetriggers.jar!/com/netflix/spinnaker/echo/pipelinetriggers/orca/PipelineInitiator.class]: Unsatisfied dependency expressed through constructor parameter 2; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'fiatPermissionEvaluator' defined in URL [jar:file:/.gradle/caches/modules-2/files-2.1/io.spinnaker.fiat/fiat-api/1.36.0/f491739bbb725f377af0e49136c948964ff25827/fiat-api-1.36.0.jar!/com/netflix/spinnaker/fiat/shared/FiatPermissionEvaluator.class]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'fiatService' defined in class path resource [com/netflix/spinnaker/fiat/shared/FiatAuthenticationConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.netflix.spinnaker.fiat.shared.FiatService]: Factory method 'fiatService' threw exception; nested exception is java.lang.NullPointerException
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) ~[spring-beans-5.3.13.jar:5.3.13]
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) ~[spring-beans-5.3.13.jar:5.3.13]

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'fiatPermissionEvaluator' defined in URL [jar:file:/.gradle/caches/modules-2/files-2.1/io.spinnaker.fiat/fiat-api/1.36.0/f491739bbb725f377af0e49136c948964ff25827/fiat-api-1.36.0.jar!/com/netflix/spinnaker/fiat/shared/FiatPermissionEvaluator.class]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'fiatService' defined in class path resource [com/netflix/spinnaker/fiat/shared/FiatAuthenticationConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.netflix.spinnaker.fiat.shared.FiatService]: Factory method 'fiatService' threw exception; nested exception is java.lang.NullPointerException
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) ~[spring-beans-5.3.13.jar:5.3.13]
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) ~[spring-beans-5.3.13.jar:5.3.13]

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'fiatService' defined in class path resource [com/netflix/spinnaker/fiat/shared/FiatAuthenticationConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.netflix.spinnaker.fiat.shared.FiatService]: Factory method 'fiatService' threw exception; nested exception is java.lang.NullPointerException
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) ~[spring-beans-5.3.13.jar:5.3.13]
	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:638) ~[spring-beans-5.3.13.jar:5.3.13]

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.netflix.spinnaker.fiat.shared.FiatService]: Factory method 'fiatService' threw exception; nested exception is java.lang.NullPointerException
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.3.13.jar:5.3.13]
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-5.3.13.jar:5.3.13]
	... 153 common frames omitted
Caused by: java.lang.NullPointerException: null
	at java.base/java.util.Objects.requireNonNull(Objects.java:221) ~[na:na]
	at com.netflix.spinnaker.config.DefaultServiceEndpoint.<init>(DefaultServiceEndpoint.java:82) ~[kork-web-7.167.0.jar:7.167.0]
	at com.netflix.spinnaker.config.DefaultServiceEndpoint.<init>(DefaultServiceEndpoint.java:59) ~[kork-web-7.167.0.jar:7.167.0]
	at com.netflix.spinnaker.config.DefaultServiceEndpoint.<init>(DefaultServiceEndpoint.java:55) ~[kork-web-7.167.0.jar:7.167.0]
	at com.netflix.spinnaker.fiat.shared.FiatAuthenticationConfig.fiatService(FiatAuthenticationConfig.java:77) ~[fiat-api-1.36.0.jar:1.36.0]
 ```
 Fix the issue by adding mock bean for FiatService.
Co-authored-by: root <root@c4be0877baae>
Co-authored-by: root <root@678a4f9afbf2>
Co-authored-by: root <root@ca4d9d1417e6>
Co-authored-by: root <root@1087c434d482>
Co-authored-by: root <root@a7f63fd249e6>
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 2 to 4.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](docker/build-push-action@v2...v4)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
)

Bumps [google-github-actions/auth](https://github.com/google-github-actions/auth) from 0 to 1.
- [Release notes](https://github.com/google-github-actions/auth/releases)
- [Changelog](https://github.com/google-github-actions/auth/blob/main/CHANGELOG.md)
- [Commits](google-github-actions/auth@v0...v1)

---
updated-dependencies:
- dependency-name: google-github-actions/auth
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…o 1 (spinnaker#1278)

Bumps [google-github-actions/upload-cloud-storage](https://github.com/google-github-actions/upload-cloud-storage) from 0 to 1.
- [Release notes](https://github.com/google-github-actions/upload-cloud-storage/releases)
- [Changelog](https://github.com/google-github-actions/upload-cloud-storage/blob/main/CHANGELOG.md)
- [Commits](google-github-actions/upload-cloud-storage@v0...v1)

---
updated-dependencies:
- dependency-name: google-github-actions/upload-cloud-storage
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Bumps [actions/setup-java](https://github.com/actions/setup-java) from 2 to 3.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](actions/setup-java@v2...v3)

---
updated-dependencies:
- dependency-name: actions/setup-java
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v2...v3)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…iles (spinnaker#1284)

to avoid warning messages like

Run echo ::set-output name=REPO::${GITHUB_REPOSITORY##*/}
Warning: The `set-output` command is deprecated and will be disabled soon. Please upgrade to using Environment Files. For more information see: https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/
Warning: The `set-output` command is deprecated and will be disabled soon. Please upgrade to using Environment Files. For more information see: https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/
Co-authored-by: root <root@6df01364f536>
Co-authored-by: root <root@3e028cce7c94>
Co-authored-by: root <root@9719ce3424b9>
Co-authored-by: root <root@0655c5db933b>
…ggers of specific types (spinnaker#1292)

* refactor(pipelinetriggers): add PipelineCacheConfigurationProperties class

to remove a @value annotation, and to pave the way for additional config properties

* feat(pipelinetriggers): only cache enabled pipelines with enabled triggers of specific types

when pipelineCache.filterFront50Pipelines is true.  Determine the specific types from the
types that the available BaseTriggerEventHandler beans support, with cron triggers as
well. Adjust the logic in ManualEventHandler to work when the cache only contains a subset
of pipelines.

When pipelineCache.filterFront50Pipelines is false, retain the current behavior to query
front50 for all pipelines.

Note that both before and after this change, when ManualEventHandler gets a pipeline from the
cache, it queries front50 for a single pipeline by id to make sure what it's triggering is
up to date.  As currently implemented, front50 queries its database by id to generate the
response.

Currently, deck triggers by pipeline application + name.  See for example
https://github.com/spinnaker/deck/blob/8abafe5c6a6680953aef7752b1a56cac093ec9ba/packages/core/src/pipeline/executions/executionGroup/ExecutionGroup.tsx#L138
and
https://github.com/spinnaker/deck/blob/8abafe5c6a6680953aef7752b1a56cac093ec9ba/packages/core/src/domain/IPipeline.ts#L86

With this PR, ManualEventHandler now queries a new endpoint in front50 by application and
name when there's no cached pipeline corresponding to a trigger.  Front50's database query
in this case is likely slightly more expensive that querying by id, but not enough to be
significant, especially since we're dealing with human-initiated events.

If the query by application and name fails, ManualEventTrigger then queries by pipeline
id, so triggers by pipeline id (if there are any) are less performant than before as they
involve another round trip to front50 to query by application and name first.

It does seem feasible, though not totally trivial, to change deck to trigger manual
execution by pipeline id.  If this happens, it would make sense to change the order of
queries in ManualEventHandler to query by id first.  That would restore the performance of
manual execution by deck what it was before this PR.
Co-authored-by: root <root@63d86d5636ba>
Co-authored-by: root <root@f1cbd44bf3d1>
Co-authored-by: root <root@636fee72d08c>
Co-authored-by: root <root@c4ba54b4ec41>
Co-authored-by: root <root@92f374466e67>
Copy link
Collaborator

Choose a reason for hiding this comment

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

pinned versions

Copy link
Collaborator

Choose a reason for hiding this comment

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

pinned versions

testImplementation(project(":echo-web"))
testImplementation(project(":echo-core"))

testImplementation("io.spinnaker.kork:kork-plugins")
testImplementation("io.spinnaker.kork:kork-plugins-tck")

testRuntimeOnly("org.junit.platform:junit-platform-launcher")
Copy link
Collaborator

Choose a reason for hiding this comment

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

this dep is present in oes 1.31.1 but removed in oss 1.33

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

afaik :
org.junit.platform:junit-platform-launcher supports not only JUnit 5 tests but also tests written in other frameworks like JUnit 4, TestNG, etc.
org.junit.jupiter:junit-jupiter-engine is the test engine for executing tests written using JUnit 5 (JUnit Jupiter)

but when i checked the kotlin UT within echo-plugins-test, i find that it doesnt require any of it
any suggestions ?

Copy link
Collaborator

Choose a reason for hiding this comment

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

pinned versions

Copy link
Collaborator

Choose a reason for hiding this comment

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

pinned versions

Copy link
Collaborator

Choose a reason for hiding this comment

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

pinned versions

Copy link
Collaborator

Choose a reason for hiding this comment

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

pinned versions

Copy link
Collaborator

Choose a reason for hiding this comment

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

pinned versions


implementation "com.netflix.spectator:spectator-api"
implementation "io.spinnaker.kork:kork-artifacts"
implementation "io.spinnaker.kork:kork-sql"

if (!rootProject.hasProperty("excludeSqlDrivers")) {
runtimeOnly "mysql:mysql-connector-java"
runtimeOnly "com.mysql:mysql-connector-j"
Copy link
Collaborator

Choose a reason for hiding this comment

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

we do not have com.mysql:mysql-connector-j in both OES 1.30.1 and OSS 1.33. We have changed this to fix MySQL issues.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

right : ref

Copy link
Collaborator

Choose a reason for hiding this comment

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

pinned versions

Copy link
Collaborator

Choose a reason for hiding this comment

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

pinned versions

Copy link
Collaborator

Choose a reason for hiding this comment

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

pinned versions

@@ -54,7 +58,7 @@ dependencies {
}

runtimeOnly "io.spinnaker.kork:kork-runtime"

implementation("com.mysql:mysql-connector-j")
Copy link
Collaborator

Choose a reason for hiding this comment

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

we do not have this com.mysql:mysql-connector-j in OSS 1.33

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Copy link
Collaborator

Choose a reason for hiding this comment

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

pinned versions

implementation "org.springframework.boot:spring-boot-starter-validation"
implementation "io.cloudevents:cloudevents-spring:2.5.0"
implementation "io.cloudevents:cloudevents-json-jackson:2.5.0"
implementation "io.cloudevents:cloudevents-http-basic:2.5.0"
Copy link
Collaborator

Choose a reason for hiding this comment

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

32 to 34 are not in OES 1.30.1 but in OSS 1.33

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

new feature : spinnaker#1290

@@ -22,8 +36,6 @@
}
}

enableFeaturePreview("VERSION_ORDERING_V2")
Copy link
Collaborator

Choose a reason for hiding this comment

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

the above is not removed in OES 1.30.1 but it is removed in OSS 1.33

Copy link
Collaborator Author

@aman-agrawal aman-agrawal Jun 7, 2024

Choose a reason for hiding this comment

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

This ordering will be enabled by default in Gradle 7.0. Thats why removed it. ref

Copy link
Collaborator

@rahul-chekuri rahul-chekuri left a comment

Choose a reason for hiding this comment

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

There are some changes that are not in OES 1.30.1 but in OSS 1.33 so highlighted those as part of comments. Also, pinned versions were flagged for future cleanups.

During cleanup, not only mentioned pinned versions will be cleaned but also every dependency should be checked for scope of cleaning. Will do this cleanup as separate activity in different PR.


testRuntimeOnly("org.junit.platform:junit-platform-launcher")
Copy link
Collaborator

Choose a reason for hiding this comment

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

testRuntimeOnly("org.junit.platform:junit-platform-launcher") expected to remove ?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

yes, as we have testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine") for running tests.

Copy link
Collaborator

Choose a reason for hiding this comment

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

ok Thanks

@@ -19,8 +19,10 @@ dependencies {
implementation project(':echo-model')
implementation "com.squareup.retrofit:retrofit"
implementation "com.squareup.retrofit:converter-jackson"
implementation "com.jakewharton.retrofit:retrofit1-okhttp3-client:1.1.0"
Copy link
Collaborator

Choose a reason for hiding this comment

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

version specified for the package in 1.30.x, should go with this version right?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Reason to remove explicit version : ref
kork-oes also pointed to same version. checked dI, 1.1.0 is coming.

Copy link
Collaborator

Choose a reason for hiding this comment

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

ok. good

implementation "com.squareup.retrofit:retrofit"
implementation "com.squareup.retrofit:converter-jackson"
implementation "com.jakewharton.retrofit:retrofit1-okhttp3-client:1.1.0"
Copy link
Collaborator

Choose a reason for hiding this comment

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

package com.jakewharton.retrofit:retrofit1-okhttp3-client version needs to taken from 1.30.x , right?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Reason to remove explicit version : ref
kork-oes also pointed to same version. checked dI, 1.1.0 is coming.

Copy link
Collaborator

Choose a reason for hiding this comment

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

ok. good

@meerajose
Copy link
Collaborator

All commits are present.
Addressed comments.
gradle versions are verified.
approved

Copy link
Collaborator

@meerajose meerajose left a comment

Choose a reason for hiding this comment

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

approved


class EmailNotificationServiceSpec extends Specification {

class EmailNotificationServiceSpec { /*extends Specification
Copy link
Collaborator

Choose a reason for hiding this comment

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

Please un-comment this test and make it work.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

#30


@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = {Application.class})
/*@ExtendWith(SpringExtension.class)
Copy link
Collaborator

Choose a reason for hiding this comment

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

Plz clean the commented part from the code.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

#30

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.