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

Creating datalinks in Enso Cloud programmatically #9673

Closed
radeusgd opened this issue Apr 10, 2024 · 4 comments · Fixed by #9957
Closed

Creating datalinks in Enso Cloud programmatically #9673

radeusgd opened this issue Apr 10, 2024 · 4 comments · Fixed by #9957
Assignees
Labels
-libs Libraries: New libraries to be implemented l-cloud-integration Enso Cloud integration work

Comments

@radeusgd
Copy link
Member

Currently there's no way to create a datalink from Enso code.

It is not only useful for users and library creators but it is also needed so that our datalink tests could be made self-sufficient, not expecting an existing setup on the test account.

@radeusgd radeusgd added -libs Libraries: New libraries to be implemented l-cloud-integration Enso Cloud integration work labels Apr 10, 2024
@radeusgd radeusgd self-assigned this Apr 10, 2024
@radeusgd
Copy link
Member Author

I've already adapted our data link tests to create the datalinks themelves... but I forgot it's not yet possible:

Index: test/Base_Tests/data/datalinks/example-enso-file.datalink
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/test/Base_Tests/data/datalinks/example-enso-file.datalink b/test/Base_Tests/data/datalinks/example-enso-file.datalink
--- a/test/Base_Tests/data/datalinks/example-enso-file.datalink	(revision 113524b039474a92844622232e9572b30f26f248)
+++ b/test/Base_Tests/data/datalinks/example-enso-file.datalink	(date 1712768831228)
@@ -1,5 +1,5 @@
 {
     "type": "Enso_File",
     "libraryName": "Standard.Base",
-    "path": "enso://PLACEHOLDER_ORG_NAME/test-directory/another.txt"
+    "path": "enso://PLACEHOLDER_ORG_NAME/PLACEHOLDER_PATH"
 }
Index: test/Base_Tests/src/Network/Enso_Cloud/Cloud_Data_Link_Spec.enso
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/test/Base_Tests/src/Network/Enso_Cloud/Cloud_Data_Link_Spec.enso b/test/Base_Tests/src/Network/Enso_Cloud/Cloud_Data_Link_Spec.enso
--- a/test/Base_Tests/src/Network/Enso_Cloud/Cloud_Data_Link_Spec.enso	(revision 113524b039474a92844622232e9572b30f26f248)
+++ b/test/Base_Tests/src/Network/Enso_Cloud/Cloud_Data_Link_Spec.enso	(date 1712769039360)
@@ -11,24 +11,40 @@
 
 import project.Network.Enso_Cloud.Cloud_Tests_Setup.Cloud_Tests_Setup
 
-add_specs suite_builder setup:Cloud_Tests_Setup = setup.with_prepared_environment <|
+type Temporary_Directory
+    Value ~get
+
+    make -> Temporary_Directory = Temporary_Directory.Value <|
+        name = "test-run-Data_Link-"+(Date_Time.now.format "yyyy-MM-dd_HHmmss.fV" . replace "/" "|")
+        root = Panic.rethrow <| Enso_File.root.create_directory name
+
+        Panic.rethrow <| Data_Link_Format.write_raw_config (root / "TestDataLink-HTTP.datalink") http_data_link_content
+        Panic.rethrow <| Data_Link_Format.write_raw_config (root / "TestDataLink-S3.datalink") s3_data_link_content
+        my_target_enso_file = "Hello Enso Cloud File!".write (root / "my-file.txt")
+        Panic.rethrow <| Data_Link_Format.write_raw_config (root / "TestDataLink-EnsoFile.datalink") (enso_file_data_link_content.replace "<PATH>" my_target_enso_file.path)
+
+        root
+
+    cleanup self = self.get.delete_if_exists
+
+add_specs suite_builder setup:Cloud_Tests_Setup =
     suite_builder.group "DataLinks in Enso Cloud" pending=setup.real_cloud_pending group_builder->
+        test_root = Temporary_Directory.make
+        group_builder.teardown test_root.cleanup
+
         group_builder.specify "should be able to access an example HTTP data-link" <|
-            ## We assume that the cloud has a sample data-link called `TestDataLink` present
-               TODO in future iterations this file will be created by the test suite itself, to make it self-contained
-            assets = Enso_File.root.list
-            datalink = assets.find a-> a.name.starts_with "TestDataLink-HTTP"
+            datalink = test_root.get / "TestDataLink-HTTP.datalink"
             datalink.should_be_a Enso_File
             datalink.asset_type.should_equal Enso_Asset_Type.Data_Link
 
-            # We assume that the datalink points to https://raw.githubusercontent.com/enso-org/enso/develop/test/Base_Tests/data/sample.txt
-            r = datalink.read
-            r.should_be_a Text
-            r.should_contain "Cupcake"
+            Test.with_retries <|
+                # We assume that the datalink points to
+                r = datalink.read
+                r.should_be_a Text
+                r.should_contain "Cupcake"
 
         group_builder.specify "will report which library is missing if a datalink relying on other library is accessed" <|
-            assets = Enso_File.root.list
-            datalink = assets.find a-> a.name.starts_with "TestDataLink-S3"
+            datalink = test_root.get / "TestDataLink-S3.datalink"
             datalink.should_be_a Enso_File
             datalink.asset_type.should_equal Enso_Asset_Type.Data_Link
 
@@ -44,14 +60,12 @@
                 Data_Link_Format.read_raw_config temp_file
 
         group_builder.specify "should be able to read a local datalink to an Enso File" <|
-            datalink = replace_org_name_in_data_link (enso_project.data / "datalinks" / "example-enso-file.datalink")
-            datalink.read . should_equal "Hello Another!"
+            datalink = replace_placeholder_path (enso_project.data / "datalinks" / "example-enso-file.datalink") (test_root.get / "my-file.txt")
+            datalink.read . should_equal "Hello Enso Cloud File!"
 
         group_builder.specify "should be able to read a datalink in the Cloud to Enso File" <|
-            # TODO currently this link is created manually, later we should be generating it as part of the test
-            datalink = Enso_File.new "enso://"+Enso_User.current.organization_name+"/TestDataLink-EnsoFile"
-            datalink.read . should_equal "Hello Another!"
-
+            datalink = Enso_File.new test_root.get.path+"/TestDataLink-EnsoFile.datalink"
+            datalink.read . should_equal "Hello Enso Cloud File!"
 
 main filter=Nothing =
     setup = Cloud_Tests_Setup.prepare
@@ -61,9 +75,34 @@
 
 
 ## Reads the datalink as plain text and replaces the placeholder organization name.
-replace_org_name_in_data_link base_file =
-    content = Data_Link_Format.read_raw_config base_file
-    org_name = Enso_User.current.organization_name
-    new_content = content.replace "PLACEHOLDER_ORG_NAME" org_name
-    temp_file = File.create_temporary_file prefix=base_file.name suffix=base_file.extension
+replace_placeholder_path datalink_file target_file =
+    content = Data_Link_Format.read_raw_config datalink_file
+    new_content = content.replace "enso://PLACEHOLDER_ORG_NAME/PLACEHOLDER_PATH" target_file.path
+    temp_file = File.create_temporary_file prefix=datalink_file.name suffix=datalink_file.extension
     Data_Link_Format.write_raw_config temp_file new_content replace_existing=True . if_not_error temp_file
+
+http_data_link_content = """
+    {
+        "type": "HTTP",
+        "libraryName": "Standard.Base",
+        "method": "GET",
+        "uri": "https://raw.githubusercontent.com/enso-org/enso/develop/test/Base_Tests/data/sample.txt"
+    }
+
+s3_data_link_content = """
+    {
+      "type": "S3",
+      "libraryName": "Standard.AWS",
+      "uri": "s3://enso-data-samples/examples/folder 2/hello.txt",
+      "auth": {
+        "type": "aws_auth",
+        "subType": "default"
+      }
+    }
+
+enso_file_data_link_content = """
+    {
+        "type": "Enso_File",
+        "libraryName": "Standard.Base",
+        "path": "<PATH>"
+    }

The goal of this ticket would be to apply this patch and ensure it actually works - we need to intercept a with_output_stream that targets a .datalink and ensure it instead performs a different POST request - to the create_connector endpoint instead of upload_file.

@jdunkerley jdunkerley moved this from ❓New to 📤 Backlog in Issues Board Apr 16, 2024
@radeusgd radeusgd changed the title Creating datalinks programmatically Creating datalinks in Enso Cloud programmatically Apr 16, 2024
@radeusgd radeusgd moved this from 📤 Backlog to ⚙️ Design in Issues Board May 9, 2024
@radeusgd radeusgd moved this from ⚙️ Design to 🔧 Implementation in Issues Board May 9, 2024
@enso-bot
Copy link

enso-bot bot commented May 13, 2024

Radosław Waśko reports a new STANDUP for the provided date (2024-05-09):

Progress: Work on creating datalinks programmatically: updated the tests. Added the logic for creating datalink in Enso Cloud. Debugging to make it work. Work on types: learning details of method resolution, thinking how to replicate the logic in static passes. It should be finished by 2024-05-14.

Next Day: Next day I will be working on the same task. Fix the datalink creation logic. Add a method to save a datalink to Postgres connection.

@enso-bot
Copy link

enso-bot bot commented May 14, 2024

Radosław Waśko reports a new STANDUP for yesterday (2024-05-13):

Progress: Debugging datalink creation. Got it fixed finally. Found a problem with wrong logic when parsing responses from cloud that went undetected because dataflow error was swallowed. Fixed the problem and ensured propagation in that case. Reported #9934. Got the tests passing with now no setup needed on cloud side - a step towards being able to run the Cloud tests on a CI. Implemented logic for saving Postgres connection as a datalink, promoting a plaintext password to a secret. It should be finished by 2024-05-14.

Next Day: Next day I will be working on the same task. Test the Postgres save-as-datalink logic. Put up a PR. Start next tasks.

@enso-bot
Copy link

enso-bot bot commented May 15, 2024

Radosław Waśko reports a new STANDUP for yesterday (2024-05-14):

Progress: Debugging remaining issues in the PR. Fixed error propagation in JS_Object.from_pairs. Fixed reading raw datalink data from Cloud. Fixed datalink metadata getters. PR ready. It should be finished by 2024-05-14.

Next Day: Next day I will be working on the #9952 task. Start work on next tasks. Create PR for cloud path resolver update.

@radeusgd radeusgd moved this from 🔧 Implementation to 👁️ Code review in Issues Board May 15, 2024
@mergify mergify bot closed this as completed in #9957 May 16, 2024
mergify bot pushed a commit that referenced this issue May 16, 2024
- Closes #9673
- Adds the ability to save an existing Postgres connection as a datalink into the Enso Cloud, automatically promoting plain-text passwords into a Secret.
- Fixes dataflow error propagation in `JS_Object.from_pairs`.
@github-project-automation github-project-automation bot moved this from 👁️ Code review to 🟢 Accepted in Issues Board May 16, 2024
vitvakatu pushed a commit that referenced this issue May 17, 2024
- Closes #9673
- Adds the ability to save an existing Postgres connection as a datalink into the Enso Cloud, automatically promoting plain-text passwords into a Secret.
- Fixes dataflow error propagation in `JS_Object.from_pairs`.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
-libs Libraries: New libraries to be implemented l-cloud-integration Enso Cloud integration work
Projects
Archived in project
Development

Successfully merging a pull request may close this issue.

1 participant