Neo4J and Azure and VS2012 and Windows 8

Now, I know that this has been written about, but both of the main places (http://www.richard-banks.org/2011/02/running-neo4j-on-azure.html and http://blog.neo4j.org/2011/02/announcing-neo4j-on-windows-azure.html) utilise VS2010, and well, I’m on VS2012 and Windows 8. Not that I think Win 8 had anything to do with it really, anyhews!

I’m going to begin from the beginning, this is my first foray into running something on Azure, so it’s been a bit of a learning curve. But luckily the Neo4J guys have got us started, so let’s download the VS2010 solution: http://neo4j.org/get?file=Neo4j.Azure.Server.zip

OK, the other thing we’ll need is the VS2012 Azure SDK, so let’s get that as well: http://www.windowsazure.com/en-us/develop/downloads/ (I just did the full install).

Now, unzip the VS2010 solution and let’s open it in VS2012:

<your location>\Neo4j.Azure.Server\Neo4j.Azure.Server.sln

One-way-upgrade? Yer! Ignore the migration report – we don’t care!

Let’s build that sucker… Ahhh 14 errors…

WindowsAzure does not exist in the namespace ‘Microsoft’

Not a problem right? We’ve installed the SDK, just need to update the references:

We can ignore the Test projects, they don’t use Azure, we’re interested in the other projects, so what we’ll do is remove the broken references, and add the correct ones, so expand the references bit of each project:

image

hunt out those yellow exclamation marks, and delete them! You’ll need to add the right ones back in (listed below), when you go to the ‘Add Reference’ dialog

image

make sure you have ‘Assemblies’ and ‘Framework’ selected before you seach (and search for ‘microsoft.win’ to narrow it down)

image

So the references you need for each project are:

  • CollectDiagnosticsData
    • Microsoft.WindowsAzure.Diagnostics
    • Microsoft.WindowsAzure.StorageClient
  • Diversify.WindowsAzure.ServiceRuntime
    • Microsoft.WindowsAzure.CloudDrive
    • Microsoft.WindowsAzure.ServiceRuntime
    • Microsoft.WindowsAzure.StorageClient

Right, so let’s build again… Sweet! No errors.

 

Now we need to setup our Blobs, I’m assuming you are using the most up-to-date Java you happened to have downloaded :) in my case that’s JRE7, and that is located in:

C:\Program Files (x86)\Java\jre7

So, zip up that folder into whatever you want to call it, I went with jre7.zip, and stuck it in a temp folder for now. In that same temp folder I also copied the neo4j zip I was using: neo4j-community-1.7.2-windows.zip

OK, now, we need to get these into our Blob storage, this is where a lot of stuff becomes unstuck - I didn’t find any applications that helped me use the blob storage, one would crash (because my internet speed is so slow) and the other just didn’t work – sure it looked like it had worked, but when push came to shove it didn’t.

So this is how I got my files into Blob (local first):

1. Run the ‘Storage Emulator’ (just search for that in the start menu)

2. That takes a little while to start up so fire up another instance of Visual Studio in the mean time, and create a new Console Application.

3. Manage Nuget Packages for that solution and add ‘Windows Azure Storage’

image

Now you’re set up to add the code:

public static void Main()
{
    CloudStorageAccount cloudStorageAccount = CloudStorageAccount.DevelopmentStorageAccount;
    CloudBlobClient client = cloudStorageAccount.CreateCloudBlobClient();
    client.Timeout = TimeSpan.FromMinutes(30);
    CloudBlobContainer container = client.GetContainerReference("neo4j"); //This will create it as well
 
    UploadBlob(container, "jre7.zip", "c:\\temp\\jre7.zip");
    UploadBlob(container, "neo4j-community-1.7.2-windows.zip", "c:\\temp\\neo4j-community-1.7.2-windows.zip");
}
 
private static void UploadBlob(CloudBlobContainer container, string blobName, string filename)
{
    CloudBlob blob = container.GetBlobReference(blobName);
 
    using (FileStream fileStream = File.OpenRead(filename))
        blob.UploadFromStream(fileStream);
}

This will upload the files to your local storage account (to switch to an Azure one, you’ll need to create a storage account, and use those credentials when you make your CloudStorageAccount above)

To test you’ve got them uploaded correctly, go to:

http://localhost:10000/devstoreaccount1/neo4j/jre7.zip

and you will hopefully download the zip file you just uploaded.

Now that those files are there, we are ready for some final configuration…

Right click on the Neo4jServerHost role in the Neo4j.Azure.Server cloud project:

image

Click on the ‘Settings’ tab and we’ll need to do some changes – by default, the 1.7.2 edition of neo4J unzips to:

neo4j-community-1.7.2

So, we need to update all the ‘neo4j-1.3.M02’ directories to be ‘neo4j-community-1.7.2’, we also need to update the Java runtime location, so we start with this:

image

and end with this:

image

Now, I also changed the Endpoints settings, to be HTTP (from TCP) and to have a port of 7410 (mainly because that’s straight down on the numpad)

image

The last ‘gotcha’ is some hard coded consts, which had me looking for ages, they are in the ‘ConfigSettings’ class of the ‘Neo4jServerHost’ project, and the ones we’re interested in are:

  • Neo4jFileName
  • JavaZipFileName

Change those both to what that should be.

OK

Nearly there (I promise)!

Run the ‘Compute Emulator’ (same deal with the Start menu), in your system tray you should have an Azure icon, when the compute emulator is up and running, right click on the icon and select ‘Show Compute Emulator UI’

image

The last steps!

Make sure the ‘Neo4j.Azure.Server’ cloud project is set up as the start project and let’s hit

F5

tension mounts, the build takes place (you need to accept the UAC warning) and VS does it’s stuff. If you look at the Compute Emulator UI you’ll see some log stuff (which you’ll need if this goes awry – but it won’t don’t worry!)

image

In a bit, the console and a Java window will pop up:

image

Then the console will bog off, leaving just the Java one, and if we switch back to the Compute Emulator UI and scroll up we should be able to see a line telling us the port number we’ve been assigned (in my case 7411):

image

(If you can’t see it, don’t worry.. press CTRL+A on the emulator, then CTRL+C, copy all the text and paste it into something like Notepad, then just do a Find for ‘port’ you’ll soon see it)

Go to your favourite browser, and head to: http://localhost:YOURPORT/

and you should see the WebAdmin!

See you on the cloud side hopefully!

PS Other gotchas!

OK, I’ve been caught out a couple of times:

  • I had an instance of Neo4J running as a service on my machine, the Azure instance wanted to run the https version of the server on the same port as the Service was running on, and so Java would complain that the port was already in use..
  • The first time I converted the project, it didn’t update the version of the Azure library to load, in the App.Config of the Neo4jServerHost project, and VS would throw an exception saying it couldn’t find the Azure dll version 1.0.0.0.

Print | posted @ Friday, August 24, 2012 4:13 AM

Comments on this entry:

Gravatar # re: Neo4J and Azure and VS2012 and Windows 8
by Raymond Tsang at 9/14/2012 5:38 AM

Great post Chris! I have been using Neo4j on my Azure worker roles, and I did some improvement to the original solution provided by the Neo4j guys.

I end up combining your stuff with mine and post it http://ideanotion.net/neo4j-and-azure-deployment-improvement/

The new solution works with Visual Studio 2010, 2012, uploads the binaries to Storage, connects to CloudDrive, exposes the endpoint, and fix a few JRE path issue when deployed on Azure.

Cheers,
Gravatar # re: Neo4J and Azure and VS2012 and Windows 8
by Pradeep at 3/30/2014 12:01 AM

I am not able to access neo4j from local laptop on azure windows server. How to connect from browser?
Gravatar # re: Neo4J and Azure and VS2012 and Windows 8
by Chris at 3/31/2014 11:42 AM

You'll probably need to expose an endpoint on your windows server to get this to work - *however* you will be exposing your server to ALL. I would (if I were you) remote to your local server and access it from there instead.
Post A Comment
Title:
Name:
Email:
Comment:
Verification: